オービットカメラ
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 46/63。
ある点の周りを回るには、角度を保持し、固定オフセットをその角度だけ回転させて、結果を点に加えます。ベクトルに回転を掛けると回転できます。Quaternion.Euler(0, angle, 0) * offsetはオフセットをy軸の周りに回転させ、長さと高さは変わりません。このカメラは、常に高さ3ユニット、距離6ユニットの位置から、毎秒20度の速さで像の周りを回ります。
public Transform statue;
public float speed = 20f;
float angle;
void LateUpdate()
{
angle += speed * Time.deltaTime;
Vector3 offset = new Vector3(0, 3, -6);
transform.position = statue.position + Quaternion.Euler(0, angle, 0) * offset;
transform.LookAt(statue);
}角度が0のとき、オフセットは(0, 3, -6)なので、カメラは像の後ろにあります。90のときは(-6, 3, 0)となり像の-x側に、180のときは(0, 3, 6)となり前方に位置します。カメラを動かしても向きは変わらないため、LookAtによって新しい位置から像の方を向かせます。
オイラー角の場合と同じように、角度は独自のフィールドに保持されます。ジャンプすることなく360を超えて増やしたり、0未満に減らしたりでき、上限・下限を設定したり、キーボードから変更したりできます。これをLateUpdate()で行うと、そのフレームで像やプレイヤーが移動した後にカメラが配置されます。
チャレンジ
中級プレイヤーがカメラを塔の周りで動かせるようにします。カメラは常に塔の位置からdistance(8)単位離れ、塔の方を向きます。スクリプトではyawとpitchに2つの角度を保持します。
yawはカメラが塔の周りをどれだけ回り込んだかを表します。右矢印で増加し、左矢印で減少します。速度は1秒あたりturnSpeed(90)度です。yawが0のときカメラは塔の-z側にあり、yawが90のときは-x側にあります。pitchは、塔から見てカメラが塔の高さより何度上にあるかを表します。上矢印で増加し、下矢印で減少します。速度は1秒あたりtiltSpeed(45)度で、10から60の範囲に保たれます。
開始時のyawは0、pitchは30です。このときカメラは塔の位置より4単位上、塔の後方6.93単位の位置にあります。Playを押して周りを動かし、その後Checkを押してください。
自分で試してみよう
using UnityEngine;
public class OrbitCamera : MonoBehaviour
{
public Transform target;
public float distance = 8f;
public float turnSpeed = 90f;
public float tiltSpeed = 45f;
public float yaw = 0f;
public float pitch = 30f;
void Update()
{
// 矢印キーでyawとpitchを変更する。
}
void LateUpdate()
{
// カメラをtargetの周りに配置し、targetの方を向ける。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。