エイリアンプログラム

主にゲームプログラミングに関するブログです。

Updateを使わずにコルーチンとAnimationCurveでGameObjectの移動処理を行う

Update関数でGameObjectの移動処理を行うことがありますが、正直私はメンバー変数やブロックが増える理由からあまりおススメしていません。
そこで今回は、一例としてコルーチンとAnimationCurveを使うことでUpdate関数を使わずにGameObjectの移動処理を行う方法をお伝えします。

    public AnimationCurve m_curve; //移動量
    public Vector3 m_targetPosition;    //移動先
    public float m_moveTime;   //到着時間
    public UnityEvent m_beginEvent; //移動前のイベント
    public UnityEvent m_exitEvent;  //移動後のイベント


    public IEnumerator MoveIE()
    {
        float currentTime = 0;

        //ベクトルの減算により移動先の向きと方向を求める
        Vector3 startPosition = this.transform.position;
        Vector3 position = m_targetPosition - startPosition;

        //移動開始前にm_beginEventを実行
        m_beginEvent.Invoke();

        while(currentTime < m_moveTime)
        {
            currentTime += Time.deltaTime;

            //現在の時間を到着時間を割って、移動値(0.0~1.0)を取得
            float scale = m_curve.Evaluate(currentTime / m_moveTime);

            //始点の座標と移動量をかけた向きと距離のベクトルを加算して代入
            this.transform.position = startPosition + (position * scale);

            yield return null;
        }

        //到着後にm_exitEventを実行
        m_exitEvent.Invoke();
    }


このソースコードについて説明しますと、到着時間までwhileを回しAnimationCurveの値を取得し続けています。 while文の中にyield return nullを入れることで1フレーム間隔で処理を繰り返してくれます。 取得したAnimationCurveの値を以下のように座標に代入することによって滑らかにGameObjectを移動させたり直線的に移動させることができます。

this.transform.position = startPosition + (position * scale);

更にwhile開始前と終了後にイベント関数(m_beginEvent、m_exitEvent)を入れることによって、正確にイベントを実行させることもできます。
なのでわざわざUpdate関数を使わなくても、ソースコードをごちゃごちゃさせずに移動処理を実行することができます。