(この記事の使用環境: Unity5.4.2f2 Personal、Windows10


今回はAsset「Melee Axe Pack」で歩く動作と走る動作を実装してみます。

Melee Axe Pack
https://www.assetstore.unity3d.com/jp/#!/content/35320
 
SnapCrab_NoName_2016-12-30_18-56-18_No-00

Assetに含まれているデモシーンで、収録されているモーションを確認できます。


で、さっそくこれらの動作をAnimator Controllerにくっつけて実装してみました。
まずは歩き。このAssetには前後左右それぞれのモーションが収録されています。


次に走りモーションも追加。走るモーションは左右のはなかったので、左右は歩きと共通にしています。
こんな感じ。


Animatorの遷移はこんな感じ。待機状態から(前後左右)×(歩き・走り)の8方向に遷移させています。
遷移条件の"Walk"、"Run"をそれぞれint型で定義し、前(1)後(2)右(3)左(4)待機(0)という感じにしています。
SnapCrab_NoName_2016-12-30_19-4-58_No-00

スクリプトはこんな感じ。
前半。左シフトキーで歩き・走りを切り替えられるようにしています。
前後の移動はキーボードの上下(またはW・S)を拾ってRigidbody.AddRelativeForceで動かし、左右の転回はキーボードの左右(またはA・D)を拾ってRigidbody.AddRelativeTorqueで動かしています。

using UnityEngine;
using System.Collections;

public class MeleeAxePackController : MonoBehaviour
{

    public float speed;
    public float torque;
    public float runMult;

    float x;
    float z;

    Rigidbody rb;
    Animator anim;

    bool isRunning = false;     // 走っているか

    void Start ()
    {
        rb = GetComponent<Rigidbody> ();
        anim = GetComponent<Animator> ();
    }

    void FixedUpdate ()
    {
        x = Input.GetAxis ("Horizontal");
        z = Input.GetAxis ("Vertical");

        if (Input.GetKeyDown (KeyCode.LeftShift))       // 歩く・走るの切り替え(左シフトキー)
        {
            isRunning = !isRunning;
            Debug.Log ("isRunning: " + isRunning);
            anim.SetInteger ("Run", 0);
            anim.SetInteger ("Walk", 0);
            if (isRunning)
            {
                speed *= runMult;
            }
            else
            {
                speed /= runMult;
            }
        }

        if (z > 0)
        {
            rb.AddRelativeForce (Vector3.forward * z * speed * Time.deltaTime);         // 前進
        }
        else
        {
            rb.AddRelativeForce (Vector3.forward * z * speed / 1.5f * Time.deltaTime);  // 後退(速度は遅い)
        }

        rb.AddRelativeTorque (Vector3.up * x * torque * Time.deltaTime);                // 転回


後半。X-Z軸を4象限に分けて、前後左右のモーションの割り当てを行っています。

        switch (isRunning)
        {
            // --- 走っている ------------------------------------------------------
            case true:
                if (z > 0 && Mathf.Abs (z) >= Mathf.Abs (x))        // 前進モーション
                {
                    anim.SetInteger ("Run", 1);
                }
                else if (z < 0 && Mathf.Abs (z) >= Mathf.Abs (x))   // 後退モーション
                {
                    anim.SetInteger ("Run", 2);
                }
                else if (x > 0 && Mathf.Abs (x) > Mathf.Abs (z))    // 右移動モーション
                {
                    anim.SetInteger ("Run", 3);
                }
                else if (x < 0 && Mathf.Abs (x) > Mathf.Abs (z))    // 左移動モーション
                {
                    anim.SetInteger ("Run", 4);
                }
                else                                                // 待機モーション
                {
                    anim.SetInteger ("Run", 0);
                }
                break;

            // --- 走っていない ------------------------------------------------------
            case false:
                if (z > 0 && Mathf.Abs (z) >= Mathf.Abs (x))        // 前進モーション
                {
                    anim.SetInteger ("Walk", 1);
                }
                else if (z < 0 && Mathf.Abs (z) >= Mathf.Abs (x))   // 後退モーション
                {
                    anim.SetInteger ("Walk", 2);
                }
                else if (x > 0 && Mathf.Abs (x) > Mathf.Abs (z))    // 右移動モーション
                {
                    anim.SetInteger ("Walk", 3);
                }
                else if (x < 0 && Mathf.Abs (x) > Mathf.Abs (z))    // 左移動モーション
                {
                    anim.SetInteger ("Walk", 4);
                }
                else                                                // 待機モーション
                {
                    anim.SetInteger ("Walk", 0);
                }
                break;
        }
    }
}

今回は以上です。