Menu
CoddyTech

オービットカメラ

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() で行うと、そのフレームで像やプレイヤーが移動した後にカメラを配置できます。

challenge icon

チャレンジ

中級

プレイヤーがカメラを操作して、塔の周りを飛び回れるようにしましょう。

  1. Update()で、右矢印キーと左矢印キーを押すとturnSpeedに応じてyawが変化し、上矢印キーと下矢印キーを押すとtiltSpeedに応じてpitchが変化するようにします。それぞれにTime.deltaTimeを掛けます。
  2. 次に、pitch = Mathf.Clamp(pitch, 10f, 60f);をそのまま残します。
  3. 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プレイグラウンド