9

当设置为时,我正在尝试使用第一人称控制器与世界空间 UI交互。Cursor.lockStateCursorLockMode.Locked

世界空间用户界面和角色 世界空间用户界面和角色

但是当光标被锁定时,光标位置设置为(-1, -1) ,这是从Inspector告知的。

(-1, -1) 的光标位置 (-1, -1) 的光标位置

EventSystem.RaycastAll我使用,Sreen.width/2和执行了图形光线投射PointerEventDataEventSystem.current.RaycastAll收集屏幕中间的所有 UI 对象,但不向它们发送任何事件。

我还尝试ExecuteEvents.Execute<IEventSystemHandler>手动将事件发送到 UI 目标。当我向它发送“提交”事件时,这适用于按钮。显然这不是一个优雅的解决方案。我也不知道如何向滑块发送消息。

// manully send a 'submit' event to UI elements
List<RaycastResult> results = new List<RaycastResult>();
void Update() {
    if (Input.GetButtonUp("Fire1")) {
        PointerEventData data = new PointerEventData(EventSystem.current);
        data.position = new Vector2(Screen.width / 2, Screen.height / 2);
        EventSystem.current.RaycastAll(data, results);
        foreach (var result in results) {
            ExecuteEvents.ExecuteHierarchy<ISubmitHandler>(
                result.gameObject, data,
                ExecuteEvents.submitHandler
            );
        }
    }
}

这种疯狂的尝试在 Windows 上全屏播放时有效。2333

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SetCursorPos ( int x , int y );
void SetCursorPositionToCenter()
{
  SetCursorPos(Screen.width/2, Screen.height/2);
}

相关资源

4

3 回答 3

1

我在使用 Graphics Raycaster 和 Global UI 元素时也遇到了很多问题。我也尝试了很多东西,但事件系统似乎不起作用。但是我正在模拟带有触摸板的鼠标,也许我没有完全模拟鼠标如何与 UI 元素一起工作。

我最终放弃了图形光线投射器,而是为所有 UI 元素添加了一个盒子碰撞器。这样,普通的物理射线投射器就能够检测到它并运行一些代码。对于滑块,它只是随着指针的 x 或 y 增加而增加滑块的值。

希望这有所帮助。

于 2018-07-27T18:29:47.920 回答
1

您对提交处理程序所做的事情类似于可以完成的许多不同方式。我没有专门处理滑块,因为在这种方法中控制滑块不是很容易(播放器控制器,或者,在 VR 的情况下,用户的头部,不能很好地做直线)。因此,对于滑块输入,我们通常使用 +/- 按钮。另一个想法可能是,当用户指向 UI 元素时,您在单击时释放 cursorLock。当点击被释放时,您可以恢复光标锁定。

UI 元素也经常需要诸如悬停/onEnter、onExit 等状态,有时指针向上,通常指针向下。所以我们经常为此使用 Selectable 类。我认为所有可交互的 UI 元素都继承自此,因此它是访问 UI 元素的好地方。这通常会触发正确的事件,但可能有点棘手。检查许多现成的注视输入系统中的一些,因为它们正在做同样的事情。不过,我认为我从未见过一个手柄滑块(它们通常用于 VR,而凝视到滑块的控制将是糟糕的 UX)。

干杯和好运!

于 2020-07-30T18:40:36.227 回答
0

如果您尝试在不影响游戏玩法的情况下访问 UI 元素,您可以简单地设置Time.TimeScale = 0;基本上暂停时间但 UI 元素仍将处于活动状态。然后只需解锁您的光标并自由使用它。

于 2019-12-12T20:33:46.860 回答