4.5K Views
October 16, 18
スライド概要
Animation(Legacy)やMecanim、TimelineやSimple Animationといった機能の考え方や使い所、そしてPlayable APIやAnimation C# Jobs、Kinematicaなどの新機能が"どういった機能"で"何ができるようになるのか"といった情報を整理して紹介します。
このスライドは、TECH x GAME COLLEGE #5で紹介したスライドを少し手直ししたものとなります。
https://techxgamecollege.connpass.com/event/99824/
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
Unityアニメーションシステムの 今と未来の話 Tatsuhiko Yamamura @ Unity
お品書き • Unityにおけるアニメーションとは • Animationという機能 • Mecanimとは何なのか • もっと細かく制御したい人のための Playable API • Timelineとは • Animation C# Jobsという新機能 • Kinematicaという未来
アニメーションとは • Animation → 0 frame 15 frame 時間で変化するもの 30 frame 30 45frame frame 60 frame
時間を元にカーブを取得 • 時間を引数に現在の値を取得 • キーフレーム間は補完される 1.3 1.0 • 変化に登録できる項目 • Inspectorで表示される項目 変化 0.2 • position、rotation、Color、UV (Animation、Animator) • Sprite, Material等 (Animator) 時間 時間を聞けば現在の値を貰える
カーブはAnimationClipから取得 インポート
変形はスキニング • ボーン情報とウェイト情報を 元にモデルの頂点を変形 • UnityではGameObject経由 でボーンを動かす • 変形はCPUもしくはGPU GPU Skinningは以前はstream outputを 使用していたが、現在はcompute shaderへ切り替え中 GameObjectを動かせば変形する
アニメーション Animation Clip Animation Skinning カーブの情報 時間で現在値を評価 変形
Animation(Legacy) • Animationといえばコレ
Animationの機能 • AnimationClipからカーブ情報を取得 • 時間を基準に情報を変化 • 2つのカーブをブレンド • メソッドを呼び出し
Animation(Legacy) • AnimationClipをAnimationに登録 • スキニング用のボーンは名前ベースで取得
アニメーションの事後処理 • Animationで動くキャラクター に効果を追加 • LateUpdateのタイミングで GameObjectを操作 • 用途: • • 物理演算 アップデート アニメーション処理 事後処理 揺れもの (胸、髪、アクセサリ) IK 描画処理
ここまでが過去 (※Animationは多くの根強い人気により削除される気配は無い)
アニメーションの 今 2012 ~
アニメーションの機能 • Animation (Legacy、消される気配が無い) • Mecanim (Animator, Avatar, AnimationController) • Timeline (PlayableDirector, PlayableAsset)
Mecanim • AnimationControllerを経由してアクセス
Mecanimは複数の機能を持つ Mecanimを一言で紹介するのは難しい “StateMachineを持つ!” としか紹介されないことが多い • GameObjectを経由せず直接マトリクスに書き込み • リターゲット • キャラクターの移動をアニメーション側の移動量で制御 • 再生すべきアニメーションを判断する機能
ボーン構造と Humanoidリグを 対応させる リターゲット Humanoid リグ向けアニメーションに変換 Mecanimの 機能その1 異なるボーン構造でも同じアニメーションが使える 特別なリグを用意して、それを利用することで互換性をもたせる
リグは骨を簡単に動かす仕組み モデリング スキニング ボーン追加 ボーンとポリゴンを 関連付け ボーンのポリゴンへの 影響を設定 リギング ボーンを動かす ルールを設定 アニメーション 動きを作成
アニメーションの再生 モデリング モデル表示 スキニング スキニング リギング リターゲット ヒューマノイドリグとボーンを一致させる 体型の差異もココで吸収 必要な情報はAvatarに格納 アニメーション AnimationClip
Humanoid Clip リターゲット 右腕を 動かしたい Avater無し 動かない (右腕が分からない) Generic RightArmを動かす RightArmと「右腕」を 紐づけておく 異なるボーン構造でも同じアニメーションが使える
Optimized Game Objectの機能 直接マトリクスに書き込み • Avatar経由でアニメーション情報を直接ボーンに書き込む Mecanimの 機能その2 (オプション) Transformを操作しない分だけ効率的 (コレを使用すると、代わりにアニメーションの事後処理が使えなくなる) • GameObjectの階層も減らせる Animation 書込 書込 Animator GameObject 参照 Bone 参照 Skinning or 書込 Bone 参照 Skinning
アニメーションで移動 Mecanimの 機能その3 Apply Root Motionの機能 移動距離 スライディング ローリング ダッシュ
移動時の足すべりを回避 適当にスクリプトで 移動速度がズレて 軸足がすべってる • DCCツールで設定した ルートモーションを使用 • 移動時の加減速を ルートモーションで移動 GameObjectの座標に適応 軸足をもとに 前進してる
移動はゲーム性に直結 特に旋回速度 使うか、使わないか 何処まで使うかは ゲーム次第
再生するClipを判断 Animation Controllerの機能 AnimationClip Animation Controller Mecanimの 機能その4
再生するClipを判断 • やりたい事と周辺の状況をパラメーターとして渡すと、 周辺状況 やりたい事 その時に行うべきアニメーションを行ってくれる 期待する移動速度 向きたい方向 行うべきアニメーション ダッシュ Animation Controller ジャンプ中(上昇、落下) 地面に立ってる? 着地(普通に着地、前転、ヒーロー着地) 落下速度は? 立ちモーション 曲がる速度の差分は 急ターン 特殊なトリガーを除き、全てのパラメーターは常に更新する
移動方向が大きく変わった! 急カーブモーションだ! 地面で移動… 走るモーションだ! 目標位置や段差の有無等をパラメーターとして設定、 行うべきアニメーションを自動選択 地面と離れれてる 落下モーションだ! “パラメーターをセットしたら動く”ではなく、 常に変化するパラメーターを監視させる 落下から着地モーション。 落下速度が早いから ヒーロー着地だ!
Animation Controllerでアニメーションを選択する為の機能1 Blend Tree • プロパティを元に アニメーションをブレンド • 最も近い要素にブレンド • 1軸、2軸、n軸で利用可能 • アクションのタイミングが 同じ物をブレンドすると 自然に繋がる (走行時の足を蹴るタイミング等の場合)
設定の流れ 1. Blend Treeを登録 3. 軸を2軸に変更 2.Animation Clipを登録 4. Animation Clipの速度と角速度で Blend Treeのx,y軸を自動設定 AnimationClipの移動とパラメーターが 一致するBlend Treeが完成
期待する移動速度と角速度を パラメーターに設定する 行うべきアニメーションが 選択される
パラメーターを設定する • 周辺の情報や、やりたい事を パラメーターとして AnimationControllerに渡す Animator.SetFloat(“key”, value) • StateMachineBehaviourで AnimationController自身に パラメーターをセットする事も
パラメーターを自動的にセットする時に便利な機能 StateMachineBehaviourの特徴 • Animationに関わる機能をGameObjectから Animation Controller AnimationControllerに渡す (周辺状況の確認をAnimationController側で完結) • ステート毎、サブステート毎、もしくは 全ステートに処理が登録可能 • ステートのIN/OUTのタイミングで処理を呼ぶ State State StateMachine Behaviour StateMachine Behaviour State StateMachine StateMachine Behaviour Behaviour StateMachine Behaviour
パラメーターを設定するコード スクリプトから受け取る やりたい事の情報 パラメーターをセット
GameObject側のスクリプト 移動目標をStateMachineBehaviourに渡すだけ Monobehaviour側は動きに集中できる
Animation Controllerでアニメーションを選択する為の機能2 StateMachine • BlendTreeで制御できない ものはStateMachine化 • アニメーションの切替先に 条件があるもの • 切替タイミングを厳密に 調整したい場合
例えばコンバットモーション 移動速度が設定されるか、 アニメーション終了まで何もしなければ コンバットモーションは終了 アニメーション終了時、 次のアクションボタンが押されてたら 次のアニメーションへ進む
Has Exit Time フェードのタイミング調整 タイミングが一致している (足が滑らない) タイミングがズレている (足スベリを起こす)
足滑り回避したいが、ループが一周するまで待つのはよろしくない場合の回避方法 複数の切り替わるタイミング 左足の接地タイミングで切替 切り替わるタイミングを複数持つ Animation State time : 0 time : 1
キャラクター量産時に挙動が一部異なる場合 複数の異なるAnimationがある場合 アタックモーションがキャラクター毎に違う
Clipの一部を上書き
Clipの一部を上書き 上書きする AnimationControllerを指定 再生するAnimationClipを上書き
Clipの一部を上書き アニメーション Animation Controller Animation Override Controller 上書きする アニメーション
Clipの一部を上書き キャラクター毎にアニメーション上書き + 判断の定義 + +
ここまで紹介したが実際の話 • モバイルゲーム向けに ここまでの制御は要らない • 遷移も含めてスクリプトで 制御が望ましいケースも (アニメーションのキャンセルが多い場合、 ステートマシンは厳しい)
ここまで紹介したが実際の話 • GameObjectを経由せず直接マトリクスに書き込み • リターゲット • キャラクターの移動をアニメーション側の移動量で制御 • 再生すべきアニメーションを判断する機能 使いたいのはコレだけ 2D系だと特に。
Simple Animation • Animationの使い勝手で Animatorを使用する • AnimationClipだけで再生 ステートマシン無し • Githubにて公開 https://github.com/Unity-Technologies/ SimpleAnimation
Simple Animation AnimationClipを登録して再生するだけ 動作自体はAnimatorベース
アニメーション制御機構を自作したい人のための Playable API • ツリー構造を評価して 処理を実行 (音・動き・エフェクト) • 時間を渡して処理を返す • ツリー構造でウェイトを設定
Playable API • AnimationControllerの階層化 • もっとシンプルなアニメーション再生 • 独自のアニメーション切替機構
Playable API = Animation制御の低レベルAPI Simple Animation Animationと同じ設定でAnimationClipを再生 Timeline Playable API 時間軸ベースでAnimationClipを再生 Animation Controller ステートベースでAnimationClipを再生
Playable APIの仕組み PlayableGraph Output 処理を実行 Playable 最終的な アニメーション 時間を指定すると 動作を返す
Playable APIの仕組み PlayableGraph Output アニメーション制御 (好きなように作る) AnimatorControllerPlayable ウェイトで アニメーションを ブレンド weight 0 weight 1 AnimationClipPlayable AnimationClipPlayable
Playable APIの例 Simple Animation 再生するアニメーション構造を管理 Animation Controller 再生するアニメーション構造を管理
Animation Instancing • シェーダー(GPU)でアニメーションを実現 • Instancing(効率的な描画)が使える • 超ローポリ向け • Animation Texture Baker for Unityが 個人的に一番オススメ Texture Position Normal ピクセルの位置( x 頂点の番号 y 時間 ) 色( R G x y B ) z
使い分け 制御方法 負荷 AnimationController この3つの内なら 若干高め 用途 AnimationController 制御を抽象化 Simple Animation スクリプト 単体再生なら安い 自作の制御機構で上下 マテリアル差替 GPUのみで動作 Instancingが使える 激安 アニメーションベースでキャラを 動かしたい人向け アニメーション割込が多いケース向け Animation Instancing 大量のキャラクター再生向き ローポリ専用
Timeline
動きのタイミングを調整 クリップの位置を調整してタイミングを微調整 ゲームを再生せずプレビュー
Timelineの特性 • タイミングを調整しながら動き を作り込める • アニメーションを流し込める • 複数の動きが連携する 表現を作りやすい
Timelineの構成 TimelineAsset
アニメーションを流し込める AnimationControllerは 移動系のアニメーションを 担当 Animation Controller Timelineは場所や状況に 依存するアニメーションを 担当 Timeline
Character Controller制御 イベント開始点に到着 自由に移動中 カメラ位置が変化 Timeline 制御 カメラ位置が変化 タイミングを合わせてアニメーションを再生
複数の動きが連携 • カメラワーク(Cinemachine) • オーディオリスナー • エフェクト(Particle) • 自キャラの動き • 相手(敵、ドア、ギミック)の反応
Timelineの呼出 Prefabに格納 • カメラワーク(Cinemachine) • オーディオリスナー • エフェクト(Particle) prefab 実行時にバインド (Asset) • 自キャラの動き • 相手(敵、ドア、ギミック)の反応 GameObject (Scene)
アニメーションの 未来
Animation C# Jobs アニメーションを もっと自由に カスタマイズする
Animation C# Jobs • AnimationStreamにアクセスして アニメーションの評価に干渉 • Playable APIを利用 • C# Job Systemでもある (つまりBurstコンパイラが使える) ※C# Job System = UnityのWorker ThreadをC#から使用する仕組み
ストリームに割込 • プロパティやTransform評価に割り込み Streamに直接書き込む場合はAnimatorUtility.OptimizeTransformHierarchyが必要 今まで 書込 AnimationClip Animation Stream 参照 Animation Stream 参照 Skinning New AnimationClip 書込 Animation C# Jobs 書込 Skinning
ストリームに割込 • もしくは自作のアニメーション制御 今まで 書込 AnimationClip Animation Stream 参照 Animation Stream 参照 Skinning 独自ファイル New AnimationClip 書込 Animation C# Jobs 書込 Skinning
Animation Streamで出来ること • 独自のIK処理(Look At、Generic IK、Full Body IK) • 独自のマスク処理 • 独自のアニメーションブレンド • 独自の手続き型アニメーション • 独自のアニメーション
Playableに注入して動作 PlayableGraph Output AnimationScriptPlayable Any playables 登録 IAnimationJob Animation C# Jobsで 処理する内容
Animation C# Jobの流れ Clip Animation Stream IAnimationJob Transform Stream Handle Avatarの認識する オブジェクトの子Transform Animation Property Stream Stream Handle Avatarの認識する オブジェクトのプロパティ Transform Scene Handle Avatarの認識していない Transform output Animation Stream
並列処理 • C# Job System上で動作 ※現状、Animation C# Jobsの数だけ ジョブ発行(即完了待ち) • Transformの書込も ジョブ上で実行
Kinematica 機械学習を利用した 新しいアニメーションシステム (絶賛開発中)
Kinematica • AnimationClipではなく ポーズを動的に選択するシステム • 期待する経路を軌跡として指示 • 軌跡(過去の情報と未来の予定)から 最適なポーズを選択
Kinematicaのコアなアイディア • 動作には予兆がある 移動軌跡 • 状況と予想から、 次のポーズを選択する 次の位置
軌跡によって期待する動作は異なる ふんばる 急激に曲がる どう動く? ゆるやかに曲がる
ポーズの学習 Motion Database • アニメーションは連続した ポーズの組み合わせ • ポーズ一覧をライブラリに格納 • モーションデータと 軌跡からポーズを学習
• Animation C# Jobs上で動作
まとめ
Animation再生 • Animatorが基本 • Avatarでボーンや体型の違いを吸収 • Root Motoinでキャラクターの 位置情報を利用(任意)
• Timeline Animation制御 • 特定のアニメーションを 特定のタイミングで再生 • Animation Controller • パラメーターを元に再生する アニメーションを選択 • Simple Animation • スクリプトで再生するアニメーションを選択
Playable / Animation C# Jobs • アニメーションの低レイヤー PlayableGraph • Playable API • 再生するアニメーションを管理 Output Playable • Animation C# Jobs • Animationを制御 IAnimationJob
Kinematica • AnimationClipによる “常に同じアニメーション” の脱却 • 軌跡から行うべき、連続するポーズを プロシージャルに選択する • ポーズの組み方は機械学習で構築 • Playable / Animation C# Jobsで動作 • 絶賛開発中
おしまい