Blender事始め – No.20(Unityで動かす②)

対象バージョン:Blender v2.82a、Unity v2019.4.1f1

アニメーション連携

前回の「Blender事始め – No.19(Unityで動かす①)」では、BlenderからEXPORTしたQちゃんをUnityにIMPORTしてGameビュー内で操作する所までを行いました。

今回は、Qちゃんの移動速度に応じて、アクションごとのアニメーションと連携させていきます。

Rig設定

骨格情報のマッピング

Qちゃんのデータ(Qchan.fbx)はArmature情報も含んでいます。それをUnityの骨格情報にマッピングさせます。

Projectビューの[Qchan]を選択し、Inspectorビューで[Rig]を選択します。

Inspectorビューの[Animation Type]を[Humanoid]に変更して、[Apply]ボタンを押します。

おっと、エラーになりました…。

「Import Messagesの内容を確認しろ」とあるので、下部のメッセージを確認すると…

Invalid Avatar Rig Configuration. Missing or Invalid transform:
    Required human bone "Head" not found.

『「Head」という名前のBoneが見つからない』と書かれていますが、Blenderでは元々、「Head」という名前のBoneはないので、仕方がないでしょう…。
このまま、進めてみます。

Avator Definition の[Configure…]ボタンを押します。

赤で表示されているのはエラー箇所です。

エラーの解消

T pose化

「Character is not T pose(キャラクターはTポーズではない)」というエラーが出ているので、エラーが消える様にSceneビューのBoneを操作して腕を広げます。

※エラーが消えるのは、かなりピンポイントの位置になります。合わせるのが中々大変です。

Headの割り当て

もともと「Headがない」と言われていたので、そのエラーを解消します。

Inspectorビューで[Head]をクリックすると、確かに「Head」がNone(未割当)になっています。

ヘッドの右端の丸「⦿」を押して、一覧の中から「Spine.006.end」を選択します。

エラーが解消されました!

確定

最後に、Inspectorビュー下部の[Done]ボタンを押して、表示されるダイアログの[Apply]ボタンを押して、マッピングを確定します。

Animation設定

ProjectビューのQchanを選択し、Inspectorビューの[Animation]ボタンを押し、Animation設定を表示します。

各アクションの名前を分かりやすい名前に変更して、Unity上でのアニメーションのループ設定をします。

Clipsの「metarig|Idle」(Idleアクション)を選択し、名前を「Qchan_Idle」に変更し、[Loop Time]と[Loop Pose]にチェックを入れます。

「metarig|Run」(Runアクション)、「metarig|Walk」(Walkアクション)も同じ様に設定します。

最後にInspectrビュー下部の[Apply]ボタンを押します。

Animator Controller

各アクション(アニメーション)を管理するため「Animator Controller」を利用します。

Animator Controllerの作成

Projectビューで右クリックしてメニューを表示し、[Create]から[Animator Controller]を選択します。

Projectビューに[Animator Controller]が追加されるので、名前を「AnimatorController」とします。

状態遷移図の作成

キャラクターにどのような条件でどのようなアクションをさせるのかの状態遷移を作成していきます。

上記「AnimatorController」アイコンをダブルクリックして、Animationビューを開きます。

最初に、動いていない状態「立ち止まる(Idle)」を作成します。

[Animator]ビューで右クリックし、メニューから[Create State]の[From New Blend Tree]を選択します。

Inspectorビューで名前を「Idle」に変更し、[Motion]に「Qchan_Idle」を指定します。

同じように、「Walk」、「Run」を作成します。

次に遷移基準を設定します。

Animatorビューの左側の[Parameters]タブを開き、「Blend」パラメータ名を「Speed」に変更します。

追加した[Idle]と[Walk]、[Walk]と[Run]の間にTransition(遷移)を作成します。

各Blend Tree上で右クリックで表示されるメニューから[Make Transition]を選択し、それぞれのBlend Treeを接続します。

4つのTransitionの矢印を下記の様に作成します。

次に、各矢印を選択し、遷移条件を設定します。

遷移元から遷移先への矢印を選択し、Inspectorビューの[Has Exit Time]のチェックを外し、Conditionで[+]を押して、遷移条件を追加します。

この場合は、Speedが0.1を超えた場合に、IdleからWalkに状態が遷移する事を示しています。

他のTransition(矢印)についても、同じように遷移条件を設定します。

遷移元遷移先パラメータ条件
IdleWalkSpeedGreater(>)0.1
WalkIdleSpeedLess(<)0.1
WalkRunSpeedGreater(>)3
RunWalkSpeedLess(<)3

QちゃんにAnimator Controllerを設定

作成したAnimator ControllerをQちゃんに設定していきます。

Sceneビューを開き、Hierarchyビューで「Qchan」を選択します。

InspectorビューのAnimatorコンポーネントの[Controller]に「AnimatorController」を設定します。

スクリプトの変更

QちゃんにAnimator Controllerが設定されましたが、今のままでは、Animator Controllerの状態遷移パラメータであるSpeedは0.0のままなので、ずっと[Idle]から遷移しません。

ずっと、左右をきょろきょろ見回すばかりです…。

Qちゃんのスピードは、前回作成したスクリプトCharacterControllerSetup.csで算出していました。

        // Qちゃんの速度設定(ローカル座標)
        qChanVelocity = new Vector3(0, 0, vVal * speed);

この速度情報でAnimator ControllerのSpeedを更新してあげれば良いので、スクリプトを変更します。

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

public class CharacterControllerSetup : MonoBehaviour
{
    // 歩く(Walk)速度
    public float walkSpeed = 2.0F;
    // 走る(Run)速度
    public float runSpeed = 5.0F;
    // 旋回速度
    public float rotationSpeed = 100.0F;

    // Qちゃん(CharactorControllerコンポーネント)
    CharacterController qChan;
    // Qちゃんの速度
    Vector3 qChanVelocity;

    // Animatorコンポーネント
    Animator qChanAnimator;

    // Start is called before the first frame update
    void Start()
    {
        // Qちゃん(CharactorControllerコンポーネント)を取得する
        qChan = GetComponent<CharacterController>();

        // Animatorコンポーネントを取得する
        qChanAnimator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        // 方向キー入力値の取得
        float vVal = Input.GetAxis("Vertical"); // 「↑」「↓」キー
        float hVal = Input.GetAxis("Horizontal"); // 「←」「→」キー
        // [SHIFT]キーが押されているかどうか
        bool bShiftDown = Input.GetKey(KeyCode.LeftShift) |
            Input.GetKey(KeyCode.RightShift);

        if (vVal < 0)
        {
            // 「↓」キー入力時は0にする。(後進はしない)
            vVal = 0;
        }
        // 前進速度の設定
        float speed = walkSpeed; // 歩く速度を設定
        if (bShiftDown)
        {
            // [SHIFT]キーが押されていれば、走る速度へ変更
            speed = runSpeed;
        }

        // 速さを保存
        float currentSpeed = vVal * speed;

        // 速さをAnimator ControllerのSpeedパラメータに設定
        qChanAnimator.SetFloat("Speed",  currentSpeed);

        // Qちゃんの速度設定(ローカル座標)
        qChanVelocity = new Vector3(0, 0, currentSpeed);
        // 速度をローカル空間からグローバル空間に変換
        qChanVelocity = transform.TransformDirection(qChanVelocity);

        // 速度に時間(デルタ)を掛け移動量を求め、Qちゃんを移動
        qChan.Move(qChanVelocity * Time.deltaTime);

        // 「←」「→」キーが押されていれば、Qちゃんを旋回させる
        transform.Rotate(0, hVal * rotationSpeed * Time.deltaTime, 0);
    }
}

※qChanAnimator関連が追加した部分です。

動作確認

移動速度に応じて、Qちゃんのアクションが切り替わるかを確認してみます。

Qちゃんが、Unity上で動き回ってくれるようになりました!

※今回紹介したAnimator Controllerの状態遷移において、WalkとRunは、本来はどちらも前進なので一つの状態にまとめられますが、今回はより簡単な方法という事で分けています。


Blenderで作成したキャラクターを、Unity上で動作させるという一つの目標は達成できました。

自分で作ったキャラクターを自由に操作できる様になるのは、楽しいですね!


前の記事次の記事
No.19(Unityで動かす①)No.21(Texture Mapping①)