bool clickingGuiElement = false;
if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
{
if (UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject != null)
{
if (UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject
.GetComponent<CanvasRenderer>() != null)
{
// user is clicking on a UI element (button)
clickingGuiElement = true;
}
else
clickingGuiElement = false;
}
else
clickingGuiElement = false;
}
else
clickingGuiElement = false;
上面的代码正在利用Unity的事件系统。该小型控制结构的目的是处理当前单击的对象。它完成了设置布尔值的任务,以告知程序是否单击UI元素。就我而言,它主要用于按钮。使用此布尔输出,可以阻止UI点击通过UI传播并与可能在UI后面的任何游戏对象进行交互。
通过断点和/或打印输出在HoloLens上的上面的代码运行,结果始终相同 - false。该程序从未进入HoloLens上的第一个IF语句。
我需要能够检测用户是否在UI元素上进行airtap/clicker输入。如果我知道用户何时单击UI元素,则可以阻止它通过UI传播(如上所述,但同样,它在编辑器中而不是在HoloLens上起作用)。
>那么,是什么代替了HoloLens上(在编辑中)在此处实现的相同事件系统功能?
P.S。我正在使用unityEngine.Eventsystems中的其他部分中使用IPOInterClickerHandler,并且效果很好,因此我不确定为什么使用Eventsystems不起作用的实现此实现。我最好的猜测(从编辑器与HoloLens中实现功能)是,ISPOInteroverGameObject中使用的"指针"不使用airtap输入,类似于鼠标单击输入。
if(GazeManager.Instance.IsGazingAtObject && GazeManager.Instance.HitObject != null)
{
Debug.Log("guiElementName: " + GazeManager.Instance.HitObject.transform.name);
}
最终没有找到Eventsystem代码等效的内容,但是Microsoft提供的HolotoolKit中提供的" GazeManager"脚本中有一个简单的解决方案。
使用上面的简单检查,一个人能够确定用户是否凝视在GUI元素上。喜欢,
// Object assignment
GameObject cursor;
// If on GUI menu control structure
if (GazeManager.Instance.IsGazingAtObject && GazeManager.Instance.HitObject != null &&
(GazeManager.Instance.HitObject.transform.name == "icon" ||
GazeManager.Instance.HitObject.transform.name == "guiManager"))
{
// Scale
cursor.transform.localScale = halfScale;
// Move the cursor to the point where the raycast hit
// to display it on the gui element
cursor.transform.position = GazeManager.Instance.HitInfo.point;
// Enable the cursor mesh
cursor.GetComponent<MeshRenderer>().enabled = true;
}
自称确实,上面的代码刻度,移动并在用户凝视时在GUI上移动和显示一个光标。
在我的情况下[我使用了]布尔量输出[试图试图的事件系统代码]阻止ui点击通过UI传播并与UI后面的任何游戏对象进行交互。
然后,当凝视UI元素时,可以使用gazemanager。
您的UI元素需要具有对撞机,并且您需要使用Raycast来检测您的UI元素是否受到Raycast的击中。在HoloLens中,我知道发现元素或游戏对象的唯一方法是使用凝视。
编辑:澄清问题后,您需要确保射线播放能够点击的图层仅是您的按钮。
问题询问要检测是否单击一个按钮,并且评论对全部问题有了更多的了解,但是问题的性质是从该人的角度提出的,而不是从理解中询问问题的其他系统的经验关于Hololens和Unity如何共同努力,给您寻找的答案是不可能的,因为这是错误的问题。统一的所有内容本质上都是游戏对象,但是它们都可以同时坐在场景中的不同和多层上,您可以在右上角看到层的层。解决问题的答案是指定按钮所打开的层,并且该图层与其他游戏对象没有共享,而这些对象不是Unity中的默认行为。当您进行射线播放时,您需要忽略所有其他层,那么您将不再与按钮后面的背景对象进行交互。我包含的链接告诉您如何做到这一点。完成后,您将使用像其他任何游戏对象一样使用AirTap事件。
这是有关如何与Unity层一起工作的链接。
https://answers.unity.com/questions/416919/making-raycast-ignore-multiple-layers.html