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

概要
最終更新日:2020/03/11 UnityのBlenderTree機能を使用してモーションを自然に切り替える方法を書いています。 主に次の項目に該当する方に向けて書いています。
- BlendTreeの作成のために必要なことが知りたい
- BlendTreeの実装方法が知りたい
- ステートとBlendTreeの違いを知りたい
サンプル
サンプルはここからダウンロードできます。 環境については以下の内容となっています。
| Unityのバージョン | Unity 2019.19f1 |
|---|---|
| 説明 | 二つのシーンを用意しています。 Experienceはこの記事の流れを一緒に実装するためのシーンです。 MotionBlendSampleはBlendTreeの使用有無による違いを確認するためのシーンです。 |
BlendTreeとは
BlendTreeとは複数のモーションをブレンドする機能で、 これによってモーションの切り替えを滑らかに行うことができます。 例えば歩くと走るモーションに対してBlendTreeを使えば、 歩いているモーションから、徐々に走り出すモーションになって、 最終的に走るモーションにすることができます。 上の動画は歩くモーションから走るモーションに切り替えています。 左がBlendTreeを使用しており、右が通常のステートマシーンを使っています。 左は歩きから徐々に走り出す動きをしていて、右は歩きから突然走りに変わります。 このようにBlendTreeを使用するとモーション切り替えを 自然な流れで行うことができます。
BlendTree作成のための準備
BlendTreeはアニメーションステートマシーンで作成するので、 まずは追加出来る状態にします。 ステートマシーンを編集するためにAnimatorControllerを作成します。 サンプルを使って実装を試す方は「Experience」シーンを使用してください。
- 上段メニュー or ProjectViewのAssetsを選択
- 表示されたメニューのCreateを選択
- 更に表示されたメニューのAnimatorControllerを選択
作成したら適当名前をつけて、Hierarchyのunitychanに関連付けします。 関連付けの方法は直接D&Dする方法とInspectorで関連付けする方法があります。 下の画像はD&Dする方法の画像です。
設定されたInspectorのAnimatorのController項目が作成した AnimatorControllerの名前になっていることを確認してください。
関連付けが完了したら作成したAnimatorControllerの ステートマシーン編集画面を表示します。
- 上段メニューのWindowを選択
- 表示されたメニューのAnimationを選択
- 更に表示されたメニューのAnimatorを選択
画面が表示されたら通常のステートを作成します。
- ステートマシーン画面のステート以外の場所で右クリック
- 表示されたメニューのCreate Stateを選択
- 更に表示されたメニューのEmptyを選択
作成されたステートに待機のモーションを設定します。
- 作成されたステートをクリックしてInspectorに情報を表示する
- 名前をWaitに変える
- Motion項目の右端の◎をクリック
- 表示されたウィンドウから「WAIT00~WAIT04」のどれかを選ぶ
ステートの設定が終了したら、パラメータを一つ追加します。
- 画面左上のParametersをクリック
- Parametersのすぐ下にある「+」記号クリック
- 表示されたメニューから「Float」を選択
- 作成されたパラメータの名前はSpeedにする
![]()
これでAnimatroの設定は終了したので、実行をしてみてください。 UnityChanが待機の動きをしたら完了です。
![]()
BlnedTreeの作成方法
BlendTreeの作成はステートを作成する際のメニューで 「From New Blend Tree」を選択すれば作成できます。
- ステートマシーン画面のステート以外の場所で右クリック
- 表示されたメニューのCreate Stateを選択
- 更に表示されたメニューのFrom New Blend Treeを選択
BlendTreeを作成したら、Inspectorから名前を変更します。 今回は歩きと走りのモーションをブレンドするので「WalkAndRun」とします。
名前の変更が完了したらWaitステートとのTransition設定を行います。
- ステート or BlendTreeを右クリック
- 表示されたメニューのMake Transitionを選択
- 矢印つきの線を繋げたいステートの上に持っていきクリック
- ステートとBlendTreeの両方に対して行う
![]()
Transitionの作成が完了したら、設定の変更を行うので、 矢印をクリックして選択状態にします。
Inspector項目の「Has Exit Time」のチェックを外してください。 この項目にチェックが入っているとモーション切り替えの際に 終了するまで変わらないようになります。 待機から移動はモーションの終了を待つ必要がないので、 チェックは外しておきます。
「Has Exit Time」のチェックを外したらTransition条件の設定をします。 設定は以下の内容を指定します。
| 遷移元 | 遷移先 | 使用パラメータ | 条件 | 値 |
|---|---|---|---|---|
| Wait | WalkAndRun | Speed | Greater | 0.1 |
| WalkAndRun | Wait | Speed | Less | 0.1 |
これでBlendTreeの作成と設定に必要な対応は終了です。
BlendTreeの実装
作成が完了したので先に実装を行い、その後で各項目や構成などの説明をします。 先ほど作成したBlendTreeのプレートをダブルクリックしてください。 クリックすると設定画面に移動します。画面内にあるプレートを右クリックして表示されたメニューから 「Add Motion」を選択してください。
選択すると分かりづらいですが、BlendTreeの右端に〇が一つ増えます。
これはモーションを追加できるスロットと考えてください。 このスロットにどのモーションを追加するかはInspectorで決めます。 InspectorのMotion項目に一つだけ設定項目があるので、 その項目「◎」をクリックして「WALK00_F」を設定します。
設定するとBlendTreeのプレートと繋がる新しいプレートが作成されます。
WALK00_Fを追加したやり方をもう一度行ってください。 今度はモーションに「RUN00_F」を設定します。
これでステートでの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が待機から徐々に歩き出して、
最終的に走るアニメーションになります。
作成したら適当名前をつけて、Hierarchyのunitychanに関連付けします。
関連付けの方法は直接D&Dする方法とInspectorで関連付けする方法があります。
下の画像はD&Dする方法の画像です。
設定されたInspectorのAnimatorのController項目が作成した
AnimatorControllerの名前になっていることを確認してください。
関連付けが完了したら作成したAnimatorControllerの
ステートマシーン編集画面を表示します。
画面が表示されたら通常のステートを作成します。
作成されたステートに待機のモーションを設定します。
ステートの設定が終了したら、パラメータを一つ追加します。
これでAnimatroの設定は終了したので、実行をしてみてください。
UnityChanが待機の動きをしたら完了です。
BlendTreeを作成したら、Inspectorから名前を変更します。
今回は歩きと走りのモーションをブレンドするので「WalkAndRun」とします。
名前の変更が完了したらWaitステートとのTransition設定を行います。
Transitionの作成が完了したら、設定の変更を行うので、
矢印をクリックして選択状態にします。
Inspector項目の「Has Exit Time」のチェックを外してください。
この項目にチェックが入っているとモーション切り替えの際に
終了するまで変わらないようになります。
待機から移動はモーションの終了を待つ必要がないので、
チェックは外しておきます。
「Has Exit Time」のチェックを外したらTransition条件の設定をします。
設定は以下の内容を指定します。
画面内にあるプレートを右クリックして表示されたメニューから
「Add Motion」を選択してください。
選択すると分かりづらいですが、BlendTreeの右端に〇が一つ増えます。
これはモーションを追加できるスロットと考えてください。
このスロットにどのモーションを追加するかはInspectorで決めます。
InspectorのMotion項目に一つだけ設定項目があるので、
その項目「◎」をクリックして「WALK00_F」を設定します。
設定するとBlendTreeのプレートと繋がる新しいプレートが作成されます。
WALK00_Fを追加したやり方をもう一度行ってください。
今度はモーションに「RUN00_F」を設定します。
これでステートでのBlendTreeの実装は完了です。
実際にアニメーションとして動かすにはスクリプトの実装も必要です。
