Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Unityアニメーションシステムの 今と未来の話

14,154 views

Published on

Animation(Legacy)やMecanim、TimelineやSimple Animationといった機能の考え方や使い所、そしてPlayable APIやAnimation C# Jobs、Kinematicaなどの新機能が"どういった機能"で"何ができるようになるのか"といった情報を整理して紹介します。

このスライドは、TECH x GAME COLLEGE #5で紹介したスライドを少し手直ししたものとなります。
https://techxgamecollege.connpass.com/event/99824/

Published in: Technology
  • Be the first to comment

Unityアニメーションシステムの 今と未来の話

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

×