【補足解説付き】Unity公式チュートリアル日本語翻訳【Roll-a-ball tutorial - 3. Moving the Camera】
Main Camera は移動せず固定されていて、現在の位置からでは Player ゲームオブジェクトが良く見えません。
Main Camera を Player ゲームオブジェクトに結びつける必要があります。
最初に Main Camera の位置を設定しましょう。高さを 10 持ち上げて、45度傾けます。
次に Main Camera ゲームオブジェクトを Player ゲームオブジェクトの子にします。Project ビューの Main Camera ゲームオブジェクトを Player ゲームオブジェクトにドラッグしてください。
Main Camera を Player の子にすることは第三者視点のゲームの典型的な設定です。第三者視点のゲームとはプレイアブルキャラ(操作キャラ)が映るゲームのことであり、プレイアブルキャラの手や銃だけが映るゲームは主観視点のゲームと呼ばれます。私たちが Player の位置を移動すれば、子である Main Camera の位置も一緒に移動します。Player が回転すれば、カメラも回転します。
これを Player と Main Camera のゲームオブジェクトの両方を見ることができる位置から見てみましょう。Scene ビューを下図のような状態にして、Player の Transform コンポーネントの各値を操作して Player を移動したり回転させると Main Camera が追従することを確認します。
さて Player の 位置を元に戻してテストしてみましょう。ゲームを再生して、動くための上向きの矢印を押し続けると何が起きるでしょうか。
Main Camera ゲームオブジェクトの Transform の値は全く変化していませんが、Player ゲームオブジェクの Transform の値はめまぐるしく変化し、Player ゲームオブジェクトが狂ったように回転しているので、カメラの視点はそれと共に回転します。
再生モードを終了します。
通常の第三者視点のゲームとは異なり、私たちの Player ゲームオブジェクトは1つの軸だけでなく3つの軸で回転しています。
第三者視点のゲームの典型的な設定では、プレーヤーのゲームオブジェクトの子としてのカメラは、その直近の親に対する相対位置に常にあります。この相対位置というのは、ゲーム内の親の Transform コンポーネントの値を、子の Transform コンポーネント の値で修正または相殺した値です。
狂ったように全方位回転する Player では、子に Main Camera を配置するには好ましくないため Main Camera を切り離しましょう。
基準となる被写体からの相対的なカメラの位置は Player と Main Camera の差です。次に試す方法では、Main Camera を Player の子に設定するのではなく、スクリプトで両者を関連付けます。Hierarch ビューで Main Camera を選択した状態で Add Component ボタンをクリックして New Script を選択します。
CameraController とスクリプトを名付けて、Create and Addをクリックするか Return キーか Enter キーを押下して選択を確定します。この方法でスクリプトを作成した場合には、Project ビューの Assets フォルダ直下に生成されてしまっていることに注意します。ドラッグして Scripts フォルダ直下に移動しましょう。
CameraController スクリプトを選択した状態で Insupector ビューから Open ボタンをクリックしてスクリプトをエディタで開きます。
2つの変数を用意しましょう。player ゲームオブジェクトを参照するための変数と、相対位置を保存するための変数です。
相対位置を保持する offset 変数の値の設定はこのスクリプト内で完結できるので private で宣言します。offset 値には現在の Transform コンポーネントに設定されている位置情報を代入します。
そして Player ゲームオブジェクトの Transform コンポーネントで設定されている位置情報で減算して、Main Camera と Player の間の差分を見つけます。
Start 関数内で offset 変数に Main Camera の Transform コンポーネントの Position の値から Player の Transform コンポーネントの Postion の値を引いたものを代入します。
Update 関数内で毎フレーム、Main Camera の Transform Position に Player の Transform Position に offset を加えた値を代入します。
これは、キーボード上のコントローラーを使用してプレイヤーを移動すると、各フレームがカメラに描画される前に、Main Camera が Player に揃えられた新しい位置に移動されて描画することを意味します。
ちょうど Player がゲームボードの周りを転がっていない場合に、そのオブジェクトの子に設定した時と同じような挙動になります。
ただしこのコードは Update 関数内が適切な場所ではありません。
Update 関数はすべてのフレームで実行され、各フレームが更新されるたびに、Player ゲームオブジェクトの位置を追跡し、Main Camera の位置を設定します。
しかしながら、追従するカメラや、連続するアニメーションなど、フレームの最後の状態を収集するためには、LateUpdate 関数を使用することがベストです。
LateUpdate 関数は Update 関数と同様に毎フレーム呼ばれますが、すべてのアイテムが更新された後に実行されることが保証されています。offset への代入は必ず Player の移動処理の後に実行して欲しいですよね。
スクリプトを保存して Unity に戻ります。
まず、Player ゲームオブジェクトを CameraController コンポーネントの Player スロットにドラッグすることによって、Player ゲームオブジェクトへの参照を作成する必要があります。
ゲームを再生して私たちが望む通りの挙動になっていることを確認しましょう。カメラは回転することなく回転するボールに追従します。 ボールが端を越えて落ちていっても追従します。
次の課題では、基本的なプレイエリアを設定し、拾うことができる特別なオブジェクトを作成して配置します。