ローカル空間とワールド空間
CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 26/85。
オブジェクトには、ワールドの方向だけでなく、オブジェクト自身の方向もあります。transform.forwardはオブジェクトの先端が向いている方向(UnityのSceneビューに表示される青い矢印)で、長さが1単位のワールドベクトルとして表されます。transform.rightとtransform.upは、それぞれオブジェクト自身の右方向と上方向です。オブジェクトを回転させると、これらの方向も一緒に回転します。この紙飛行機はシーン内でy軸を中心に90度回転しているため、向いている方向に、ワールドのx軸に沿って飛びます。
public float speed = 4f;
void Update()
{
transform.position += transform.forward * speed * Time.deltaTime;
}transform.Translate(Vector3.forward * speed * Time.deltaTime)も同じ動作をします。Translateは、渡されたベクトルをオブジェクト自身の座標系で解釈するためです。この場合、Vector3.forwardはオブジェクトの前方向を意味します。第2引数にSpace.Worldを渡すと、代わりにワールドの軸が使われます。そのため、transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World)は、紙飛行機がどちらを向いていてもワールドのz軸に沿って移動します。
transform.Rotateも、オブジェクト自身の軸を中心に回転します。上から見ると、y軸を中心とする正の角度は、直立したオブジェクトを右に回転させ、負の角度は左に回転させます。それに合わせて、オブジェクトのtransform.forwardも回転します。
チャレンジ
簡単タンクに戦車のような操作を与えましょう。その場で旋回し、向いている方向へ進みます。
Update()内で、右矢印キーが押されている間はtransform.Rotate(0, turn * Time.deltaTime, 0);を実行し、左矢印キーの場合は-turnを使います。- 上矢印キーが押されている間は、
transform.Translate(Vector3.forward * speed * Time.deltaTime);を実行します。
「プレイ」を押して、旋回して進みましょう。タンクは先端が向いている方向へ進みます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Tank : MonoBehaviour
{
public float speed = 3f;
public float turn = 90f;
void Update()
{
// 右・左矢印キー:y軸を中心に旋回。上矢印キー:戦車が向いている方向に進む。
}
}
Unityスクリプトの基礎のすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド