2025/06/04 Updated by

Unity

Humanoid を動かす (2) 移動+アニメーション


[Up] Japanese English
  1. Humanoid を動かす (2) 移動」で作成したプロジェクトを使う。
  2. プロジェクト名は Humanoid2 に変更したものとする。
  3. Assets/StarterAssets/ThirdPersonController/Character/Animations/ に Humanoid Character の動作アニメーションファイルが存在することを確認する。
  4.   Jump--InAir.anim
      Jump--Jump.anim
      Locomotion--Run_N.anim
      Locomotion--Run_N_Land.anim
      Locomotion--Run_S.anim
      Locomotion--Walk_N.anim
      Locomotion--Walk_N_Land.anim
      Stand--Idle.anim
    



  5. Hierarchy ウィンドウの AsianBoy に Animator Controller コンポーネントを追加する。
    1. ProjectウィンドウのAssetsに Animators フォルダを生成する。
    2. Animators フォルダの中に新しい Animator Controller をcreate (生成)して、 名前を "AsianBoy AnimController" に変更する。



    3. Wnimator ウィンドウを表示する。
    4. Top Menu Bar → Window → Animation →Animator


    5. Animatorウィンドウに表示されているのは「キャラクタの状態」と「状態遷移」である。
    6. Animatorウィンドウで右クリックして Empty 状態 を追加する。



    7. 状態の名前を"Idle" に名前を変更する。名前の変更は、Unity Editor の Inspector ウィンドウで行う。



    8. Idle 状態のMotion を"Idle"に変更する。変更は Unity Editor の Inspector ウィンドウで行う。 このMotion(= Animation)は TSP/Characters/Animation/に含まれている。



    9. Animatorウィンドウで右クリックして さらにEmpty 状態 を追加し、"Walk" に名前を変更する。名前の変更は、Unity Editor の Inspector ウィンドウで行う。



    10. Walk 状態のMotion を"Walk_N"に変更する。



    11. Animator ウィンドウで "Idle" 状態から "Walk" 状態への状態遷移を定義する。
    12. Animator ウィンドウ中の Idle の上で右クリック → Make Transition → マウスに追随する矢印が表示される → Walk の上まで移動してクリック → Idle 状態から Walk 状態への矢印が生成される。





    13. Idle状態からWalk状態への遷移を行うための、条件変数 MovingSpeed を作成する。
    14. Animatorウィンドウの Parametersから"+"をクリックして → Float を選択し、→ 名前を MovingSpeed と入力する。→ 初期値は 0.0 のままで大丈夫





    15. Animatorウィンドウ内のIdle状態からWalk状態への遷移の矢印を左クリックで選択し、 Inspector内のConditionsで "+"をクリックしてから、遷移条件を "MovingSpeed", "Greater", "0.1" と指定する。



    16. Animator ウィンドウで "Walk" 状態から "Idle" 状態への状態遷移を定義する。
    17. Animator ウィンドウ中の Walk の上で右クリック → Make Transition → マウスに追随する矢印が表示される → Idle の上まで移動してクリック → Walk 状態から Idle 状態への矢印が生成される。


    18. Animatorウィンドウ内のWalk 状態からIdle 状態への遷移の矢印を左クリックで選択し、 Inspector内のConditionsで "+"をクリックしてから、遷移条件を "MovingSpeed", "Less", "0.1" と指定する。



  6. Hierarchy ウィンドウで AsianBoy を選択してから、ProjectウィンドウのAssets/AnimController から AsianBoy AnimController を Inspectorウィンドウの Animator の Controller にドラッグする。



  7. ProjectウィンドウのAssets/Scenes で右クリックして Create → C# Script → PlayerMoveAnim を生成する。内容を次のように変更する。
  8. OnFootstep()関数を定義しているのは、これを定義させずに動作させると 「animation "Walk-N" の receiver の "OnFootstep" がない」という警告がでるためである。 「足音を鳴らす」などのことをするために用意する関数のようだ。

    PlayerMoveAnim.cs
    using UnityEngine;
    using UnityEngine.InputSystem;
    
    [RequireComponent(typeof(CharacterController))]
    [RequireComponent(typeof(PlayerInput))]
    public class PlayerMoveAnim : MonoBehaviour
    {
        [SerializeField] private float velocity = 1.3f;
        private Animator animator;
        private CharacterController charController;
        void Start()
        {
            charController = gameObject.GetComponent<CharacterController>();
            animator = gameObject.GetComponent<Animator>();
        }
    
        void Update()
        {
            float h = Input.GetAxis("Horizontal");
            float v = Input.GetAxis("Vertical");
            Vector3 moveDirection = new Vector3(h, 0, v);
            float MovingSpeed = velocity * moveDirection.magnitude;
            if (MovingSpeed > 0.1f)
            {
                animator.SetFloat("MovingSpeed", MovingSpeed);
            } else
            {
                animator.SetFloat("MovingSpeed", 0.0f);
            }
            // Debug.Log(MovingSpeed);
            transform.LookAt(transform.position + moveDirection);
            moveDirection.y += Physics.gravity.y;
            charController.Move(velocity * Time.deltaTime * moveDirection);
        }
    
        // for animation "Walk_N"
        public void OnFootstep()
        {
            Debug.Log("Footstep event triggered");
        }
    }
    
    
  9. ProjectウィンドウのAssets/Scriptsから PlayerMoveAnim を、Hierarchy ウィンドウの AsianBoy 上にドラッグする (Add Component と同じこと)。 Inspectorウィンドウに "Player Move Anim (Script)" というコンポーネントが追加されたことを確認する。 前に追加した "Player Move (Script)" や "Player Move 2 (Script)" は使わないのでチェックをはずしておく。



  10. 動作させると、人の向きだけ変わって、アニメーションしないように見えるが、 4秒の変化時間が設定されているだけで、長く動作しているとアニメーションが開始される。

  11. "Run" ボタン をクリックして実行する。 キーボードの矢印キー(↑ ↓ ← → )または 'w', 'a', 's', 'd' キーで AsianBoy が移動する。 状態によって人型キャラクタのアニメーションが切り替わるが、動作の切り替わりが緩慢に見えるはずである。
  12. Animatorウィンドウで、「Idle状態からWalk状態への状態遷移」と「Walk状態からIdle状態への状態遷移」 をそれぞれ選択して、 Inspectorウィンドウの "Has Exit Time" のチェックをはずす。 (これが設定してあると、状態遷移にいつも決まっただけの時間がかかる。)






  13. 実行してみると、キビキビと動作が遷移することがわかる。



  14. 作成したプロジェクトのzipファイル
  15.    Unity プロジェクトの作成環境:
         PC: minisforum um680 
         OS: Windows 11
         Unity Hub: 3.12.1
         Unity: 6000.0.50f1 (Intel)