Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

勉強会レポ:Unityのアニメーションシステムの今と未来の話

勉強会のレポートになります。

参加したのはこちら、「Unityのアニメーションシステムの今と未来の話 」

座った席で、登壇者の山村さん(テラシュールブログの人)とmaoさん、ととさんに囲まれて死にそうでした。

techxgamecollege.connpass.com

ハッシュタグ : #techxgamecollege

 

 

 

 

 

 

 

アニメーションの今と未来


 

1. 過去の話

Unityのアニメーションとは?

時間で変化するもの。
時間を元にカーブを指定、変化するものはUnityのInspectorで見れるもの(Positionなど)
カーブの情報はAnimationClipから取得します。

スキニング

変形はスキニングと呼ばれるものでアニメーションではない、
昔はGPUスキニング(頂点の変形)がありましたが、いけてなかったので今書き直しているところ。

 

Animation(Legacy)

Vtuberなどは、直接GameObjectを変形させるのでいいと思う。
これを実現するのがAnimation(Legacy)。
AnimationClipからカーブを取得、カーブのブレンドやメソッドの呼び出しをする
AnimationClipはAnimationに登録して使う。
揺れものは、Animationの事後処理で行われる(LateUpdateなど)。

 


ちなみにLegacyは無くなることはないです(未だに人気があるため)


 


2. 今の話(2012年~)

いま使える機能は以下の通り
・Animation(Legaccy)
・Mecanim(Animator, Avator....)
・Timeline

 

Mecanim

Mecanimとは、AnimationControllerを経由してアクセスする。
これは複数の機能を持っている、
・直接マトリクスに書き込み
・リターゲット
・移動をアニメーション側の移動量で制御
・再生するアニメーションを判断する機能

 

 リターゲット

等身が違うもの、

ボーン構造が違うものでもアニメーションを適応させることができる機能。
リグとはは骨を簡単に動かす仕組み。
一致させる情報はAvatorに作成します。


今まではボーンが違うと名前や構造が変わるため取得することができなかった。
Avatorを使うと、きちんと動かすことができる。

 

直接マトリクスに書き込み

Transformを操作しないためパフォーマンスがよい。
GameObjectの階層を減らせる。


移動をアニメーション側の移動量で制御

ApplyRootMotionのこと。

アニメーション側で移動させることができる(不人気ですが)。
足滑りを返すのに便利、ただし、正直使うかどうかはゲームしだい。

 

再生するClipを判断

キャラクターが接地しているか、走っているか、止まっているのかなどを判断。

プロパティから再生するアニメーションを選択する。


BlendTree

プロパティをもとにアニメーションをブレンドする。
実はn軸までできる。

パラメータの設定
スクリプトで設定することが基本(GetFloatや、SetFloatなど)。


SMB(StateMachineBehaviour)

ステートごと、全ステートに処理を登録できる。

StateMachine

BrendTreeではできない、複雑な切り替わり条件を設定できる。
切り替わるタイミングには複数のタイミングを設定することができる。
(右足を出した時だけの時だけダッシュモーションに移行するなど)

 

Animator Override Controller

キャラクターを複数作りたい、そしてそれぞれ異なるAnimatorを作る時、

ベースとなるAnimatorを作ったらOverride Controllerを使いましょう。

Clipの一部を上書きし、複数のキャラクターで使いまわすことができます。

 

SimpleAnimation

動作自体はAnimatorで動いている

 


Playable API

できること
・AnimationControllerの階層化
・もっとシンプルなアニメーション
・独自のアニメーション切り替え機構
アニメーションを再生するとこではなく制御で使われている低レベルのAPIです。

 

簡単に仕組み
output:アニメーターどのクリップを選ぶか
playable:時間を返す

 

Animation Instancing

もっとシンプルにやりたいとき
シェーダーで頂点アニメーションさせる
超ローポリ向け


Timeline

動きのタイミングを調整するのに便利

アニメーションを流し込める

・必要なタイミングで特殊でアニメーションをさせることができる(イベント)

 

複数の動きを連携させた表現を作れる

・カメラワーク
・エフェクト
・自キャラの動き、相手の反応
カットシーンなど

 

Timelineの呼び出し

こういうアプローチが便利
・Prefab(Asset)
 カメラワーク、リスナー、エフェクトなど
・GameObject(Scewne)
 キャラの動き、相手の反応

 

 


 


未来の話

Animation C# jobs

Animationをカスタマイズをする。
AnimationStreamにアクセス(割り込み処理)して、直接干渉できる。
今までは書き込めず、事後処理のみだったが、できるようになりました。

究極的にはAnimationClipがいらない、自分で全部ストリームに流し込むこともできる。

 

できること

・独自のIK処理
・独自のマスク処理
・独自のブレンド
・独自の手続き型アニメーション
・独自のアニメーション

Playable上で動いています、
JpobSystemなので並列処理です。
現状バグか仕様かはわからないが、パラレルではなくジョブで動いている。

 

Kinematica

絶賛開発中の機能。
機械学習を利用した新しいアニメーションシステム。
Animation Clipを使わないポーズベース。
期待経路を出して、過去と未来の情報をもとに軌跡を出してポーズを決定する。
動作には予兆がある。状況と予想から次のポーズを選択する。
軌跡によって期待する動作が異なってくる。

ポーズには機械学習を使う。
Animation Clipを渡し、モーションのデータベースにぶち込む。
それをもとにポーズを学習してもらう。

これはAnimation C# Jobs上で動作します。


まとめ

・Animatior

Animationの再生はAnimatorが基本。

 

・Timeline
Animationの制御(特定の時に特定のモーションを・・・など)。

 

・Animation Controller

Animationの選択

 

・SImple Animation

スクリプトで制御

 

・Playable & Jobs

低レイアー

 

・Kinematica

AnimationClipから脱却。機械学習で学習させる


 

質疑応答

Q : mayaで作ったモーションをunityで使うとき、微調整したい場合はmayaに戻るべき?この辺はどのように使い分ける?
A : Animationをオーバーライドさせることができます
・腕の部分だけをずらしたりできます
・一応実現することができる
・FKなのでちょっとめんどい、正直オススメはできない

 


 

 個人的質問

Q : Animation Override Controllerを使う時、ステート名ではなくステートにアタッチしたAnimation Clipの名前で表示されるのおかしくない?

A : 私もそう思っています。個人的な解決方法として「Run」や「Idle」などの名前でダミークリップを使うと良いですよ。

 

Q : Unity内で簡単にアニメーションを作るには「Very Animation」などの外部のAssetが一般的ですが、こういう機能がUnityに標準搭載されることはある?(Shader Graphみたいに)

A : 今のところありません。少なくとも次Unity2019までそういう機能は作られていません。Unity内での微調整ならFKで事足りているため需要もないでしょう。

 

 


ツイートタイムライン

 

 

とと様の方がわかりやすくまとめられておられる!

lycoris102.hatenablog.com