gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

【Unity】Playableで上半身と下半身を別々に動かす

※改良しました(2018/1/4) gologius.hatenadiary.com

※以下古い情報

やりたいこと

走りながら、飛びながら、滑りながら銃を撃ちたい場合、

  • 上半身:銃を撃つモーション
  • 下半身:走るor飛ぶor滑るモーション

という風にしたい。

これをAnimationControllerでなく、Playableで実現したい。

サンプル

ここからDL

GitHub - gologius/PlayabkeMask: Playable APIでマスクをするテスト

実行結果動画

スクリプト使用方法

※別のプロジェクトで使用する場合の方法

1 上半身と下半身のAvaterMaskを作成

f:id:gologius:20171120233424p:plain f:id:gologius:20171120233300p:plain 上半身or下半身に該当するTransformにチェックを入れてね!!

2 AnimatorのあるGameObjectにMotionPlayerをアタッチ、設定

f:id:gologius:20171120140538p:plain Maskと再生するクリップを指定

3 スクリプトやボタンなどから関数を叩く

MotionPlayer.playFromID()を叩く

実装説明

サンプル内で関係しているのはMotionPlayer.cs。下の図のようなことをして実現しようとしています。 f:id:gologius:20171120141438p:plain (※図はあくまで参考です。認識があっているかも若干怪しいです)

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が優先されている状態になっている。謎。

参考