如何确定用户目光是否在GUI元素上?(HoloLens Unity.Eventsystem代码同等)


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

最新更新