オービットカメラ
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 48/71。
ある点の周りを回るには、角度を保持し、固定オフセットをその角度だけ回転させ、結果を点に加えます。ベクトルに回転を掛けると回転します。Quaternion.Euler(0, angle, 0) * offset はオフセットを y 軸の周りに回転させ、長さと高さは変わりません。このカメラは、像の周りを毎秒20度で回り、常に3ユニット上、6ユニット離れた位置にあります。
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 によって、新しい位置から像のほうを向かせます。
2つ目の角度でカメラの高さを変えられます。Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance) は、後ろ向きの方向を pitch だけ上向きに回転させ(x 軸の周りに正の角度で回転すると、(0, 0, -1) は上を向きます)、次に yaw だけ回転させるため、どの角度でもカメラは distance 離れた位置を保ちます。
オイラー角の場合と同様に、角度は独自のフィールドに保持されます。角度はジャンプすることなく360を超えて増えたり、0を下回ったりできます。また、上限・下限を設定したり、キーボードから変更したりできます。これを LateUpdate() で行うと、そのフレームで像やプレイヤーが移動した後にカメラを配置できます。
チャレンジ
中級プレイヤーがカメラを操作して、塔の周りを飛び回れるようにしましょう。
Update()で、右矢印キーと左矢印キーを押すとturnSpeedに応じてyawが変化し、上矢印キーと下矢印キーを押すとtiltSpeedに応じてpitchが変化するようにします。それぞれにTime.deltaTimeを掛けます。- 次に、
pitch = Mathf.Clamp(pitch, 10f, 60f);をそのまま残します。 LateUpdate()で、transform.position = target.position + Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance);を設定し、次にtransform.LookAt(target);を設定します。
「プレイ」を押して、塔の周りを飛び回りましょう。次に「確認」を押します。
自分で試してみよう
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 の方を向ける。
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド