Developer

【Unity】3Dアクションゲームを作ろう!#5 移動操作の実装
2022.09.30
Lv2

【Unity】3Dアクションゲームを作ろう!#5 移動操作の実装


はじめに

本連載は以下の目次ページにまとまっています。

実践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 を紹介していますので、良ければご覧ください。

【初心者Unity】オブジェクトをキー入力で移動させる方法

 

次回はステージの作成(床・壁)を行います。

 


Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次