ゲーム開発初心者の覚え書き

ひとまず初めにここには私が個人で勉強した内容(つまずいたところとか時間がかかった部分)などを覚え書きする感じで書き込んでいきます。 誤った情報を発信してしまうこともあるでしょうが、本人的には気を付けているつもりなので温かく見守っていただくかコメントなどで ご指摘いただけるとありがたいです。

Unityのプレイヤー移動処理【3D】


今回はプレイヤーに歩きモーションをつけて移動させようかと思ってたんですがその前にキーボード入力orゲームパッドの入力を受けてキャラクターを移動させるためのスクリプトの記述を先にやっておこうと思います。

ではまず3Dテンプレートから新しくプロジェクトを作成しましょう。そしてHierarchyで右クリックもしくはHierarchyの上部にある+ボタンを押して、3D Object → Planeをクリックして床を作りましょう。

次にプレイヤーのモデル(今回はMixamoよりダウンロードしてきたモデルを使用してます)をSceneに追加して名前をPlayerに変更しましょう。

今のところの状態↓の画像のような感じです

f:id:Kanipan_Man:20210109134535p:plain

そして↓の画像ようにPlayerを選択してInspectorのAdd ComponentでCharactorControllerを追加しましょう。

f:id:Kanipan_Man:20210109134742p:plain

ここからはプレイヤーを移動させるためのScriptを記述していきます。まずはProjectのAssetsフォルダにScriptsというフォルダを作成して、その中に右クリックもしくはProjectの上部にある+ボタンを押して

Create → C# Scriptとして新規にスクリプトを作成しファイル名をPlayerControllerとしてください。ではPlayerControllerをダブルクリックしVisualStudioを立ち上げてScriptを記述していきましょう。

ソースコードは以下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    //移動関連のパラメータ
    [Header("速さの最低値")]
    [SerializeField]
    private float minSpeed = 3.0f;
    [Header("速さの最高値")]
    [SerializeField]
    private float maxSpeed = 5.0f;
    [Header("プレイヤーの方向転換スピードの調整値")]
     //0.0fだと一切向きが変わらず1.0fだと入力後すぐ入力された方向へ向く
    [SerializeField, Range(0.0f, 1.0f)]
    private float turnRate = 0.3f;

    //移動速度
    private Vector3 velocity;

    //キャラクターコントローラー
    private CharacterController controller;

    //InspectorにてRangeの値が指定の範囲に収まるようにClamp処理
    private void OnValidate()
    {
        this.turnRate = Mathf.Clamp(this.turnRate, 0.0f, 1.0f);
    }

    //初期設定
    void Awake()
    {
        //キャラクターコントローラー取得
        this.controller = this.GetComponent<CharacterController>();

        //速度をゼロに設定
        this.velocity = Vector3.zero;

    }

    //更新処理
    void Update()
    {
        Vector3 vec = this.velocity;
        float Speed = 0.0f;

        //床に接地していたら歩く
        if (this.controller.isGrounded)
        {
            //ゲームパッドのスティック入力値を取得して移動ベクトルを作成
            //..ついでに接地しているのでY軸の値をリセット
            vec = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));

            //入力値から得たベクトルの長さが0.1fを越えていれば速さを設定
            if (vec.magnitude > 0.1f)
            {
                //スティックの倒し具合によって速さを変更
                Speed = Mathf.Lerp(this.minSpeed, this.maxSpeed, vec.magnitude);

                //向きの変更
                Vector3 dir = vec.normalized;
                float rotate = Mathf.Acos(dir.z);
                if (dir.x < 0) rotate = -rotate;
                rotate *= Mathf.Rad2Deg;
                Quaternion Q = Quaternion.Euler(0, rotate, 0);
                //ここでモデルの向いている方向が徐々に変わるように処理しつつ
                //モデルの向きを変更
                this.transform.rotation = Quaternion.Slerp(
                          this.transform.rotation, Q, this.turnRate
                          );
            }

            //移動ベクトルを正規化
            vec = vec.normalized;
        }

        //移動速度を設定
        this.velocity.x = vec.x * Speed;
        this.velocity.y = vec.y;
        this.velocity.z = vec.z * Speed;

        //重力による落下を設定
        this.velocity.y += Physics.gravity.y * Time.deltaTime;

        //移動させる
        this.controller.Move(this.velocity * Time.deltaTime);

    }
}

このスクリプトをPlayerオブジェクトにAdd Componentで追加して再生ボタンを押せばキーボードの↑↓→←キーもしくはゲームパッド(Directインプットのもの)の左スティックで

プレイヤーが移動するようになっていると思います。詳しくコードの解説とかはしませんが、transform.LookAt(向けたい先のTransform)とするとプレイヤーの向きが一瞬で切り替わってしまって気持ち悪いのでtransform.rotationを変更してプレイヤーの向きを変えるようにしてあります。また今回はCharactorControllerのコンポーネントを使用して移動処理を実装しましたが、他にも移動処理を実装する方法はあるので今後機会があれば紹介したいと思います。