対象を見る
CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 34/85。
transform.LookAt(point)は、オブジェクトの前方軸である青いz矢印がワールド内の位置を指すように、オブジェクトの向きを変えます。オブジェクトの位置は動かしません。このサーチライトは(0, 6, 0)にある塔の上にあり、(4, 0, 10)にあるゲートを照らします。
void Start()
{
transform.LookAt(new Vector3(4, 0, 10));
}ゲートはライトより低い位置にあるため、サーチライトは向きを変えるだけでなく、下向きにも傾きます。LookAtは、上や下も含めて、その位置をまっすぐ狙います。その後、transform.forwardはライトからゲートに向かう方向を指します。
Start()内で呼び出すと、LookAtは一度だけ狙いを定めます。Update()内で呼び出すと、毎フレーム狙い直すため、オブジェクトや目標位置が動いても、オブジェクトはその位置を向き続けます。引数は常に位置です。LookAt(Vector3.forward)は、オブジェクトがどこにあっても、ワールドの中心の隣にあるワールド座標(0, 0, 1)を狙います。
チャレンジ
中級ローバーが進む方向を向くようにしましょう。
Update()内のコメントの下にif (move != Vector3.zero)と書き、ローバーが停止しているときは向きを保つようにします。- その中で、
transform.LookAt(transform.position + move);を呼び出します。
「プレイ」を押して運転すると、ローバーの前面が進む方向を向きます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Rover : MonoBehaviour
{
public float speed = 3f;
void Update()
{
Vector3 move = Vector3.zero;
if (Input.GetKey(KeyCode.RightArrow)) move += Vector3.right;
if (Input.GetKey(KeyCode.LeftArrow)) move += Vector3.left;
if (Input.GetKey(KeyCode.UpArrow)) move += Vector3.forward;
if (Input.GetKey(KeyCode.DownArrow)) move += Vector3.back;
move = move.normalized;
transform.position += move * speed * Time.deltaTime;
// ローバーを進行方向に向ける
}
}
Unityスクリプトの基礎のすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド