2016年8月21日日曜日

[Unity]AseetBundleで読み込んだ際に自作シェーダーが読み込まれない

いくつか他サイトでも紹介されてるけど、いきなり世界が紫色になってビビる。
開始後にシェーダーを再設定すればOK。AseetBundle使うとシェーダーの参照が壊れるとかなんとか。

        foreach (var uchar in UCharForReload)
        {
            Renderer[] mats = uchar.GetComponentsInChildren<Renderer>();
            foreach (var MaterialNow in mats)
            {
                foreach (var m in MaterialNow.materials)
                {
                    m.shader = Shader.Find(m.shader.name);
                }
            }
        }

で、これでOKかと思いきや、Android環境だとうまく動かんかった。
Always Include Shadersで設定すれば今くいくかも?また今度試してみよう
⇒設定したらOKでした

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);
        }
    }

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