2016年7月31日日曜日

[Google VR][Unity]GazeInputModuleで注視しているボタンをクリックさせる

デフォルトだとタッチ操作が必要になる。環境によってはタッチ操作用の磁石がないので修正。
まずタイマー用の変数と、クリック動作させるかのパラメーターを追加。

    float clickTimer = 0f;
    float clickTimerMax = 1f;
    public float ClickTimer
    {
        get
        {
            return clickTimer;
        }

        set
        {
            clickTimer = value;
        }
    }
    public float ClickTimerMax
    {
        get
        {
            return clickTimerMax;
        }

        set
        {
            clickTimerMax = value;
        }
    }

    [SerializeField]
    bool GazeTimeClickMode;

あとはUpdateCurrentObjectを書き換えて、タイマーカウント終了時にExecuteEventsでクリックさせる。

    private void UpdateCurrentObject()
    {
        // Send enter events and update the highlight.
        var go = pointerData.pointerCurrentRaycast.gameObject;
        HandlePointerExitAndEnter(pointerData, go);
        // Update the current selection, or clear if it is no longer the current object.
        var selected = ExecuteEvents.GetEventHandler<ISelectHandler>(go);
        if (selected == eventSystem.currentSelectedGameObject)
        {
            ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, GetBaseEventData(),
                                  ExecuteEvents.updateSelectedHandler);
            if (GazeTimeClickMode && selected != null)
            {
                ClickTimer = ClickTimer - Time.fixedDeltaTime;
                if (ClickTimer <= 0f)
                {
                    pointerData.pointerPress =
                        ExecuteEvents.ExecuteHierarchy(go, pointerData, ExecuteEvents.pointerDownHandler)
                        ?? ExecuteEvents.GetEventHandler<IPointerClickHandler>(go);
                    ExecuteEvents.Execute(pointerData.pointerPress
                        , pointerData, ExecuteEvents.pointerClickHandler);
                    ClickTimer = ClickTimerMax;
                }
            }
        }
        else
        {
            ClickTimer = ClickTimerMax;
            eventSystem.SetSelectedGameObject(selected, pointerData);
        }
    }

調べるのが大変だった・・・