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のプレートをダブルクリックしてください。 クリックすると設定画面に移動します。 画面内にあるプレートを右クリックして表示されたメニューから 「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が待機から徐々に歩き出して、
最終的に走るアニメーションになります。