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 はどちらでも同じ意味です。
チャレンジ
中級プレイヤーとその名前タグは、どちらも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);
}
}
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。