前回は、ユニティちゃんを歩かせることを目標に、Mecanimのステートマシンとアニメーションパラメータについて解説しました。 今回はまず アニメーションブレンドを解説して、シームレスに歩いたり走ったりするユニティちゃんを作っていきます。また、後半はアニメーションレイヤーボディマスクを解説して、走っているユニティちゃんに表情をつけていきます。

今回も前回までのUnityプロジェクトを引き続き使用します。 ※本特集は、バージョン1.1.1までのユニティちゃんアセットを対象としています。

複数のアニメーションを混ぜる -アニメーションブレンド-


アナログスティックの傾きでユニティちゃんの走る速度を制御できるようにしてみましょう。 アナログスティックの傾き度合いをユニティちゃんに反映させるためには、歩きと走りの中間のが表現できなければいけません。これを実現するためには アニメーションブレンド を用います。


ブレンドツリーを作成する

まずはじめに ブレンドツリー を作成しましょう。 ブレンドツリー は、アニメーションブレンドにおいてそのブレンド設定を保持します。 ステートを右クリックし、[Create New BlendTree in State] を選択することで、そのステート上にブレンドツリーが作成されます。今回は、前回使用したWalkステートに作成しましょう。 作成すると、Motionが Blend Tree で上書きされます。


ブレンドの設定をする

ブレンドツリーが設定されているステートをダブルクリックすると、 Inspector と Animator ウィンドウがブレンドツリーのものに変わります。ここでブレンドの設定をしていきます。

ブレンドツリーの設定項目は主に種類あります。 どのようなブレンドを適用するかを設定する Blend Type 、どのパラメータでブレンドを制御するかを設定する Parameter、どのアニメーションクリップをブレンドするかを設定する Motion と、そのアニメーションの基点となるパラメータの値を設定する Threshold です。

まずは Blend Type を設定します。今回ブレンドに関係してくるパラメータは「ユニティちゃんの速度」の1つだけなので、1D を選択します。

次は Parameter を設定します、この時点でブレンドに使用できるアニメーションパラメータは作成していないので、新しく Speed というアニメーションパラメータを追加しましょう。種類は Float です。すると Parameter に Speed の選択肢が追加されるます。これを選択してください。

次は Motion と Threshold を設定します。ここには、ブレンドに使用したいアニメーションクリップを追加し、それぞれの基点となるパラメータの値を設定します。一つ目の Motion は Assets\Locomotion\Animations\DefaultAvatar@WalkForward NtrlFaceFwd.fbx の Walk, 2つ目の Motion は Assets\Locomotion\Animations\DefaultAvatar@RunForward NtrlFaceFwd.fbx の Run を設定します。

次に Threshold の値を設定します。今回はアニメーションパラメータの値と実際の歩行速度を合わせたいので、Automate Threshold のチェックを外し、現れる Compute Thresholds から、 Speed を選択します。こうする事によって、 Threshold を移動速度に応じた適切な値に設定してくれます。

今回の場合、 Threshold の値がそれぞれ 1.555748, 5.667756 となるのを確認しましょう。

これでブレンドの設定は完了です。

ここまでの設定ができていれば、Inspectorは上図のようになっているはずです。


制御周りの変更

さて、前回は↑キーを押している間前進するという制御を行っていたので、そこに変更を加えなければいけません。 今回は、ジョイスティックのY値をベースに計算される Speed の値が0.5より大きい時は前進、0.5未満の時は停止という制御を行います。 (前進時の速度の制御は上の項で既に済ませました)

前回、「Do Walk が true なら Walk へ、 false なら Idle へ」という遷移条件を設定しました。 これを「Speed が 0.5 より大きい時 Walk へ、 0.5 より 小さい時 Idle へ」という条件に変更してください。 前回作成した Do Walk パラメータは不要になるので削除しておきましょう。 また、まれに条件の変更が正しく反映されない場合があります。その時は一旦遷移条件を削除し、新しく設定しなおしてください。

また、 UnityChanController.cs スクリプトも合わせて以下のように書き換えます。

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Animator))]
public class UnityChanController : MonoBehaviour {

	private const float SPEED = 6.0f;

	private Animator animator;
	private int speedId;
	// Use this for initialization
	void Start () {
		animator = GetComponent<Animator> ();
		speedId = Animator.StringToHash ("Speed");
	}
	
	// Update is called once per frame
	void Update () {
		float speed = Input.GetAxis ("Vertical") * SPEED;

		//ジョイパッドが手元にない人への救済処置
		float period = SPEED / 9f;
		if (Input.GetKey(KeyCode.Alpha9)) {
			speed = period * 9;
		}else if (Input.GetKey(KeyCode.Alpha8)) {
			speed = period * 8;
		}else if (Input.GetKey(KeyCode.Alpha7)) {
			speed = period * 7;
		}else if (Input.GetKey(KeyCode.Alpha6)) {
			speed = period * 6;
		}else if (Input.GetKey(KeyCode.Alpha5)) {
			speed = period * 5;
		}else if (Input.GetKey(KeyCode.Alpha4)) {
			speed = period * 4;
		}else if (Input.GetKey(KeyCode.Alpha3)) {
			speed = period * 3;
		}else if (Input.GetKey(KeyCode.Alpha2)) {
			speed = period * 2;
		}else if (Input.GetKey(KeyCode.Alpha1)) {
			speed = period * 1;
		}
		animator.SetFloat (speedId, speed);
	}
}

これでブレンドの適用は完了です。実際に動かしてみましょう。

アナログスティックを傾けると、ユニティちゃんが走りました!強く倒すほど速く走ります!!

※ジョイパッドが手元にない人はキーボードの1から9キーで制御できます。


部位ごとにアニメーションを適用する -アニメーションレイヤー、ボディマスク-


次は、全力で走っているときのみ笑顔になる制御を行ってみたいと思います。「走り”ながら”笑顔になる」 のように、複数のアニメーションを同時に行うときは アニメーションレイヤーボディマスクを使います。


アニメーションレイヤーを作成する

まずはを表情用にアニメーションレイヤーを作成します。

Animatorウィンドウの左上を見てください。 Layers という項目があります。ここにある Base Layer が現在編集中のレイヤーです。+ を押して新しいレイヤーを追加しましょう。

このようにMecanimでは、ひとつのAnimatorで複数のステートマシンを同時に制御することができます。これがアニメーションレイヤーです。 わかりやすいように Face Layer と名前をつけておきましょう。


ボディマスクを作成する

アニメーションを重ねあわせるには、どの部位のアニメーションを重ねあわせるのかを設定する必要があります。それを担うのがボディマスクです。

[Assets] -> [Create] -> [Avatar Mask] を選択して、新しいボディマスクを作成しましょう。名前は「UnityChanFaceMask」としました。


ボディマスクを設定する

作成したボディマスクを選択してください。Inspectorがボディマスクの設定画面に変わります。

今回はユニティちゃん用のボディマスクを作成したいので、ボディマスクにユニティちゃんのスケルトン構造をインポートする必要があります。

まず、今つくろうとしているボディマスクは表情用なので、体の制御は行ってほしくありません。なのでInspector 内の Humanoid を展開すると表示される緑色の部位を、すべてクリックして赤色(無効)にします。これを無効にしないと体のアニメーションまでブレンドされてしまい、正しい動作になりません。

次に Transform を展開して、 Use skeleton from の右にある丸をクリックしてください。出てくる一覧から UnitychanAvatar を設定し、Import skeleton ボタンを押します。 ※Avatar は、関節に代表されるモデルの構造を保持しているオブジェクトです。

インポートが完了すると、ユニティちゃんの体の構造がツリー状に表示されます。

アニメーションして欲しいのは、表情に関わる部位のみなので、以下の部位以外のチェックは外してしまいましょう。

・BLW_DEF (まゆ) ・EYE_DEF (まぶた) ・EL_DEF (まつ毛) ・MTH_DEF (口)

これでボディマスクの設定は完了です。

レイヤーの設定をする

今作ったボディマスクをレイヤーに適用します。

先ほど作った Face Layer の設定項目の中に Mask という項目があります。ここに今作ったボディマスクを設定してください。また、 Weight という項目があります。これはアニメーションレイヤーをブレンドするときの重みです。今回は 1 にしましょう。

これでアニメーションレイヤーの設定は完了です。表情のアニメーションはFace Layerが一任し、それ以外のアニメーションはBase Layer が担っている状態です。

では前回のチュートリアルをもとに、 「Speed が 5.5 より大きい 時は笑顔。それ以外の時はデフォルト。」というステートマシンを作成しましょう。

平常時の表情アニメーションは Assets\UnityChan\FaceAnimation\defult@unitychan.anim 。笑顔のアニメーションには 同ディレクトリの smile1@unitychan.anim を利用します。 設定が終わると以下のようになります。

それでは実行してみましょう

ユニティちゃんが笑顔で走りました!!


おわりに


今回はMecanim基本編第2弾として、アニメーションブレンド, アニメーションレイヤー, ボディマスクについて触れました。これらの機能は”ながら”を実装するのにとても役に立ちます。うまく活用して、よりイキイキとしたキャラクターに仕上げましょう。

Mecanim基本編は今回で終わりです。Mecanimを使えばアニメーションの大部分がスクリプトなしで制御できることがわかっていただけたかと思います。次回は番外編として、Mecanimとは別の機能をいくつか利用して、この特集で組んだユニティちゃんを更にブラッシュアップしていきます。お楽しみに!