Unity3d 注视画布时显示按钮

Unity3d 注视画布时显示按钮,unity3d,unity5,oculus,virtual-reality,Unity3d,Unity5,Oculus,Virtual Reality,我正在使用OculusVR创建一个应用程序 我有一张画布,上面有许多按钮。我希望这些按钮只在用户俯视该区域时出现 当我凝视画布时,“光标”出现。但是,我需要能够在用户注视时激活按钮。我希望他们在那之前不可见 如何检测用户注视的事件,以便激活按钮 假设OculusVR与Unity的事件系统一起工作,您可以执行以下操作: 将图像添加到画布,不透明度设置为0,缩放它以适合整个画布。这将是您的触发元素,必须始终启用它,以便EventSystem.current.IsPointerOverGameObje

我正在使用OculusVR创建一个应用程序

我有一张画布,上面有许多按钮。我希望这些按钮只在用户俯视该区域时出现

当我凝视画布时,“光标”出现。但是,我需要能够在用户注视时激活按钮。我希望他们在那之前不可见


如何检测用户注视的事件,以便激活按钮

假设OculusVR与Unity的
事件系统一起工作,您可以执行以下操作:

图像
添加到
画布
,不透明度设置为0,缩放它以适合整个画布。这将是您的触发元素,必须始终启用它,以便
EventSystem.current.IsPointerOverGameObject
返回true

附加下面的脚本,将
画布
对象拖动到
目标
成员,将
图像
对象拖动到
触发器
成员

使用UnityEngine;
使用UnityEngine.EventSystems;
使用System.Collections.Generic;
公共类UITouch:单一行为{
/// 
///你的主画布
/// 
公共目标;
/// 
///必须保持活动状态才能使IsPointerOverGameObject为真的UI元素;
/// 
公共游戏对象触发器;
//每帧调用一次更新
无效更新(){
if(EventSystem.current.IsPointerOverGameObject())
{
foreach(在Target.Transform中转换子级)
{
child.gameObject.SetActive(true);
}
}
其他的
{
foreach(在Target.Transform中转换子级)
{   
//确保不要隐藏触发元件
如果(child.gameObject==触发器)继续;
child.gameObject.SetActive(false);
}
}
}
}

Raycast从相机中心开始。实际上,您需要创建一个计时器,如果鼠标/指针静止几秒钟,则可以激活凝视功能/方法。我不知道的是如何知道这幅画布正在被注视。如果它注视着一个按钮,则该按钮被单击。除了旋转器出现外,当你凝视画布时会发生什么?
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections.Generic;

public class UITouch : MonoBehaviour {

/// <summary>
/// Your main canvas
/// </summary>
public Canvas Target;

/// <summary>
/// A UI element that must remain active to make IsPointerOverGameObject true;
/// </summary>
public GameObject Trigger;

// Update is called once per frame
void Update () {
    if (EventSystem.current.IsPointerOverGameObject())
    {
        foreach(Transform child in Target.transform)
        {
            child.gameObject.SetActive(true);
        }
    }
    else
    {
        foreach (Transform child in Target.transform)
        {   
            // Make sure not to hide the triggering element
            if (child.gameObject == Trigger) continue;
            child.gameObject.SetActive(false);
        }
    }

}
}