※改良しました(2018/1/4)
gologius.hatenadiary.com
※以下古い情報
やりたいこと
走りながら、飛びながら、滑りながら銃を撃ちたい場合、
- 上半身:銃を撃つモーション
- 下半身:走るor飛ぶor滑るモーション
という風にしたい。
これをAnimationControllerでなく、Playableで実現したい。
サンプル
ここからDL
GitHub - gologius/PlayabkeMask: Playable APIでマスクをするテスト
実行結果動画
※別のプロジェクトで使用する場合の方法
1 上半身と下半身のAvaterMaskを作成
上半身or下半身に該当するTransformにチェックを入れてね!!
2 AnimatorのあるGameObjectにMotionPlayerをアタッチ、設定
Maskと再生するクリップを指定
3 スクリプトやボタンなどから関数を叩く
MotionPlayer.playFromID()
を叩く
実装説明
サンプル内で関係しているのはMotionPlayer.cs。下の図のようなことをして実現しようとしています。
(※図はあくまで参考です。認識があっているかも若干怪しいです)
upperLayerMixer.SetLayerMaskFromAvatarMask(0, upperBodyMask);
lowerLayerMixer.SetLayerMaskFromAvatarMask(0, lowerBodyMask);
引数が(レイヤ番号、AvaterMask)なんですけど、LayerMixerを二つ作って、レイヤ番号は0にするのがポイントですね。
・・・これ本当にあってるのか・・・?
課題
はじめにも書いたけど、RigがHumanoidだと上半身が動かない。
allLayerMixer.ConnectInput(0, upperLayerMixer, 0);
allLayerMixer.ConnectInput(1, lowerLayerMixer, 0);
これを
allLayerMixer.ConnectInput(1, upperLayerMixer, 0);
allLayerMixer.ConnectInput(0, lowerLayerMixer, 0);
すると、今度は下半身が動かない。
つまり、input番号1が優先されている状態になっている。謎。
参考