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

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

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


person g.k    schedule 30.12.2019    source источник


Ответы (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 этим компонентом и установите желаемое время задержки. Затем он автоматически вызовет событие onClick после того, как останется сфокусированным на время пребывания.


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

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.


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

person derHugo    schedule 30.12.2019
comment
Спасибо за помощь, я сделал что-то вроде этого. но для вашего решения я имею в виду, что это может работать для кнопки, но тогда мне придется расширять каждый объект, которому требуется такое поведение? я мог бы использовать сопрограммы (в настоящее время я использую метод обновления) - person g.k; 07.01.2020
comment
@Vahakn Конечно, вместо этого вы могли бы просто реализовать компонент, который вы помещаете рядом с кнопкой, и вместо этого вызывать только GetComponent<Button>.onClick.Invoke();. Добавил как обновление - person derHugo; 07.01.2020