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がアタッチされたオブジェクト)を設定する。