しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity で 3D 猫のアニメーションをつけてみる

あけましておめでとうございます!本年もよろしくお願いいたします

さて 3D 猫の移動はできましたが、アニメーションが全くないので猫が歩いているように見えませんでした

というわけで今回はアニメーションをつけてみたいと思います(ついでに地面にテクスチャを貼る)

まずは Assets フォルダ配下に Animations フォルダを追加し、さらにその直下に CatAnimator という名前で Animation Controller を追加します

f:id:matatabi_ux:20151227135838p:plain

作った Animation Controller をダブルクリックして Animator ビューを開くとアニメーションのステートマシン設定が表示されます

ここへ Idle、Walk、Dash のステートを追加し、遷移条件判定用のパラメータ(Speed)の追加、各ステートへの遷移方向の接続、アニメーションの切り替わりポイントの調整、遷移条件の追加、Has Exit Time フラグ(アニメーションの完走強制)の解除などを下記のように設定します

f:id:matatabi_ux:20151227140511g:plain

設定した Animation Controller は Cat の子要素の cu_cat プレハブにドラッグドロップして Animator の Controller に指定します

f:id:matatabi_ux:20151227144107p:plain

ついでに無機質な地面のテクスチャとして

f:id:matatabi_ux:20151227145045p:plain

芝生のテクスチャを Asset Store からダウンロードしてインポートしました

テクスチャの Material を Ground の Plate に向かってドラッグドロップして、シェーダーを Mobile/Diffuse、繰り返しの設定 Tile を X, Y ともに 10 に指定しました

f:id:matatabi_ux:20151227145121p:plain

スクリプト側も修正

using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
using System.Collections;
using UnityEditor.Animations;

/// <summary>
/// 入力制御クラス
/// </summary>
public class InputController : MonoBehaviour
{
    /// <summary>
    /// 制御対象のキャラクターコントローラー
    /// </summary>
    public CharacterController PlayerController;

    /// <summary>
    /// 制御対象のアニメーター
    /// </summary>
    public Animator PlayerAnimator;

    /// <summary>
    /// メインカメラ
    /// </summary>
    public Camera MainCamera;

    /// <summary>
    /// Use this for initialization
    /// </summary>
    public void Start()
    {
        this.MainCamera = Camera.main;
    }

    /// <summary>
    /// Update is called once per frame
    /// </summary>
    public void Update()
    {
        if (this.PlayerController == null)
        {
            return;
        }

        // 移動方向を決める
        var dx = CrossPlatformInputManager.GetAxis("Horizontal");
        var dz = CrossPlatformInputManager.GetAxis("Vertical");
        if (Mathf.Abs(dx) + Mathf.Abs(dz) <= 0)
        {
            this.PlayerAnimator.SetFloat("Speed", 0);
            return;
        }
        this.PlayerController.transform.rotation = Quaternion.Euler(0, -Mathf.Atan2(dz, dx) * Mathf.Rad2Deg - this.MainCamera.transform.rotation.eulerAngles.y, 0);

        // 単純移動
        var speed = new Vector3(dx, 0, dz).magnitude;
        this.PlayerController.SimpleMove(this.PlayerController.transform.forward * speed * 0.5f);

        if (this.PlayerAnimator == null)
        {
            return;
        }

        this.PlayerAnimator.SetFloat("Speed", speed * 2f);
    }
}

Animator.SetFloat() で Speed という名前のフラグに猫の移動速度を設定することで、ステートマシンの条件遷移を発火するようにしています

移動なしの場合は Speed に 0 を指定して Idle 状態になるような補正もかけました

最後に InputController に生やした PlayerAnimator のプロパティに CatAnimator を指定した cu_cat をドラッグドロップして Animator をスクリプトから参照できるようにします

f:id:matatabi_ux:20151227145756p:plain

さてこれで動かしてみました

f:id:matatabi_ux:20151227150054g:plain

3D 猫が駆け回る感じが出ましたね