CharacterControllerを使用したキャラクター操作の作成【UnityでTPS作成】#1

1. プレイヤーキャラクターの準備

プレイヤーキャラクターと銃をSceneに配置し、銃をキャラクターの右手の子にする。
そして銃の位置を調整する。

[Player]に[CharacterController]と[CapsuleCollider]を付与し、Center, Radius, Heightをいい感じに調整する。


2. プレイヤーの移動を作成

マウスで視点操作、WASDで前後左右の移動ができるようにする。
以下のスクリプトを作成する。

[PlayerController.cs]

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

public class PlayerController : MonoBehaviour
{
    private CharacterController characterController;  // CharacterController型の変数
    private Vector3 moveVelocity;  // キャラクターコントローラーを動かすためのVector3型の変数
    [SerializeField] private Animator animator;
    [SerializeField] public Transform verRot;  //縦の視点移動の変数(カメラに合わせる)
    [SerializeField] public Transform horRot;  //横の視点移動の変数(プレイヤーに合わせる)
    [SerializeField] public float moveSpeed;  //移動速度
    [SerializeField] public float jumpPower;  //ジャンプ力

    void Start()
    {
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        // マウスによる視点操作
        float X_Rotation = Input.GetAxis("Mouse X");
        float Y_Rotation = Input.GetAxis("Mouse Y");
        horRot.transform.Rotate(new Vector3(0, X_Rotation * 2, 0));
        verRot.transform.Rotate(-Y_Rotation * 2, 0, 0);

        //Wキーがおされたら
        if(Input.GetKey(KeyCode.W))
        {
            characterController.Move(this.gameObject.transform.forward * moveSpeed * Time.deltaTime);
        }
        //Sキーがおされたら
        if (Input.GetKey (KeyCode.S))
		{
			characterController.Move (this.gameObject.transform.forward * -1f * moveSpeed * Time.deltaTime);
		}
		//Aキーがおされたら
		if (Input.GetKey (KeyCode.A))
		{
			characterController.Move (this.gameObject.transform.right * -1 * moveSpeed * Time.deltaTime);
		}
		//Dキーがおされたら
		if (Input.GetKey (KeyCode.D))
		{
			characterController.Move (this.gameObject.transform.right * moveSpeed * Time.deltaTime);
		}

        // 接地しているとき
        if(characterController.isGrounded)
        {
            // ジャンプ
            if(Input.GetKeyDown(KeyCode.Space))
            {
                moveVelocity.y = jumpPower;
            }
        }
        // 空中にいる時
        else
        {
            // 重力をかける
            moveVelocity.y += Physics.gravity.y * Time.deltaTime;
        }

        // キャラクターを動かす
        characterController.Move(moveVelocity * Time.deltaTime);

        // 移動スピードをアニメーターに反映する
        animator.SetFloat("MoveSpeed", new Vector3(moveVelocity.x, 0, moveVelocity.z).magnitude);
    }
}

[Player]の子に空オブジェクト[CameraParent]を作成し、胸の位置くらいに設定する。(これがカメラの縦移動の中心になる)
[MainCamera]を[CameraParent]の子にして、いい感じの位置に調整する。

[Player]に[PlayerController.cs]をアタッチし、画像のように設定する。

アニメーションを設定

[Create]>[Animator Controller]からAnimator Controllerを作成し、[PlayerAnimatorController]と命名する。

停止と移動のアニメーションを設定

[PlayerAnimatorController]を開き、[右クリック]>[Create State]>[Empty]から[Idle]と[Run]のステートを作成する。
それぞれにMotionを設定する。

アニメーションの遷移を設定する。
[Idleステートを右クリック]>[Make Transition]>[Runステートをクリック]でIdleからRunへの遷移を作成。

ステート遷移の条件を設定する。
[Parametersパネル]>[+]>[Float]からパラメータを作成し、[MoveSpeed]と命名する。

IdleからRunへのトランジションを選択し、[Inspectorパネル]>[Conditions]>[+]から下画像のように設定する。

RunからIdleへのトランジションも作成し、下画像のように設定する。

IdleからRunへの遷移を素早くする。
IdleからRunへのトランジションを選択し、[Has Exit Time]のチェックを外し、[Transition Dration(s)]を[0.1]に設定する。

RunからIdleへのトランジションも同様に設定する。

キャラクターにRigとAnimation設定を編集する

Rigの設定(WIP)

Animationの設定(WIP)

スクリプトからAnimatorのパラメータの制御を行う。
[PlayerController.cs]

public class PlayerController : MonoBehaviour
{
    private CharacterController characterController;  // CharacterController型の変数
...
略
...
    void Update()
    {
...
略
...
        // 移動スピードをアニメーターに反映する
        animator.SetFloat("MoveSpeed", new Vector3(moveVelocity.x, 0, moveVelocity.z).magnitude);
    }
}

PlayerControllerの[animator]欄に[Player](animatorがアタッチされたオブジェクト)を設定する。