Unityのレイヤー、アバターマスクを使って体の一部分を別のアニメーションにする

今回はUnityのレイヤーとアバターマスクを使ってキャラクターの一部のアニメーションを変化させてみようと思います。

例えば普通に手を振って歩いている状態のアニメーションがあって、下半身にはこの普通の歩いているアニメーションを使い、上半身は物を持っている為に手は振らないようにしたいといった時です。。

体の一部分だけのアニメーションを変更したい場合はAnimatorControllerのレイヤーとアバターマスクを使う事で実現出来ます。

歩いているアニメーションは今までの歩いているアニメーションのままで
上半身用に別のアニメーションを用意します。

上半身用のアニメーションは手の部分しか使わないので他の部分のアニメーションはどういう風に設定されていても構いません。

スポンサーリンク

新しいレイヤーの作成とアバターマスクの設定

まずは新しいレイヤーを作成します。

アバター1


AnimatorControllerでLayersを選択し+をクリックすると新しいレイヤーが作成されます。
新しいレイヤーの名前をUpper Layerという名前にします。

次にAvatarMaskを作成します。ProjectsタブのAssetsエリア内でCreate→AvatarMaskを選択します。

アバター2

AvatarMaskのインスペクタでHumanoidの人型の絵をクリックし腕の部分だけ緑色にします(画像ではIKが赤になっていますが、手のIKも緑にした方がいいかも?)。

このアバターを先ほど作ったレイヤーに設定すると緑色の部分だけのアニメーションが適用されるレイヤーということになります。

次にUpper Layerの右の歯車をクリックします。

アバター3

上のようなウインドウが出るのでWeightを1、アバターをさきほど作ったアバターにします。
BlendingはOverrideにします。

これで普段のアニメーションへ上書きする事になります。
Sync(Syncronizeの略だと思われる、意味は同期する)にチェックを入れるとSourceレイヤーの選択項目が出ます。

Sourceレイヤーには普段のアニメーションをコントロールしているレイヤーを選択します。
Upper LayerにはSourceレイヤーで作成したステートの遷移が表示されます。

Upper Layerの歩くアニメーションステートWalkを選択し、そのモーションに手の動きを使いたいアニメーションを設定すれば、完成です。

アバター4

上のように手以外の部分は普段のアニメーションが再生され、手の部分だけUpper LayerのWalkステートのアニメーションが再生されています。
静止画なのでわかりにくいですが・・・・。

これで歩いている時に部分的にアニメーションを上書きする事が出来ました。

立っている時、走っている時、攻撃時で上半身の動きを変更する

http://gametukurikata.com/program/continuityattack
で連続攻撃が出来るようになりました。

そこで、ただ立っている時、走っている時は上半身のアニメーションを別のものに変更し、攻撃時は最初に設定したアニメーションを再生するように設定してみます。

アバター7

上の動画がBase Layerに設定した走るアニメーションです。

走っている時の手の向きの関係で剣がキャラクターにめり込んで走ってしまってます。
動作に問題はありませんが・・・、剣を自分にめり込ませながら走る主人公なんて見たくありません(^_^;)

そこで、新しいレイヤーを作り、立っている時と走っている時は上半身のアニメーションを変更します。

アバター8

Handという新しいレイヤーを作り、アバターには上半身だけを設定したHandAvatarを指定します。
Blendingは元のアニメーションを上書きして再生させる為にOverrideにし、Syncにチェックを入れてBase Layerの状態遷移を表示します。

アバター9

遷移は上のようになっており、HandレイヤーにBase Layerレイヤーと同じ状態遷移が表示されます。

アバター10

Syncにチェックを入れると指定したレイヤーと同じ状態遷移がそのレイヤーにも表示されますが、アニメーションクリップがNoneになっているので、そこに上書きしたいアニメーションクリップを指定します。

とりあえず剣がキャラクターを切りつけないような上半身のアニメーションを指定します。
StandardAssetの3rdPersonで使っているHumanoidJumpForwardRightを指定してみます。

今回の場合、上半身のアニメーションを変更したいのは立っている時と走っている時なので、
HandレイヤーのIdleとRunのアニメーションクリップにHumanoidJumpForwardRightを設定します。

これで設定が完了しました。
実行して確認してみましょう。

アバター11

闘牛士のような少し違和感のあるアニメーションを設定してしまいましたが (^_^;)

立っている時と走っている時は上半身がHumanoidJumpForwardRightのアニメーションを再生し、攻撃やジャンプをした時はHandレイヤーのAttack系にアニメーションを設定していないので、Base Layerレイヤーのアニメーションがそのまま再生されています。

これでずいぶんゲームのキャラクター作りが出来上がってきました!
アクションRPGの主人公キャラクターを作る時に困らないぐらいの機能は出来てきたかも!?

一部のアニメーションを条件付きで上書きする方法

レイヤーとアバターを使ってアニメーションの一部を別のものに替える事が出来るようになりました。

しかし、例えば武器を切り替えた場合、武器も懐中電灯のように持って歩いているアニメーションになってしまいます。
武器は別の持ち方にしたいですよね?

そういう場合はSyncにチェックをいれるのではなく、レイヤーを作ったらOverrideにし、アバターはさきほどと同じ物を使用します。
そしてアニメーションの遷移を独自に作ります。

アバター5

上のような感じでIdleからWalkFlashLightに遷移を繋げ、さらにExitに持っていきます。

Idleにはモーションクリップの設定は行わず単なる遷移の為のステートとします。
Idle状態がデフォルトの状態で、アニメーションパラメータのFlashLightがOnになったらWalkFlashLightに遷移するという条件を加えます。

FlashLightがOffになったらExitに遷移させます。Exitは遷移するとデフォルトのステートに移動します。

アニメーションパラメータのFlashLightは持っている持ち物がFlashLightであればOnにし、そうでなければOffにするというスクリプトの処理が必要になります。
Onにするのは歩き始めた時で、Offにするのは持ち物を持ちかえた時、歩くのをやめた時です。

アニメーターをanimator変数に取得していたならば、

animator.SetBool(“FlashLight”, true);
animator.SetBool(“FlashLight”, false);

という処理をそれぞれの条件に加えればOKです。

これでアニメーターコントローラーのレイヤーとアバターを使って、部分的にアニメーションを変化させる事が出来るようになりました。

次回はアニメーターコントローラにAdd Behaviourしてビヘイビアでアニメーションの処理をしてみます。