【Unity】3Dアクションゲームを作ろう!#5 移動操作の実装
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
はじめに
本連載は以下の目次ページにまとまっています。
前回の記事はこちら↓
【Unity】3Dアクションゲームを作ろう!#4 アニメーションの作成
今回は移動操作の実装を行います!
具体的には、CharacterControllerコンポーネントを使って、移動操作を実装します。
WASDキーで移動、左シフトキーを押しながら移動でダッシュ、スペースキーでジャンプができるようにします。
さらに移動速度を前回の記事で作成した MoveSpeed に反映します。
移動操作の実装
① CharacterController コンポーネントを追加
Projectウィンドウ > Prefabs > Player を選択し、
Inspecterウィンドウ > Add Component をクリックします。
選択するのは CharacterController コンポーネントです。
CharacterController には移動関連の便利な命令があらかじめ用意されているほか、Collider のような当たり判定も含まれています。
Collider についてはこちらの記事に記載がありますので、ぜひご覧ください。
【初心者Unity】はじめに知っておくべきColliderコンポーネントの概要
デフォルトでは下図の通り、Player の見た目に反した当たり判定となっています。
ですので、以下の通り、値を変更します。
・Skin Width → 0.01
・Min Move Distance → 0
・Center → (0, 0.5, 0)
・Radius → 0.3
・Height → 1
これで、見た目に沿った当たり判定となりました。
② PlayerScript を作成
Scripts フォルダを作成し、その中に新規スクリプトを作成します。
新規スクリプトの作成は
フォルダ内で右クリック > Create > C#Script
で行えます。
名前は PlayerScript とし、Prefabs フォルダ内の Player にアタッチします。
アタッチの方法は CharacterController コンポーネントを追加したやり方と同じです。
PlayerScript には以下を記述してください。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Cinemachine; public class PlayerScript : MonoBehaviour { CharacterController con; Animator anim; float normalSpeed = 3f; // 通常時の移動速度 float sprintSpeed = 5f; // ダッシュ時の移動速度 float jump = 8f; // ジャンプ力 float gravity = 10f; // 重力の大きさ Vector3 moveDirection = Vector3.zero; Vector3 startPos; void Start() { con = GetComponent<CharacterController>(); anim = GetComponent<Animator>(); // マウスカーソルを非表示にし、位置を固定 Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; startPos = transform.position; } void Update() { // 移動速度を取得 float speed = Input.GetKey(KeyCode.LeftShift) ? sprintSpeed : normalSpeed; // カメラの向きを基準にした正面方向のベクトル Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward,new Vector3(1, 0, 1)).normalized; // 前後左右の入力(WASDキー)から、移動のためのベクトルを計算 // Input.GetAxis("Vertical") は前後(WSキー)の入力値 // Input.GetAxis("Horizontal") は左右(ADキー)の入力値 Vector3 moveZ = cameraForward * Input.GetAxis("Vertical") * speed; // 前後(カメラ基準) Vector3 moveX = Camera.main.transform.right * Input.GetAxis("Horizontal") * speed; // 左右(カメラ基準) // isGrounded は地面にいるかどうかを判定します // 地面にいるときはジャンプを可能に if (con.isGrounded) { moveDirection = moveZ + moveX; if (Input.GetButtonDown("Jump")) { moveDirection.y = jump; } } else { // 重力を効かせる moveDirection = moveZ + moveX + new Vector3(0, moveDirection.y, 0); moveDirection.y -= gravity * Time.deltaTime; } // 移動のアニメーション anim.SetFloat("MoveSpeed", (moveZ + moveX).magnitude); // プレイヤーの向きを入力の向きに変更 transform.LookAt(transform.position + moveZ + moveX); // Move は指定したベクトルだけ移動させる命令 con.Move(moveDirection * Time.deltaTime); } }
CharacterController を使って移動処理を作る場合には、およそこのようなプログラムとなります。
大まかに分けて以下のような内容となっています。
1.WASD入力による移動量を計算(36~45行)
2.地面にいるかどうかで、ジャンプや重力の処理を分ける(49~62行)
3.上記の移動情報を元に、アニメーションや実際の移動の命令を行う(65~71行)
動作確認
移動操作の動作確認をしてみましょう。
1.WASDキーで移動ができる
2.左Shiftキーを押しながら移動でダッシュ移動となる
3.地面にいる時はSpaceキーでジャンプ可能
※Console に以下のエラーが出てしまう場合
エラーをダブルクリックして、開いたスクリプトで下記をコメントアウトします。
以上で移動操作の実装は完了となります。
おわりに
今回は CharacterController コンポーネントを使って移動操作を実装しました。
他にも様々な方法で移動操作は実装できます。
こちらの記事では transform.position と Rigidbody を紹介していますので、良ければご覧ください。
次回はステージの作成(床・壁)を行います。