メカニム

メカニムは何をするものなのか?


プロポーションやリグの異なるキャラクタの差異をアバターで吸収しモーションミキシング、アニメーションレイヤー、トランジションをステートマシンを基準にして管理、状態遷移をデザイナーがUnity上に構築、アセットとして保存出来ます。今までステートマシンの構築はプログラマーの領域の仕事でしたが、それをユニティ上でデザイナーが行う事ができます

<レガシーと比べてのメリット>
  • アセットにintやfloat、bool、Direction等の制御用パラメータを持たせることができます
  • 遷移によるアニメーションクリップと他のアニメーションクリップの間はトラジションとしてunityが自動的に補間する(コードを書かなくて良い)
  • 複数のモーションをリグ単位で個別にマスキングしながらミキシングできる

こんな感じのものが作れます

メカニムと他オーサリングソフトの連携。動画の中ではメカニムの状態遷移の設定の仕方も説明しています
公式のメカニムの日本語マニュアルは少し分りにくいのでこちらを見ることをお勧めします


3dsMAXのデータをどのようにしてUnityに移すか?


<複数台のPCで作業する、もしくは不特定の複数人でチームを組んでゲームを作る場合>
3dsMAXから、書き出し -> FBXファイル出力を利用します(環境的に、MAXファイル周辺はunityプロジェクト内に配置しません)
FBXエクスポートは基本設定で出力しUnityのアセットフォルダ内に配置してImportSettingsで必要な調整を行います。FBXファイルの読み込みに特別なライセンスは必要ありません。FBX形式はUnityの標準機能として扱う事が可能なので不特定多数のチーム作業に向いています

<環境がチーム全員で統一できるような場合>
MAXファイルを直接unityのアセットフォルダ内に配置して自動インポートを利用します。自動インポートの後、ImportSettingsで必要な調整を行います
unityはアセットフォルダ内に配置されたMAXファイルを見つけるとFBXインポーターを使用して変換し、変換後のデーターをプレハブに含め表示します
MAXファイルからのインポートにはマシン内に3dsMAXのライセンスが必ず必要です。ライセンスを持たないマシンではMAXファイルを読み込むことは出来ません
その意味でチーム全員が3dsMAXを所有しているなどのリッチな環境で無い限りチーム作業には向かないやり方です

個人的な考えではMAXファイルを使っても、それほど能率が上がるようには思えません。むしろFBXの方がMAXファイル更新時に無駄なインポートによる処理の遅延等を避ける事ができスムーズに作業できるように思います。その意味で前者の方法がお勧めです

メカニム作成のワークフロー



FBX出力


FBXの出力オプション設定は工場出荷時のデフォルトでOK(アニメーションやスキンなどすべてが出力される)
不必要な要素は次のワークフローのImportSettingsの設定で省く事が可能です
モーションの出力時、ファイル名を「@walk」や「@idle」などの「@~~」にするとモーションクリップファイルとして認識され
スキンメッシュのAvater設定時、同フォルダ内に配置された他のモーションファイルに対してリグの自動割り当ての機能を利用できます

リグの設定が終わった後、Update reference clipsをクリックで自動割り当て
mecanim_updateRef.jpg

メッシュの設定


<公式資料>

メッシュに関して特殊な事情が無い限り特に設定を変える必要は無いと思います

アバターやリグの設定


<公式資料>

ヒューマノイド系には Humanoid を設定します。非ヒューマノイド系には Generic を設定します
Legacyは旧システムなので過去のプロジェクトを扱う必要がある場合を除いて使用しない事が公式から推奨されています

インスペクタ、Rigタブ内のAnimartionTypeをHumanoidにしてapplyすると Avatar設定が自動で行われる
正常に設定が行われるとチェックマークが付き、異常を検知すれば×マークが表示される
ここでの設定成功は単に必要なボーンがすべてマッチングされたことを意味するので細かい設定は適時手動で行う必要がある

Configure ...で メニューに入れる。エディタはシーンを保存するように求めるのでSaveすること

これとは別に Avatar Definition の Copy from other Avatar で別モデルでセットアップされたアバターコンフィグ設定を割り当てる事ができます
主にモーション用のFBXにメッシュオブジェクトで設定したAvaterを割り当てる事が多いと思います

マッスルセットアップで確認


<公式資料>

musclesではプレビューで手足や胴をねじったりしてスケルトンに動きを与えスキンが正常に割り当てられているかプレビューで確認を出来ます
また激しくプロポーションの異なるキャラクタに共通リグを割り当てた際、回転角度の「効きの度合い」等を変更できます

アニメーションの設定

unityのImportSettingsで重要な部分

<公式資料>

ここではアニメーションのループの整合性や、トランジション時の親軸の角度ズレ、座標ズレの整合性を補正可能です
クリップの開始時点と終了時点で親の各座標にズレがあった場合、モーションの遷移を重ねているとズレが蓄積していき
キャラクターの位置や向きが変化してしまう現象が発生します

また、unityは例えば0~60フレームの使用が前提であったファイルを部分的に切り取り利用する、例えば20~40フレームを利用する場合があります
この場合、モーションの元クリップ自体が整合性が取れたモーションなら問題ありませんが、まず補正が必要になります
これらの補正の設定を行うのがこのセクションであり非常に重要な要素です

mecanim_out.jpg

基本的に赤信号はモーション素材の作り直し(リテイク)
黄色信号でゲーム素材として利用可能、時間があれば全部緑にするべき という感じです
(ミクミクダンスのようなリアルタイムポリゴンによるムービーシーンを作る場合はこの限りでない)

<補足>
各要素の信号の意味と整合性の補正

  • LoopPose
信号はクリップのループの整合性を見ています。青はループが繋がる。赤色はループが繋がらない事を意味しています
LoopPoseをオンにするとクリップの開始時と終了時の間でunityのトランジションがかかります(大抵、より滑らかにループが繋がったように見えます)
このオプションはどんな場合でも絶対にオンにしていた方が良いと思います


  • RootTransformRotation
信号はルート(リグの一番上にある親オブジェクト。3dsMAXのbipedで言えば腰の位置にあるBip01)の「向き(角度)」がループで繋がるかどうかを見ています
クリップの開始時と終了時のBip01の角度が大きく違えば「ループは繋がらない」と判断し赤信号になります

これとは別に他クリップとモーション間のトランジションの関係上「回転の関係を揃えておく」必要があります。例えば・・・

@idleクリップはおおむね全時間においてbip01は+Z軸方向に向いている
@Attack時、bip01の開始時の角度がZ軸方向に対し-90度の方向に向いている(つまり攻撃方向が横を向いちゃってる)

このような場合があるとします
この際はトランジションがスムーズに繋がるように@Attack側にZ軸方向が0度となるような「補正」が必要になります
(通常、ゲーム的に操作するキャラクタの正面に攻撃したい場合が多いと思います)
この補正には Based Upon を利用します。これにより「ルートのトランスフォームの回転(RootTransformRotation)」を

Originalならオーサリングソフトで作ったそのままの向きに
BodyOrientationなら上半身基準(pelvis~spin?)で体の方向をunityのZ軸0度方向に向けて補正します
必要であればoffsetで角度を微調整できます

Bake into Pose をオンにするとルートの回転をボーンの動作に焼きこみルートの回転をクリアにします
(これにより遷移の繰り返しで角度がずれていく現象が防げる)オフの場合は生のデータになってしまいます

推奨はBakeintoPoseオン、BasedUponオリジナルで。オーサリング側でクリップ素材のループを繋げ方向を揃えておく事です(信号緑)


  • RootTransformPosition(Y)
信号はルートの高さ(Bip01?)がループで繋がるかどうかを見ています
クリップの開始時と終了時のBip01の高さが大きく違えば「ループは繋がらない」と判断し赤信号になります
腰の位置、特に高さに関してはクリップごとに違うのが当然なのでオーサリング側の編集で気を付けることはないと思います(空中浮遊以外は)
推奨はBakeintoPoseオン、BasedUponをFeet。これにより足を基準にしてルートの高さが補正されます


  • RootTransformPosition(XZ)
信号はルート(Bip01?)の平面上の位置がループで繋がるかどうかを見ています
クリップの開始時と終了時のBip01の位置が大きく違えば「ループは繋がらない」と判断し赤信号になります
推奨はBakeintoPoseオン、BasedUponをCenter of Mass。これにより重心を基準にしてルートの平面位置が補正されます

全ての補正はスタートフレームに対してかかります
つまり例えば重心を基準にした補正はスタートフレームのリグの状態を参考に重心が決定されています

全体に言える事ですがBakeintoPoseオンにすると、該当するルートの変換はクリアになり、ボーン側にすべての動作が焼きこまれます
これにより遷移の積み重ねによるルートの位置ズレを防ぐ事が出来るので全ての要素をオンにするのが運用的にやり易いと思います
クリップ素材も信号がすべて緑色になった素材を使う事を推奨します


アニメータコントローラ設定


<公式資料>

アニメーターコントローラーを作成してAnimatorコンポーネントのContorollerに割当てる
Assets ->Create -> Animator Controller で作成
Animator Controllerをダブルクリックすると編集モードのウインドウへ移動できる

<tips>
アニメーションの遷移作成時は「2by3」のレイアウト表示がおススメです。遷移の様子の確認とアニメーションが見比べ、内容の編集も可能です
尚、ゲームの再生中でもAnimatorに関連するパラメーターの変更が例外的に可能です(内容の変更が再生停止後も捨てられない)

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


<公式資料>

遷移先を示す矢印はクリックする事でトラジションやコンディションを設定するインスペクタを開く事ができます
AnimatorとScene、もしくはGameウインドウは同時に開いておくと良い。遷移した際のプログレスバーや遷移方向が矢印でアニメーション表示され状態を把握できます

  • Solo
Soloの場合、遷移先が2箇所以上の場合、どちらか片方のみ遷移します

  • Mute
遷移が無効化される


トラブルシューティング


  • メカニムのモーション再生時、プログレスバーが表示されない
スキンメッシュが存在するゲームオブジェクトを選択した状態にしてください
このプログレスバーが表示されていない時は(なぜか)遷移が正常にプレビューできていない時があります。注意してください
mecanim_moveBar.jpg

  • 最終更新:2013-10-31 10:15:22

このWIKIを編集するにはパスワード入力が必要です

認証パスワード