バーチャルカメラを3Dの空間内を動き回るキャラクタ(クエリちゃん)に追従させます。つまり、カメラがクエリちゃんの後をついて回ります。これ、実はスクリプトなしで、バーチャルカメラの機能を使えばすぐできます。前に近い実験も紹介しました。
しかし、今回はバーチャルカメラだけを用意し、位置と撮影の向きを完全にスクリプトでコントロールしてみます。バーチャルカメラの機能だけを使うより、細かな操作ができるかも知れません! 実際にどんな感じになるのか、動画をどうぞ。
スクリプトは以下です。これをUpdate()ルーチン内でコールします。動き回るクエリちゃんを真後ろ、少し高いところから撮影します。go1はクエリちゃんのゲームオブジェクト、goBackCameraは問題のバーチャルカメラのゲームオブジェクトです。
//-----------------------------------------
void setCameraPara() {
float ratio = 0.4f;//①
Vector3 p = go1.transform.position; //②クエリちゃんの位置
Vector3 f = go1.transform.forward; //③クエリちゃんの前方
Vector3 u = go1.transform.up; //④クエリちゃんの上方
Vector3 c = p + 20 * u - 23 * f; //⑤新しいカメラ位置
goBackCamera.transform.position = c;//⑥
Vector3 dir = p - c;//⑦カメラからの視線はこの向き
Quaternion rot1 = goBackCamera.transform.rotation;//⑧カメラの古い向き
Quaternion rot2 = Quaternion.LookRotation(dir);//⑨カメラの新しい向き
goBackCamera.transform.rotation
= Quaternion.Slerp(rot1, rot2, ratio);//⑩カメラの向きを補間
}
//-----------------------------------------
⑤、⑥でクエリちゃんの後方、少し高い位置にカメラをセットします。⑦はカメラからクエリちゃんまでのベクトル。⑧はコール時のカメラの向きです(クオータニオンで表される)。⑨はカメラを向かせたい向き。⑩で現在のカメラの向きを新しい向きに向けますが、ratioという引数があります。これは0~1の値を取らせることができ、実際にいろいろな値で試してみると何となく、意味がつかめます。1に近いとキビキビした動きになります。これだとゲームでは疲れる感じかも知れません。自分では、0.3か0.4くらいでちょうどいいかな、という気がします。この⑩は
goBackCamera.transform.rotation = rot2;
と書き換えても一応動きます。もとの⑩で、ratio = 1 としたときの動作になるようです。⑩はrot1とrot2の「間」の向きをカメラにセットするのです。間と言ってもいろいろで、どちらに近いか、ratioで指定するわけです。
バーチャルカメラの機能を使っていろいろやっていると、動作が思った感じと違うことがありました。自分で(スクリプトで)やったらどうなるかな……と、実験してみました。もう少し調べます。新たに何か分かったらまた記事にします。