Unity UI - 当光标被锁定时如何与世界空间UI交互

9

Cursor.lockState设置为CursorLockMode.Locked时,我试图使用第一人称控制器世界空间UI交互。

世界空间UI和角色 世界空间UI和角色

但是当鼠标指针被锁定时,光标位置被设置为(-1,-1),这从检查器中得知。

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

我使用了EventSystem.RaycastAllSreen.width/2PointerEventData进行图形射线投射。 EventSystem.current.RaycastAll会收集屏幕中央所有UI对象,但是没有事件发送到它们。

我还尝试过对ExecuteEvents.Execute<IEventSystemHandler> 进行手动事件发送,当我向按钮发送“ submit”事件时,它有效。 很明显这不是一个优雅的解决方案。 我不知道如何向滑块发送消息。

// 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);
}

相关资源

3个回答

1
我在使用图形射线和全局UI元素时遇到了很多问题。我尝试了很多方法,但事件系统似乎无法正常工作。但是我正在用触摸板模拟鼠标,也许我没有完全模拟鼠标与UI元素的工作方式。
最终,我放弃了图形射线,改为给所有UI元素添加一个盒子碰撞器。这样,普通的物理射线检测器就能够检测到它并运行一些代码。对于滑块,只需随着指针的x或y增加而增加滑块的值。
希望这能有所帮助。

1
你使用的提交处理程序类似于许多其他方法。我没有专门处理滑块,因为用这种方法很难控制滑块(玩家控制器或在VR中,用户的头部无法很好地进行直线控制)。因此,对于滑块输入,我们通常使用+/-按钮。另一个想法可能是,当用户指向UI元素并单击时,释放cursorLock。当单击被释放时,您可以恢复cursor lock。
UI元素通常也需要像hover/onEnter、onExit、有时是指针向上,通常是指针向下这样的状态。因此,我们经常使用Selectable类来实现这一点。我认为所有可交互的UI元素都继承自它,所以从这里访问UI元素是一个好的选择。这通常会触发适当的事件,但可能有点棘手。检查一些现成的凝视输入系统,因为它们正在做同样的事情。我从未见过其中一个处理滑块(它们通常用于VR和凝视到滑块控制会导致糟糕的用户体验)。
祝你好运!

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接