Menu
CoddyTech

Update と LateUpdate

CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 56/67。

各フレームで 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

チャレンジ

中級

プレイヤーとその名前タグは、どちらもMoverスクリプトを実行します。Playerでは、targetが空なので、矢印キーでプレイヤーを動かします。NameTagでは、targetがプレイヤーなので、タグはプレイヤーのoffset分上に位置します。

Playを押して矢印キーを押し続けると、タグはプレイヤーの後を追います。ここでは、タグのUpdate()が先に実行され、1フレーム前のプレイヤーの位置をコピーします。タグが毎フレーム、プレイヤーの真上に来るように修正し、矢印キーによる移動はUpdate()内に残してください。その後、Checkを押します。

自分で試してみよう

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);
            }
        }
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityスクリプティングの基礎のすべてのレッスン