как добавить таймер ввода взгляда, чтобы запускать действие после 3 секунд взгляда?

Я новичок в единстве и виртуальной реальности. Я использую Google Card SDK для создания VR-приложений в единстве и застрял на Gaztimer. Я хочу инициировать действие, только если пользователь смотрит на какой-либо объект в течение 3 секунд, но не смог этого сделать. Пожалуйста помоги


person sayal adhikari    schedule 18.02.2016    source источник
comment
обычно используйте Invoke и InvokeRepeating для таймеров в Unity. перейдите на forum.unity3d или gamedev для общего обсуждения техники.   -  person Fattie    schedule 18.02.2016


Ответы (2)


См. аналогичный вопрос и ответ здесь Используйте продолжительность ввода взглядом, чтобы выбрать текст пользовательского интерфейса в Google Cardboard

Таким образом, создайте скрипт для определения времени взгляда, кумулятивно добавляя Time.deltaTime к каждому кадру, когда на объект смотрят. Когда время взгляда достигает заранее заданной продолжительности, вызывается событие кнопки OnClick.

Активируйте на объекте функции синхронизации взгляда скрипта, используя триггеры событий Pointer Enter и Pointer Exit. Смотрите скриншот:

Триггеры событий кнопки

person Eugene Sia    schedule 28.11.2016

Камера VR обычно содержит основную камеру и камеры-глазки (правую и левую). Поскольку центральная точка основной камеры всегда будет центром глаз с точки зрения пользователя, вы можете использовать Raycast от ее transform.position до ее transform.forward и проверить, попадает ли она в ваш объект. Затем просто добавьте таймер, который будет вызывать действие после того, как оно достигнет установленной вами продолжительности.

Например:

using UnityEngine;
using System;

[RequireComponent(typeof(Collider))]
public class LookableObject : MonoBehaviour {

    [SerializeField]
    Transform cam; // This is the main camera.
    // You can alternately use Camera.main if you've tagged it as MainCamera

    [SerializeField]
    float gazeDuration; // How long it should be gazed to trigger the action

    public Action OnGazeAction; // Your object's action after being gazed

    Collider gazeArea; // Your object's collider

    float timer; // Gaze timer

    public void Start () {
        gazeArea = GetComponent<Collider> ();
    }

    public void Update () {
        RaycastHit hit;

        if (Physics.Raycast (cam.position, cam.forward, out hit, 1000f)) {
            if (hit.collider == gazeArea) {

                timer += Time.deltaTime;

                if (timer >= gazeDuration) {
                    if (OnGazeAction != null)
                        OnGazeAction ();
                }

            } else {
                timer = 0f;
            }
        } else {
            timer = 0f;
        }
    }
}

Надеюсь, вы уловили идею.

person dkrprasetya    schedule 24.08.2016
comment
это ужасный подход. если у вас есть 100 объектов в сцене, они будут выполнять 100 рейкастов за кадр. Вы можете по крайней мере подключить Physics Raycaster к основной камере и проверять попадание в каждый кадр. Но это именно то, что делает GazeInputModule Cardboard SDK. Я пришел сюда, потому что мне нужно настроить GazeInputModule, чтобы он отправлял команды OnPointerXXX объектам после синхронизированного взгляда. Пока не повезло... - person Nika Kasradze; 25.09.2016
comment
@NikaKasradze Это был просто пример использования raycast. Я бы предложил прикрепить рейкаст только к одному скрипту на вашей камере, потом вызывать делегата с объекта попадания, поэтому только 1 рейкаст на кадр. Но да, я думаю, что мой образец здесь немного вводит в заблуждение... позже я обновлю свой ответ. - person dkrprasetya; 29.09.2016