Menu
CoddyTech

UpdateとLateUpdate

CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 71/85。

各フレームで、Unity はすべてのスクリプトの Update() を呼び出し、すべてのスクリプトの処理が終わってから、すべてのスクリプトの LateUpdate() を呼び出します。どのオブジェクトの Update() が先に実行されるかは、自分では決められません。

これは、ほかのものに続いて動作するものでは重要です。Update() でプレイヤーの位置をコピーするカメラは、プレイヤー自身の Update() がプレイヤーを動かす前に実行される場合があり、そのときはカメラが1フレーム前のプレイヤーの位置をコピーします。その結果、カメラは一歩遅れて追従し、オブジェクトの追加やシーンの再読み込みによって、そうなるかどうかが変わることがあります。LateUpdate() なら、コピーは常にプレイヤーが移動した後に行われます。

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);

void LateUpdate()
{
    transform.position = player.position + offset;
}

ルールはこうです。Update() でオブジェクトを動かし、カメラ、ラベル、照準など、オブジェクトの移動後の位置に反応するコードは LateUpdate() に置きます。どちらも1フレームに1回実行され、Time.deltaTime の意味はどちらでも同じです。

challenge icon

チャレンジ

中級

毎フレーム、ネームタグがプレイヤーの真上にぴったり表示されるようにしましょう。

  1. すべてのスクリプトのUpdate()の後に実行されるvoid LateUpdate()を追加します。
  2. if (target != null)の部分をその中に移動し、Update()にはif (target == null)の下に矢印キーでの移動だけを残します。

「プレイ」を押して矢印キーを押し続けます。タグがプレイヤーの真上に表示されます。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

public class Mover : MonoBehaviour
{
    public Transform target;
    public Vector3 offset;
    public float speed = 4f;

    void Update()
    {
        if (target != null)
        {
            transform.position = target.position + offset;
        }
        else
        {
            if (Input.GetKey(KeyCode.RightArrow))
            {
                transform.position += new Vector3(speed * Time.deltaTime, 0, 0);
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                transform.position -= new Vector3(speed * Time.deltaTime, 0, 0);
            }
        }
    }
}

Unityスクリプトの基礎のすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド