C# 如何确定用户是否关注GUI元素?(HoloLens Unity.EventSystem代码等效) bool clickingGuiElement=false; if(UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject()) { if(UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject!=null) { 如果(UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject .GetComponent()!=null) { //用户正在单击UI元素(按钮) 单击guielement=true; } 其他的 单击guielement=false; } 其他的 单击guielement=false; } 其他的 单击guielement=false;

C# 如何确定用户是否关注GUI元素?(HoloLens Unity.EventSystem代码等效) bool clickingGuiElement=false; if(UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject()) { if(UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject!=null) { 如果(UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject .GetComponent()!=null) { //用户正在单击UI元素(按钮) 单击guielement=true; } 其他的 单击guielement=false; } 其他的 单击guielement=false; } 其他的 单击guielement=false;,c#,user-interface,unity3d,hololens,C#,User Interface,Unity3d,Hololens,上面的代码使用Unity的EventSystem。这个小控件结构用于处理当前单击的对象。它完成了设置布尔值的任务,以通知程序用户是否正在单击UI元素。在我的例子中,它主要用于按钮。使用此布尔输出可以阻止UI点击在UI中传播,并阻止与UI后面的任何游戏对象进行交互 在带有断点和/或打印输出的全息透镜上运行上述代码,结果总是相同的-false。该程序从来没有进入全息透镜上的第一个if语句 我需要能够检测用户在单击时,airtap/clicker输入是否在UI元素上。如果我知道用户何时单击UI元素,我

上面的代码使用Unity的EventSystem。这个小控件结构用于处理当前单击的对象。它完成了设置布尔值的任务,以通知程序用户是否正在单击UI元素。在我的例子中,它主要用于按钮。使用此布尔输出可以阻止UI点击在UI中传播,并阻止与UI后面的任何游戏对象进行交互

在带有断点和/或打印输出的全息透镜上运行上述代码,结果总是相同的-false。该程序从来没有进入全息透镜上的第一个if语句

我需要能够检测用户在单击时,airtap/clicker输入是否在UI元素上。如果我知道用户何时单击UI元素,我可以阻止它在UI中传播(如上所述,但它在编辑器中工作,而不是在全息透镜上)

那么,是什么替代了HoloLens在这里(编辑器中)实现的相同EventSystem功能呢


另外,我在代码的其他部分使用了UnityEngine.EventSystems中的IPointerClickerHandler,它工作得很好,所以我不确定为什么这个使用EventSystems的实现不起作用。我的最佳猜测(从编辑器和全息镜头中实现的功能来看)是IsPointerOverGameObject中使用的“指针”没有使用类似于鼠标点击输入的airtap输入。

您的UI元素需要有一个碰撞器,并且您需要使用光线投射来检测您的UI元素是否被光线投射击中。在全息镜头中,我所知道的检测元素或游戏对象被击中的唯一方法是使用凝视

编辑:在澄清问题后,您需要确保光线投射能够命中的图层仅是按钮所在的层

问题是关于检测按钮是否被点击的问题,这些评论使人们对整个问题有了更多的了解,但问题的性质是从提问者对其他系统的体验的角度提出的,而不是从理解Hololens和Unity如何协同工作的角度提出的,给出你想要的答案是不可能的,因为这是一个错误的问题。unity中的所有内容本质上都是一个游戏对象,但它们都可以同时位于场景中的不同层和多个层上,您可以看到unity中右上角的层。解决此问题的答案是指定按钮所在的层,该层不与其他游戏对象共享,这不是Unity中的默认行为。在执行光线投射时,需要忽略所有其他层,然后将不再与按钮后面的背景对象交互。我包含的链接告诉您如何做到这一点。一旦你这样做了,你就会像其他游戏对象一样使用连接到按钮的airtap事件

下面是一个关于如何在Unity中使用层的链接

最终没有找到与EventSystem代码等效的代码,但是在Microsoft提供的HoloToolkit中提供的“GazeManager”脚本中有一个简单的解决方案

利用上面这样一个简单的检查,可以确定用户的目光是否在GUI元素上。这样,

if(GazeManager.Instance.IsGazingAtObject && GazeManager.Instance.HitObject != null)
{
    Debug.Log("guiElementName: " + GazeManager.Instance.HitObject.transform.name);
}
//对象分配
游戏对象光标;
//基于GUI的菜单控件结构
if(GazeManager.Instance.IsGazingAtObject&&GazeManager.Instance.HitObject!=null&&
(GazeManager.Instance.HitObject.transform.name==“图标”||
GazeManager.Instance.HitObject.transform.name==“GUI管理器”))
{
//鳞片
cursor.transform.localScale=半比例;
//将光标移动到光线投射命中的点
//在gui元素上显示它
cursor.transform.position=GazeManager.Instance.HitInfo.point;
//启用光标网格
cursor.GetComponent().enabled=true;
}
不言自明,当用户注视着它时,上面的代码会在GUI上缩放、移动和显示光标游戏对象

在我的例子中,[我使用]布尔输出[来自EventSystem代码,试图]阻止UI点击在UI中传播并与UI后面的任何游戏对象交互


当用户凝视UI元素时,可以使用GazeManager正确地处理用户凝视输入,而不是阻止点击。

您是否尝试过IsPointerOverGameObject(1)?@Everts是,否。它实际上可能是0。您还应确保HololensInputModule正确运行。@Everts Hololens Input和Hololens Input Module在场景中均已启用并处于活动状态。我几乎可以肯定输入没有问题,因为我可以在全息镜头上接收和使用输入。我用过语音、导航手势、空中敲击等等。问题是,尽管Air-Tap正在工作,但我需要检测它是否在GUI元素上。如您所知,如果是,请不要让调用通过UI传播到它后面的游戏对象上。@Everts IsPointerOverGameObject(0)也不会产生所需的行为,应该注意。我不能说这是否有效,而是使用手部检测实现了不同的解决方法“在问题得到澄清后,您需要确保光线投射能够击中的层仅是您的臀部
if(GazeManager.Instance.IsGazingAtObject && GazeManager.Instance.HitObject != null)
{
    Debug.Log("guiElementName: " + GazeManager.Instance.HitObject.transform.name);
}
// 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;
}