0

我在unity3d中使用谷歌 VR SDK(用于纸板),但我拥有的纸板没有按钮。有没有办法启用仅注视模式,将延长注视(几秒钟)视为按钮单击?(我在一个教程视频中说“你可以启用仅注视模式”,但之后没有解释任何内容)这是一个内置功能还是我必须从头开始编写注视交互来实现这一点?

我到处搜索代码以启用此功能,不仅是在演示场景中可用的不同预制件上出现在编辑器上的公共道具。

4

1 回答 1

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 Button 并设置所需的驻留时间。然后,它会在保持对dwellTime 的关注后自动调用onClick 事件。


作为替代方案,无需在任何地方更换 Button,您只需将此组件附加到每个按钮上:

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


注意:在智能手机上输入,但我希望这个想法很清楚

于 2019-12-30T13:57:02.233 回答