新しいスクリプトを作成します。スクリプトを格納するためのフォルダを用意して、その中に作成します。
Projectの上で右クリックをしてメニューを開き、Create => Folder を選択して、新しいフォルダを作成します。
名前を Scripts に変更します。
Scripts フォルダの中で右クリックをしてメニューを開き、Create => C# Script を選択します。
名前を Camera Controller に変更して、ダブルクリックを行い、スクリプトを編集する Visual Studio エディターを開きます。
フォルダ構成
宣言フィールドでは2つの変数を新しく宣言して用意します。
1つはカメラが追従する対象を設定するための GameObject 型の playerObj 変数です。
こちらに設定を行ったゲームオブジェクトをカメラが追従する制御を行っています。
もう1つは Vector3 型の offset 変数です。カメラと追従する対象との一定の距離を設定するための値です。
カメラは常にこの値の分だけ離れて対象を追従するように制御しています。
メソッドは2つ用意します。作成時に作られているメソッドのみで処理を制御できます。
Start メソッドでは、offest 変数に、対象とカメラとの距離を計算して差分を算出し、その値を代入しておきます。
この値が
ゲームスタート時のカメラと対象(ペンギン)の離れている距離になります。
Update メソッドでは、この offset 変数の値を利用して、カメラの位置を
常にペンギンから一定の距離だけ離れて移動させることにより、
カメラがペンギンを追従するように制御を行います。
また追従する処理の前に、if 文で追従する対象が設定されているかどうかの確認を入れています。
なぜなら Update メソッドの処理は常に動いている処理であるため、万が一、playerObj 変数の値が空(追従対象の登録がない場合)には
エラーになってゲームが停止してしまいます。それを未然に防ぐために、
追従処理を行うための前提条件として、追従する対象がいるかどうかのチェックを行っています。
処理を記述する際には、
どんな変数があってどのように利用されているのかを確認しながら書くように心がけてください。
CameraController.cs
<= クリックすると開きます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
[SerializeField]
private GameObject playerObj; // カメラが追従する対象のゲームオブジェクト。今回はペンギン
private Vector3 offset; // カメラが追従する対象との間の取る、一定の距離用の補正値
void Start()
{
// カメラと追従対象のゲームオブジェクトとの距離を補正値として取得
offset = transform.position - playerObj.transform.position;
}
void Update()
{
// 追従対象がいる場合
if (playerObj != null) {
// カメラの位置を追従対象の位置 + 補正値にする
transform.position = playerObj.transform.position + offset;
}
}
}