▶
【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 を紹介していますので、良ければご覧ください。
次回はステージの作成(床・壁)を行います。









