есть ли режим только взгляда (в отличие от ввода щелчком / кнопкой) в unity3d google vr sdk?

Я использую Google VR SDK (для картона) в unity3d, но на картоне, который у меня есть, нет кнопок. Есть ли способ включить режим только взгляда, который рассматривает расширенный взгляд (несколько секунд) как нажатие кнопки? (я парень в обучающем видео сказал, что "вы можете включить режим только взгляда", но потом ничего не объяснил) это встроенная функция или мне нужно кодировать взаимодействие взгляда с нуля, чтобы добиться этого?

Я повсюду искал код, чтобы включить это не только общедоступные реквизиты, которые появляются в редакторе на различных префабах, доступных из демонстрационных сцен.

1 ответ

Я не знаю, как и есть ли для этого встроенный метод. Но вы можете легко построить расширение кнопки:

using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.UI;
#endif

public class DwellTimeButton : Button
{
    public float dwellTime = 0.5f;

    public override void OnPointerEnter(PointerEventData pointerEventData)
    {
        base.OnPointerEnter(pointerEventData);

        StartCoroutine (DwellTimeRoutine());
    }

    public override void OnPointerExit (PointerEventData pointerEventData)
    {
        base.OnPointerExit(pointerEventData);

        StopAllCoroutines ();
    }

    private IEnumerator DwellTimeRoutine ()
    {
        yield return new WaitForSeconds (dwellTime);

        onClick.Invoke();
    }

#if UNITY_EDITOR
    [CustomEditor (typeof (DwellTimeButton)]
    private class DwellTimeButtonEditor : ButtonEditor
    {
        SerializedProperty dwellTime;

        protected override void OnEnable()
        {
            base.OnEnable();

            dwellTime = serializedObject.FindProperty("dwellTime");
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            serializedObject.Update();

            EditorGUILayout.PropertyField(dwellTime);

            serializedObject.ApplyModifiedProperties();
        }
    }
#endif
}

Замените обычную кнопку Unity этим компонентом и установите желаемое значение dwellTime. Затем он автоматически вызовет событие onClick после того, как останется сфокусированным в течение dwellTime.


В качестве альтернативы без необходимости заменять кнопку везде, вы можете просто прикрепить этот компонент дополнительно к каждой кнопке:

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

[RequireComponent(typeof(Button))]
public class DwellTimeButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    [SerializeField] private Button button;

    public float dwellTime = 0.5f;

    private void Awake()
    {
        if (!button) button = GetComponent<Button>();
    }

    public  void OnPointerEnter(PointerEventData pointerEventData)
    {
        button.OnPointerEnter(pointerEventData);

        StartCoroutine(DwellTimeRoutine());
    }

    public  void OnPointerExit(PointerEventData pointerEventData)
    {
        button.OnPointerExit(pointerEventData);

        StopAllCoroutines();
    }

    private IEnumerator DwellTimeRoutine()
    {
        yield return new WaitForSeconds(dwellTime);

        button.onClick.Invoke();
    }
}

Это в основном то же самое, но вызывает onClick и другие мероприятия Button компонент вместо этого.


примечание: набрано на смартфоне, но я надеюсь, что идея прояснится

Другие вопросы по тегам