カメラをプレイヤーなんかのオブジェクトに追尾させるためのメモ。
一番簡単なのは対象オブジェクトの子にカメラを設置すること。
スクリプトだと以下のようにして親子関係にする。
1 |
camera.transform.parent = car.transform; |
この状態で car オブジェクトを移動、回転させるとカメラも自動追尾する。
移動用のベクトルを回転させる場合には掛け算の順番に気をつける。
1 2 3 4 5 |
//これはエラー moveVector = moveVector * Quaternion.Euler(0,-90,0); //Quaternion * Vectorの順番が正しい moveVector = Quaternion.Euler(0,-90,0) * moveVector; |
ぱっと動いたらよくわからなくなるのでコルーチンを使って徐々に動かす。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//5フレームに渡って回転させる StartCoroutine( CarRotation( 5, car.transform.rotation, Quaternion.Euler(0,-90,0) * car.transform.rotation ) ); //fフレームに渡って回転 IEnumerator CarRotation(int f,Quaternion s,Quaternion e){ for(int i=1;i<=f;i++){ car.transform.rotation = Quaternion.Lerp(s,e,(float)i/f); yield return null; } } |
車とカメラの動きをバラけさせたいときは親子関係にはせずにオフセットを使う。
カメラは常に車とオフセット分離れていて、回転すると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Vector3 offset; ... void Start () { offset = car.transform.position - camera.transform.position; } //車とカメラの移動 void Update () { car.transform.position += moveVector; camera.transform.position = car.transform.position - offset; } //車の回転と移動ベクトル変更 void CarLeft() { car.transform.rotation = Quaternion.Euler(0,-90,0) * car.transform.rotation; moveVector = Quaternion.Euler(0,-90,0) * moveVector; } //カメラの回転とオフセット変更 void CameraLeft() { camera.transform.rotation = Quaternion.Euler(0,-90,0) * camera.transform.rotation; offset = Quaternion.Euler(0,-90,0)*offset; } |
カメラ移動だけコルーチンで遅らせるとこんな感じ。