Unity tips #2 カメラスクリプトの書き方
前回に引き続いて、過去の記事から、需要がありそうなのをサルベージして張ります。
追尾型 カメラスクリプトの書き方
基本的なところをざっと。 括弧の中は仮の変数名。
- Player位置からカメラへ向うベクトル(vectorToCamera)を求める。
this.transform.position-Player.transform.position と計算
注意点で、カメラとプレイヤーのx,z座標が同じとき、
vectorToCamera が零ベクトルになってしまうので正常に動かない可能性があります。
すこしでもx,z座標がずれてれば正しく動くはずなので、カメラとプレイヤーの初期x,z座標はずらす必要があります。
もしくは、プレイヤーとカメラのx,z座標が同じときは、適当な数字にずらすようにスクリプトで書いてあげればよいでしょう。
- 目標カメラXZ位置(wantedPosition)として、Player.transform.position + xzVectorToCamera*distanceと計算
distanceはどれぐらいの距離を保ちPlayerの後を追尾するか。
カメラのY位置は個別に指定したほうがよい。よってvectorToCameraのy成分を0にしてNormalizeしたものをxzVectorToCameraとする。
- 目標カメラY位置(wantedPosition.y)は個別に、Player.transform.position.y + yHeightとする。
yHeightで カメラの高さを設定。
- wantedPositionをそのままtransform.positionにいれるとカメラの動きが俊敏すぎてガクガクしてしまう。
これを防ぐために Vector3.LerpやMathf.Lerpを使い、現在のtransform.positionと補間をおこなうと滑らかな動きになる。
例)
transform.position = Vector3.Lerp(transform.position,wantedPosition,damping*Time.deltaTime)
変数dampingで追従移動の滑らかさを指定する
位置の決定はこれでよいものの、これではカメラは追従するだけでプレイヤーの方を向かないので、そこについての処理を書く。
- プレイヤーの方を見るようなカメラの回転を計算する(targetRotation)。
Quaternion.LookRotation(-vectorToPlayer)とやれば簡単
- 例によって、これをtransform.rotationにいれるだけだとガクガクなので、
transform.rotation = Quaternion.Slerp(transform.rotation,targetRotation,rotationDamping*Time.deltaTime)
と補間をして滑らかに回転させる。
これが自分が使っているカメラの基本挙動。
これに加えてy成分を地形に沿わせて上下させたり、
Playerの移動をカメラと相対的な動きにさせると、結構時のオカリナっぽい挙動になります。