событие триггера взгляда через n секунд - Unity - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть событие «указатель ввода», но я хочу, чтобы событие сработало только в том случае, если взгляд был активен на объекте в течение n секунд.

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

В любом случае, чтобы достичь этого?

Просто время ожидания не будет, поскольку оно все равно будет выполняться, а указатель останется заблокированным на объекте или нет.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вам вообще не нужно использовать указатель для этого события, но вместо этого просто используйте raycast.Преимущество такого подхода заключается в том, что вы также можете использовать его в сочетании с масками слоев, тегами или всем, что вы хотите использовать для идентификации группы объектов, и вам не нужно запускать pointerevent для каждого объекта, который вы хотите.ваш взгляд, чтобы работать с.Но вместо этого просто нужен один скрипт на вашем 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, когда это условие будет выполнено, оно изменит сцену.

0 голосов
/ 21 сентября 2018

Вы можете использовать логическую переменную для сохранения состояния, когда указатель вошел и вышел, установив для него значение 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;
    }
}
...