当Cursor.lockState
设置为CursorLockMode.Locked
时,我尝试使用第一人称控制器与世界空间用户界面进行互动。< / p>
world space UI and a character
但是当光标锁定时,光标位置设置为( - 1,-1), 这是从检查员告知的。
我使用EventSystem.RaycastAll
,Sreen.width/2
和PointerEventData
执行了图形光线投射。 EventSystem.current.RaycastAll
收集屏幕中间的所有UI对象,但不会向它们发送任何事件。
我还尝试ExecuteEvents.Execute<IEventSystemHandler>
手动向UI目标发送事件。当我发送&#39;提交&#39;它的事件。显然这不是一个优雅的解决方案。我不知道如何向滑块发送消息。
// 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);
}
答案 0 :(得分:0)
在使用Graphics Raycaster和Global UI元素时,我也遇到很多问题。我也尝试了很多事情,但事件系统似乎无法正常工作。但是我当时正在用触摸板模拟鼠标,也许我没有完全模拟鼠标如何与UI元素一起工作。
我最终放弃了图形raycaster,而是向所有UI元素添加了一个box collider。这样一来,常规的物理光线投射器就可以检测到它并运行一些代码。对于滑块,它只是随着指针的x或y的增加而增加滑块的值。
希望这会有所帮助。
答案 1 :(得分:0)
如果您尝试访问UI元素而不影响游戏玩法,则可以简单地设置desired <- df %>% group_by(year) %>% mutate(Count_TypeB = cumsum(Count_TypeB)) %>% mutate(Count_TypeA = cumsum(Count_TypeA))
,这基本上会暂停时间,但UI元素仍然处于活动状态。然后,只需解锁光标即可自由使用。
答案 2 :(得分:0)
您使用提交处理程序所做的事情与可以完成的许多不同方式相似。我没有专门讨论滑块,因为用这种方法控制滑块并不是很容易(播放器控制器,或者在VR的情况下,用户的头部不能很好地处理直线)。因此,对于滑块输入,我们通常使用+/-按钮。另一个想法可能是,当用户指向一个UI元素时,您在单击时释放了cursorLock。释放点击后,您可以恢复光标锁定。
UI元素通常也需要诸如hover / onEnter,onExit之类的状态,有时需要向上的指针,通常需要向下的指针。因此,我们经常为此使用Selectable类。我认为所有可交互的UI元素都继承自此,因此是从中访问UI元素的好地方。这通常会触发适当的事件,但可能会有些棘手。检查许多正在使用的注视输入系统是否在做相同的事情。我不认为我曾经见过一个手柄滑块(它们通常用于VR,注视滑块控件将是糟糕的UX)。
干杯,祝你好运!