我有一个'pointer enter'事件,但是我只希望该事件在注视对象上活动了n秒钟时触发。
public void PointerEnter() {
// change scene if the gaze point have been active for n seconds.
}
有什么办法实现吗?
只有超时不会执行,因为它仍然会执行,而指针仍会锁定在对象上。
答案 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
时,它将不断增加满足条件将改变场景。