キャラクターにカメラを追従させたい場合や、キャラクターを変更したいなど直接キャラクターのPrefabでやってしまうと結構面倒なことになります。
新しく作成(Instantiate)したときに、カメラを設定、必要なコンポーネントを設定などです。
なのであらかじめPlayerオブジェクトを作っておいて、そこにいろいろ入れていきます。
Playerオブジェクトを作成する
まず、最初にヒエラルキーで右クリックメニューから、「Create Empty」を選択して空のGameObjectを作ります。名前を「Player」に変更します。
PositionとRotationを設定します。Scaleは(1, 1, 1)にします。
そのあとに、とりあえずキャラクターのPrefabをドラッグ&ドロップで入れて親子関係にします。
ドラッグ&ドロップして子供になったPrefabのPositionが相対位置、つまり親のPositionからみての位置になっています。
子のPositionは、親のPositionを基準にしての位置を設定します。

Playerの移動
Projectに「Scripts」フォルダを作成して、右クリックメニューより「MonoBehaviour Script」を追加する。

名前を「PlayerController」にしました。わかれば何でもいいです。CharacterControllerは同じ名前のコンポーネントがあるので避けましょう。
親オブジェクトに忘れないうちにドラッグ&ドロップして、Componentに追加しておきます。

PlayerControllerをダブルクリックして中身を確認してみます。
using UnityEngine;
public class NewMonoBehaviourScript : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
NewMonoBehaviourScript は名称なのでわかりやすい名前に変えます。
Startはオブジェクトが作られた時に実行されます。Updateはループで回ってきます。FPSによりけりです。
Scriptは、以下のようにしました。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] private float walk_speed = 1f; //移動係数。
private GameObject character;
// Startは、MonoBehaviourが作成された後、Updateが最初に実行される前に1回呼び出されます。
void Start()
{
//キャラクターを取得
character = GetGameObjectByTagName("Character");
}
// 更新は1フレームにつき1回呼び出される
void Update()
{
//左キーを押したとき
if (Input.GetKey("left")) {
transform.position -= transform.right * Time.deltaTime * walk_speed; //左に移動
character.transform.rotation = Quaternion.Euler(0, -90, 0); //左を向く
}
//右キーを押したとき
if (Input.GetKey("right")) {
transform.position += transform.right * Time.deltaTime * walk_speed; //右に移動
character.transform.rotation = Quaternion.Euler(0, 90, 0); //右を向く
}
}
// Tag名から最初のGameObjectを取得する関数
private GameObject GetGameObjectByTagName(string tag_name)
{
for (int i = 0; i < this.transform.childCount; i++)
{
Transform transform = this.transform.GetChild(i);
if (transform.gameObject.tag == tag_name)
{
return transform.gameObject;
}
}
return null;
}
}
キーボードで動かすとこんな感じ
カメラが追従しないので、キャラクターだけが移動する。
ちなみにUnityちゃんについていたScriptコンポーネントは邪魔だったので「Spring Manager」以外のScriptは、無効にしています。
カメラの追従
Main CameraをPlayerオブジェクトの子供に移動します。

そうすると、親子関係ができるので、親が動けば子も動く、さっきの移動ではUnityちゃんではなくPlayerオブジェクトを動かしています。Unityちゃんも、Playerオブジェクトの子供なので親が動けば子もつられて動きます。
Chinemachineを使えばもっとかっこいいカメラワークができるんですが、とりあえずこれでOKにします。まだゲームの雰囲気とかが頭の中にしかないので、そういう作りこみは後でやります。

コメント