BlendTreeで自然にモーションを切り替える

unity_chan_logo

概要

最終更新日:2020/03/11

UnityのBlenderTree機能を使用してモーションを自然に切り替える方法を書いています。
主に次の項目に該当する方に向けて書いています。
  • BlendTreeの作成のために必要なことが知りたい
  • BlendTreeの実装方法が知りたい
  • ステートとBlendTreeの違いを知りたい

サンプル

サンプルはここからダウンロードできます。
環境については以下の内容となっています。

開発環境
Unityのバージョン Unity 2019.19f1
説明 二つのシーンを用意しています。
Experienceはこの記事の流れを一緒に実装するためのシーンです。
MotionBlendSampleはBlendTreeの使用有無による違いを確認するためのシーンです。




BlendTreeとは

BlendTreeとは複数のモーションをブレンドする機能で、
これによってモーションの切り替えを滑らかに行うことができます。

例えば歩くと走るモーションに対してBlendTreeを使えば、
歩いているモーションから、徐々に走り出すモーションになって、
最終的に走るモーションにすることができます。



上の動画は歩くモーションから走るモーションに切り替えています。
左がBlendTreeを使用しており、右が通常のステートマシーンを使っています。
左は歩きから徐々に走り出す動きをしていて、右は歩きから突然走りに変わります。
このようにBlendTreeを使用するとモーション切り替えを
自然な流れで行うことができます。

BlendTree作成のための準備

BlendTreeはアニメーションステートマシーンで作成するので、
まずは追加出来る状態にします。
ステートマシーンを編集するためにAnimatorControllerを作成します。
サンプルを使って実装を試す方は「Experience」シーンを使用してください。
  1. 上段メニュー or ProjectViewのAssetsを選択
  2. 表示されたメニューのCreateを選択
  3. 更に表示されたメニューのAnimatorControllerを選択
unity_0266

作成したら適当名前をつけて、Hierarchyのunitychanに関連付けします。
関連付けの方法は直接D&Dする方法とInspectorで関連付けする方法があります。
下の画像はD&Dする方法の画像です。

unity_0267

設定されたInspectorのAnimatorのController項目が作成した
AnimatorControllerの名前になっていることを確認してください。

unity_0268

関連付けが完了したら作成したAnimatorControllerの
ステートマシーン編集画面を表示します。
  1. 上段メニューのWindowを選択
  2. 表示されたメニューのAnimationを選択
  3. 更に表示されたメニューのAnimatorを選択
unity_0263

画面が表示されたら通常のステートを作成します。
  1. ステートマシーン画面のステート以外の場所で右クリック
  2. 表示されたメニューのCreate Stateを選択
  3. 更に表示されたメニューのEmptyを選択
unity_0264

作成されたステートに待機のモーションを設定します。
  1. 作成されたステートをクリックしてInspectorに情報を表示する
  2. 名前をWaitに変える
  3. Motion項目の右端の◎をクリック
  4. 表示されたウィンドウから「WAIT00~WAIT04」のどれかを選ぶ
unity_0265

ステートの設定が終了したら、パラメータを一つ追加します。
  1. 画面左上のParametersをクリック
  2. Parametersのすぐ下にある「+」記号クリック
  3. 表示されたメニューから「Float」を選択
  4. 作成されたパラメータの名前はSpeedにする
unity_0273
unity_0274

これでAnimatroの設定は終了したので、実行をしてみてください。
UnityChanが待機の動きをしたら完了です。

unity_0269

BlnedTreeの作成方法

BlendTreeの作成はステートを作成する際のメニューで
「From New Blend Tree」を選択すれば作成できます。
  1. ステートマシーン画面のステート以外の場所で右クリック
  2. 表示されたメニューのCreate Stateを選択
  3. 更に表示されたメニューのFrom New Blend Treeを選択
unity_0270

BlendTreeを作成したら、Inspectorから名前を変更します。
今回は歩きと走りのモーションをブレンドするので「WalkAndRun」とします。

unity_0277

名前の変更が完了したらWaitステートとのTransition設定を行います。
  1. ステート or BlendTreeを右クリック
  2. 表示されたメニューのMake Transitionを選択
  3. 矢印つきの線を繋げたいステートの上に持っていきクリック
  4. ステートとBlendTreeの両方に対して行う
unity_0271
unity_0272

Transitionの作成が完了したら、設定の変更を行うので、
矢印をクリックして選択状態にします。

unity_0275

Inspector項目の「Has Exit Time」のチェックを外してください。
この項目にチェックが入っているとモーション切り替えの際に
終了するまで変わらないようになります。
待機から移動はモーションの終了を待つ必要がないので、
チェックは外しておきます。

unity_0276

「Has Exit Time」のチェックを外したらTransition条件の設定をします。
設定は以下の内容を指定します。

遷移元 遷移先 使用パラメータ 条件
Wait WalkAndRun Speed Greater 0.1
WalkAndRun Wait Speed Less 0.1
unity_0299 これでBlendTreeの作成と設定に必要な対応は終了です。

BlendTreeの実装

作成が完了したので先に実装を行い、その後で各項目や構成などの説明をします。
先ほど作成したBlendTreeのプレートをダブルクリックしてください。
クリックすると設定画面に移動します。

unity_0278

画面内にあるプレートを右クリックして表示されたメニューから
「Add Motion」を選択してください。

unity_0280

選択すると分かりづらいですが、BlendTreeの右端に〇が一つ増えます。

unity_0281

これはモーションを追加できるスロットと考えてください。
このスロットにどのモーションを追加するかはInspectorで決めます。
InspectorのMotion項目に一つだけ設定項目があるので、
その項目「◎」をクリックして「WALK00_F」を設定します。

unity_0282

設定するとBlendTreeのプレートと繋がる新しいプレートが作成されます。

unity_0283

WALK00_Fを追加したやり方をもう一度行ってください。
今度はモーションに「RUN00_F」を設定します。

unity_0284

これでステートでのBlendTreeの実装は完了です。
実際にアニメーションとして動かすにはスクリプトの実装も必要です。

スクリプト実装

BlendTreeを動かすためにスクリプトが必要なので、作成してHierarchyの
Unitychanに関連付けを行ってください。
スクリプトで実装する処理は通常のステートを動かす処理と変わりません。
AnimatorをGetComponentで取得してSetFloatやSetBoolなどで
ステートのパラメータの値を変更して、アニメーションを切り替えます。

Animator Animator; // メンバ変数
    
// Start is called before the first frame update
void Start()
{
	Animator = GetComponent<Animator>();
}

// Update is called once per frame
void Update()
{
	float current_speed = Animator.GetFloat("Speed");

	// モーション切り替えを10秒で完結させる
	Animator.SetFloat("Speed", current_speed + Time.deltaTime * 0.1f);
}

これで、実装は完了したので、実行すればUnityChanが待機から徐々に歩き出して、
最終的に走るアニメーションになります。