プレイヤーObjectを作って移動、カメラの追従をする(Unity6)

開発Tips

キャラクターにカメラを追従させたい場合や、キャラクターを変更したいなど直接キャラクターの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にします。まだゲームの雰囲気とかが頭の中にしかないので、そういう作りこみは後でやります。

コメント

タイトルとURLをコピーしました