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 の意味はどちらでも同じです。
チャレンジ
中級毎フレーム、ネームタグがプレイヤーの真上にぴったり表示されるようにしましょう。
- すべてのスクリプトの
Update()の後に実行されるvoid LateUpdate()を追加します。 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プレイグラウンド