n秒后凝视触发事件-Unity

时间:2018-09-21 10:55:56

标签: c# unity3d virtual-reality

我有一个'pointer enter'事件,但是我只希望该事件在注视对象上活动了n秒钟时触发。

public void PointerEnter() {
   // change scene if the gaze point have been active for n seconds.
}

有什么办法实现吗?

只有超时不会执行,因为它仍然会执行,而指针仍会锁定在对象上。

2 个答案:

答案 0 :(得分:3)

通过将布尔值设置为true和false,可以使用布尔变量保持指针进入和退出的状态。然后可以在Update函数中检查此布尔变量。当其为true时,启动一个计时器,如果在计时器期间变为false,则将计时器重置为0。检查计时器是否超过x秒,然后加载新场景。

下面的示例假定指针指向时调用PointerEnter,而指针不再指向PointerExit。根据您所使用的VR插件的不同,功能可能会有所不同,但其余代码相同。

const float nSecond = 2f;

float timer = 0;
bool entered = false;

public void PointerEnter()
{
    entered = true;
}

public void PointerExit()
{
    entered = false;
}

void Update()
{
    //If pointer is pointing on the object, start the timer
    if (entered)
    {
        //Increment timer
        timer += Time.deltaTime;

        //Load scene if counter has reached the nSecond
        if (timer > nSecond)
        {
            SceneManager.LoadScene("SceneName");
        }
    }
    else
    {
        //Reset timer when it's no longer pointing
        timer = 0;
    }
}

答案 1 :(得分:1)

您根本不需要为此使用指针事件,而只需使用简单的raycast。这种方法的优点是,您还可以将其与图层蒙版,标签或您要用于标识一组对象的其他任何对象结合使用,并且不需要在每个想要的对象上运行指标事件与您共事。但是相反,您的VRhead或raycaster上只需要一个脚本即可。

在我的示例中,我将使用图层蒙版。这将使凝视对同一层中的任何对象(例如“ uiButton”)起作用

public sceneIndex = 0; //build index of the scene you want to switch to

private Ray ray;
private RaycastHit hit;
[serializefield]
private LayerMask myMask;//serializing it will give a dropdown menu in the editor to select the mask layer form, can also use int to select the layer

private readonly float rayLength = 10;
private readonly float timerMax = 5f; //Higher timerMax is a longer wait, lower timerMax is shorter...
private float timer = 0f;

private void Update()
{
    ray = Camera.main.ViewportPointToRay(Vector3.forward);
    if (Physics.Raycast(ray, out hit, rayLength, myMask))
    {
        timer += Time.deltaTime;
        if(timer >= timerMax)
        {
            SceneManager.LoadScene(sceneIndex);//load the scene with the build index of sceneIndex
        }
    }
    else
    {
        timer = 0;
    }
}

只要您查看光线投射器长度内与myMask timer处于同一层的对象,当该对象大于或等于timerMax时,它将不断增加满足条件将改变场景。