BlendTreeの基本的な内容のまとめ

unity_chan_logo

概要

最終更新日:2020/03/12

UnityのBlenderTreeの基本部分をまとめた記事です。
主に次の項目に該当する方に向けて書いています。
  • BlendTreeの構成について知りたい
  • モーションがブレンドされる流れが知りたい
  • 重みとは何か知りたい
  • しきい値とは何か知りたい
  • BlendTreeのInspectorの各項目の内容を知りたい
この記事は仕組みの説明をメインとしています。
実装方法についてはこちらに書いています。



BlendTreeとは

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

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



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

BlendTreeの構成

BlendTreeはその名の通り木構造になっており、
最初にあったプレートは木構造の根っこです。
木構造の要素の事をノードと呼ぶので、これ以降はプレートの事をノードと呼びます。
また、根っこにあたるノードのことをルートと呼びます。

unity_0285

木構造はノードを新しいノードをつないでいきます。
繋がったノード間でルートに近いノードを「親」と呼び、
ルートから遠いノードを「子」と呼びます。

unity_0286

上の図の親子関係は次の通りです。

BlendTree WALK00_F
BlendTree RUN00_F
子ノードを持てるノードはBlendTreeだけです。 MotionにはBlendTreeを追加することはできないので注意してください。

アニメーションステートマシーンの構造

BlendTreeのWalkAndRunをダブルクリックするとBlendTree編集画面に移動しますが、
これはEntryなどがある画面からWalkAndRunに移動しています。

アニメーションステートマシーンはLayerと呼ばれる階層構造になっており、
最初の画面は「Base Layer」と名付けられています。
このLayerにBlendTreeを作るとBaseLayerとは別のLayerが作成されます。
BaseLayerの上か下に新しいLayerが出来るイメージです。

unity_0300

アニメーションステートマシーンのLayerは親子関係になっており、
Layer間の情報のやり取りは親子関係にあるLayerしかできません。
(主に子から親に情報を渡すようになっています)

unity_0301

ステートマシーンのLayer間の移動方法

画面上でのLayer間の移動方法は二つあり、その内の一つは作成の時に行った、
BlendTreeをダブルクリックすることです。
BlendTree編集画面ではBlendTreeが保持する全てのノードを表示されていますが、
その中のBlendTreeをダブルクリックするとそのノード以降の情報だけが表示されます。

unity_0305

もう一つは、画面上段にあるLayerリストのどれかをクリックすることです。
Layerリストは表示されている画面までのLayerを順番に表示しています。

unity_0302

上の絵の赤枠の内容は「BaseLayer => WalkAndRun」の順番に並んでいるので、
BaseLayerからWalkAndRunのLayerに移動したということがわかります。
このLayerの名前をクリックしたら、そのLayerに移動することができます。
例えばBaseLayerをクリックしたら、BaseLayerの画面に移動します。

unity_0303

BlendTreeの流れ

BlendTreeは子供から親に向かってブレンドしたモーション情報を渡していきます。

unity_0287

図の流れは以下の通りです。
  1. 方向別の歩きモーションのブレンドを行い、結果をWalkノードに渡す
  2. 方向別の走りモーションのブレンドを行い、結果をRunノードに渡す
  3. ①と②で渡された結果でWalkとRunのブレンドを行い、結果をMoveに渡す
  4. ③の結果を今回のモーションとして使用する

BlendTreeノードのInspector項目

BlendTreeノードでは以下の項目を設定することができます。

unity_0279
  1. ノード名:
    ノードの名前
  2. BlendType:
    ブレンドの種類 1Dは1種類のパラメータを使用してブレンドを行う
  3. Parameter:
    ブレンドで使用するパラメータ
  4. ブレンドグラフ:
    モーションの値に基づいたブレンド情報を可視化したグラフ
  5. Motion:
    ブレンドするモーション or BlendTreeノード
    ※各項目は別途説明
  6. Automate Thresholds:
    自動しきい値設定:しきい値の範囲をモーションの数で均等に重みの設定をする
  7. Compute Thresholds:
    モーションに設定されている情報を使用してしきい値を設定する
  8. Adjust Time Scale:
    モーションの速度変更によるブレンド調整反映とリセット設定ができる

重みとは

重みとは各モーションのブレンドの割合です。
例えば歩きの重みが50%、走りの重みが50%の場合は、
歩きと走りが半々でブレンドされるため、小走りに近い動きになる可能性が高いです。
※可能性と書いているのはモーションの内容によるからです。

unity_0290

重みのルールとしてブレンドするモーションの割合の合計は必ず100%にします。
100%を超えたり、下回ったりする設定にはしません。

歩きの重み 走りの重み 合計 ルールの合否
50% 50% 100% 合格
20% 50% 70% 不合格
0% 100% 100% 合格
90% 20% 110% 不合格
上の表では不合格を表すために100%以外になる値が設定していますが、 実際は設定したしきい値に基づいて、Unityが重みの計算をしてくれるので、 開発側がそこまで気にする必要はありません。 ただし、同じ値のしきい値を設定しないでください。 unity_0306 重みの計算がおかしくなり、モーションがバグります。 しきい値については次の項目で説明します。

しきい値とは

BlendTreeにおけるしきい値とは重みが100%になるパラメータの値です。
重みはパラメータの値によって変動していきますが、
必ず各モーションの重みが100%になるパラメータの値があります。
この値がしきい値です。
下の図のように各モーションのグラフのY軸の位置が最も高い位置は
しきい値(Threshold)が設定されている場所になっています。

unity_0289

Motion項目

BlendTreeのMotionの項目では以下の内容を設定できます。
  1. Motion
  2. Threshold
  3. 速度
  4. ミラーリング設定
  5. モーションの追加と削除
unity_0291

Motion

Motionはブレンドするモーションを設定できます。
設定は「◎」を押すことでリストが表示されるので、そこから選択できます。

unity_0292

Threshold

Theasholdではしきい値の設定を行います。
「しきい値とは」の項目で書いていますが、しきい値はモーションの重みが
最大値になるパラメータの値です。

unity_0293
unity_0294

上の絵のようにしきい値とパラメータの値が同じ場合、重みが100%になるので
設定しているモーションがそのまま使われます。

速度

モーションの速度を変更することができます。
3にしたら3倍になり、0.5にした通常の0.5倍になります。

unity_0307


ミラーリング設定

ミラーリング設定のON/OFFを設定できます。
ミラーリングとはモーションを左右反転して使う手法の事です。

unity_0295

上の絵は勝利モーションのミラーリング有りと無しの絵ですが
左右反転していることが分かります。

モーションの追加と削除

「+」「ー」でモーションやBlendTreeノードの追加や削除ができます。
追加をする場合は、「+」をクリックするとモーションかBlendTreeかを選択する
メニューが表示されるのでどちらかを選ぶと新しい枠が追加されます。

unity_0296
unity_0297

削除は対象となるモーションを選択してから、「ー」をクリックすれば削除できます。

unity_0298

まとめ


  • BlendTreeは木構造になっている
  • アニメーションステートマシーンはLayerで管理している
  • モーションブレンドは子ノードから順番に行われる
  • 重みとはモーションをブレンドする割合のこと
  • しきい値とは重みが100%になるパラメータの値の事