Unityアニメーションシステムの

今と未来の話
Tatsuhiko Yamamura @ Unity
お品書き
• Unityにおけるアニメーションとは
• Animationという機能
• Mecanimとは何なのか
• もっと細かく制御したい人のための Playable API
• Timelineとは
• Animation C# Jobsという新機能
• Kinematicaという未来
アニメーションとは
• Animation → 時間で変化するもの
0 frame 15 frame 30 frame45 frame 60 frame30 frame
時間を元にカーブを取得
時間
変化
1.0
1.3
0.2
• 時間を引数に現在の値を取得
• キーフレーム間は補完される
• 変化に登録できる項目
• Inspectorで表示される項目
• position、rotation、Color、UV

(Animation、Animator)
• Sprite, Material等

(Animator) 時間を聞けば現在の値を貰える
カーブはAnimationClipから取得
インポート
変形はスキニング
•ボーン情報とウェイト情報を
元にモデルの頂点を変形
•UnityではGameObject経由
でボーンを動かす
•変形はCPUもしくはGPU

GPU Skinningは以前はstream outputを

使用していたが、現在はcompute shaderへ切り替え中
GameObjectを動かせば変形する
アニメーション
カーブの情報 時間で現在値を評価 変形
SkinningAnimationAnimation Clip
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は複数の機能を持つ
• GameObjectを経由せず直接マトリクスに書き込み
• リターゲット
• キャラクターの移動をアニメーション側の移動量で制御
• 再生すべきアニメーションを判断する機能
Mecanimを一言で紹介するのは難しい

“StateMachineを持つ!” としか紹介されないことが多い
リターゲット
異なるボーン構造でも同じアニメーションが使えるHumanoid リグ向けアニメーションに変換
ボーン構造と
Humanoidリグを

対応させる
Mecanimの

機能その1
特別なリグを用意して、それを利用することで互換性をもたせる
リグは骨を簡単に動かす仕組み
モデリング アニメーション
ボーン追加
ボーンとポリゴンを

関連付け
ボーンのポリゴンへの
影響を設定
動きを作成
ボーンを動かす

ルールを設定
リギングスキニング
アニメーションの再生
モデル表示 AnimationClipリターゲットスキニング
アニメーションリギングモデリング スキニング
ヒューマノイドリグとボーンを一致させる

体型の差異もココで吸収
必要な情報はAvatarに格納
リターゲット
動かない
(右腕が分からない)
右腕を
動かしたい
Avater無し
Humanoid Clip
RightArmを動かす
異なるボーン構造でも同じアニメーションが使える
RightArmと「右腕」を

紐づけておく
Generic
直接マトリクスに書き込み
• Avatar経由でアニメーション情報を直接ボーンに書き込む (オプション)

Transformを操作しない分だけ効率的

(コレを使用すると、代わりにアニメーションの事後処理が使えなくなる)
• GameObjectの階層も減らせる
Mecanimの

機能その2
Animation GameObject Skinning
Animator
Bone
Bone Skinning
書込 参照 参照
参照書込
書込
or
Optimized Game Objectの機能
アニメーションで移動
スライディング ローリング
Mecanimの

機能その3
Apply Root Motionの機能
移動距離
ダッシュ
• DCCツールで設定した

ルートモーションを使用
• 移動時の加減速を

GameObjectの座標に適応
移動時の足すべりを回避
適当にスクリプトで
ルートモーションで移動
 移動速度がズレて

 軸足がすべってる
 軸足をもとに
 前進してる
使うか、使わないか

何処まで使うかは

ゲーム次第
移動はゲーム性に直結特に旋回速度
再生するClipを判断
Animation ControllerAnimationClip
Mecanimの

機能その4
Animation Controllerの機能
再生するClipを判断
• やりたい事と周辺の状況をパラメーターとして渡すと、

その時に行うべきアニメーションを行ってくれる
地面に立ってる?
落下速度は?
曲がる速度の差分は
やりたい事周辺状況
ダッシュ
ジャンプ中(上昇、落下)
着地(普通に着地、前転、ヒーロー着地)
立ちモーション
急ターン
期待する移動速度
行うべきアニメーション
Animation 

Controller向きたい方向
特殊なトリガーを除き、全てのパラメーターは常に更新する
地面で移動…
走るモーションだ!
移動方向が大きく変わった!
急カーブモーションだ!
地面と離れれてる
落下モーションだ!
落下から着地モーション。
落下速度が早いから
ヒーロー着地だ!
目標位置や段差の有無等をパラメーターとして設定、

行うべきアニメーションを自動選択
“パラメーターをセットしたら動く”ではなく、

常に変化するパラメーターを監視させる
Blend Tree
• プロパティを元に

アニメーションをブレンド
• 最も近い要素にブレンド
• 1軸、2軸、n軸で利用可能
• アクションのタイミングが

同じ物をブレンドすると

自然に繋がる

(走行時の足を蹴るタイミング等の場合)
Animation Controllerでアニメーションを選択する為の機能1
設定の流れ
1. Blend Treeを登録 2.Animation Clipを登録
3. 軸を2軸に変更
4. Animation Clipの速度と角速度で

Blend Treeのx,y軸を自動設定
AnimationClipの移動とパラメーターが

一致するBlend Treeが完成
期待する移動速度と角速度を

パラメーターに設定する
行うべきアニメーションが

選択される
パラメーターを設定する
• 周辺の情報や、やりたい事を

パラメーターとして

AnimationControllerに渡す

Animator.SetFloat(“key”, value)
• StateMachineBehaviourで

AnimationController自身に

パラメーターをセットする事も
StateMachineBehaviourの特徴
• Animationに関わる機能をGameObjectから
AnimationControllerに渡す

(周辺状況の確認をAnimationController側で完結)
• ステート毎、サブステート毎、もしくは

全ステートに処理が登録可能
• ステートのIN/OUTのタイミングで処理を呼ぶ
Animation Controller
State State State
StateMachine
BehaviourStateMachine
Behaviour
StateMachine
Behaviour
パラメーターを自動的にセットする時に便利な機能
StateMachine
Behaviour
StateMachine
Behaviour
パラメーターを設定するコード
スクリプトから受け取る

やりたい事の情報
パラメーターをセット
GameObject側のスクリプト
移動目標をStateMachineBehaviourに渡すだけ
Monobehaviour側は動きに集中できる
StateMachine
• BlendTreeで制御できない
ものはStateMachine化
• アニメーションの切替先に

条件があるもの
• 切替タイミングを厳密に

調整したい場合
Animation Controllerでアニメーションを選択する為の機能2
例えばコンバットモーション
移動速度が設定されるか、
アニメーション終了まで何もしなければ

コンバットモーションは終了
アニメーション終了時、

次のアクションボタンが押されてたら

次のアニメーションへ進む
フェードのタイミング調整
タイミングがズレている
(足スベリを起こす)
タイミングが一致している
(足が滑らない)
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の階層化
• もっとシンプルなアニメーション再生
• 独自のアニメーション切替機構
Animation制御の低レベルAPI
Playable

API
Animationと同じ設定でAnimationClipを再生
時間軸ベースでAnimationClipを再生
ステートベースでAnimationClipを再生
Simple Animation
Timeline
Animation Controller
Playable API =
Playable APIの仕組み
PlayableGraph
PlayableOutput
最終的な

アニメーション処理を実行
時間を指定すると

動作を返す
Playable APIの仕組み
PlayableGraph
Output AnimatorControllerPlayable AnimationClipPlayable
AnimationClipPlayableウェイトで
アニメーションを

ブレンド
アニメーション制御
(好きなように作る)
weight 0
weight 1
Playable APIの例
Simple Animation
Animation Controller
再生するアニメーション構造を管理
再生するアニメーション構造を管理
Animation Instancing
Texture
Position
Normal
ピクセルの位置( R G B色( ))x y
頂点の番号 時間 x y z
• シェーダー(GPU)でアニメーションを実現
• Instancing(効率的な描画)が使える
• 超ローポリ向け
• Animation Texture Baker for Unityが

個人的に一番オススメ
使い分け
AnimationController
Simple Animation
Animation Instancing
制御方法 負荷 用途
AnimationController
スクリプト
マテリアル差替
この3つの内なら
若干高め
単体再生なら安い
自作の制御機構で上下
GPUのみで動作
Instancingが使える
激安
制御を抽象化
大量のキャラクター再生向き

ローポリ専用
アニメーションベースでキャラを

動かしたい人向け
アニメーション割込が多いケース向け
Timeline
動きのタイミングを調整
クリップの位置を調整してタイミングを微調整
ゲームを再生せずプレビュー
Timelineの特性
• タイミングを調整しながら動き
を作り込める
• アニメーションを流し込める
• 複数の動きが連携する

表現を作りやすい
Timelineの構成
TimelineAsset
アニメーションを流し込める
AnimationControllerは
移動系のアニメーションを

担当
Timelineは場所や状況に

依存するアニメーションを

担当
Animation

Controller
Timeline
 Character Controller制御  
 Timeline 制御  
自由に移動中イベント開始点に到着
カメラ位置が変化
カメラ位置が変化タイミングを合わせてアニメーションを再生
複数の動きが連携
• カメラワーク(Cinemachine)
• オーディオリスナー
• エフェクト(Particle)
• 自キャラの動き
• 相手(敵、ドア、ギミック)の反応
Timelineの呼出
prefab
• カメラワーク(Cinemachine)
• オーディオリスナー
• エフェクト(Particle)
• 自キャラの動き
• 相手(敵、ドア、ギミック)の反応
(Asset)
GameObject
(Scene)
Prefabに格納
実行時にバインド
アニメーションの
未来
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 Skinning
Animation

Stream
書込 参照
今まで
Skinning
Animation

Stream
書込 参照Animation
C# Jobs
書込
New
AnimationClip
ストリームに割込
• もしくは自作のアニメーション制御
Skinning
Animation

Stream
書込 参照
Skinning
Animation

Stream
書込 参照書込
今まで
New
独自ファイル
Animation
C# Jobs
AnimationClip
AnimationClip
Animation Streamで出来ること
• 独自のIK処理(Look At、Generic IK、Full Body IK)
• 独自のマスク処理
• 独自のアニメーションブレンド
• 独自の手続き型アニメーション
• 独自のアニメーション
Playableに注入して動作
PlayableGraph
Output AnimationScriptPlayable Any playables
IAnimationJob
Animation C# Jobsで

処理する内容
登録
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
並列処理
• C# Job System上で動作

※現状、Animation C# Jobsの数だけ

 ジョブ発行(即完了待ち)
• Transformの書込も

ジョブ上で実行
Kinematica
機械学習を利用した

新しいアニメーションシステム
(絶賛開発中)
Kinematica
• AnimationClipではなく

ポーズを動的に選択するシステム
• 期待する経路を軌跡として指示
• 軌跡(過去の情報と未来の予定)から
最適なポーズを選択
Kinematicaのコアなアイディア
• 動作には予兆がある
• 状況と予想から、

次のポーズを選択する
移動軌跡
次の位置
軌跡によって期待する動作は異なる
急激に曲がる ゆるやかに曲がる
ふんばる
どう動く?
ポーズの学習
• アニメーションは連続した

ポーズの組み合わせ
• ポーズ一覧をライブラリに格納
• モーションデータと

軌跡からポーズを学習
Motion Database
• Animation C# Jobs上で動作
まとめ
Animation再生
• Animatorが基本
• Avatarでボーンや体型の違いを吸収
• Root Motoinでキャラクターの

位置情報を利用(任意)
Animation制御
• Timeline
• 特定のアニメーションを

特定のタイミングで再生
• Animation Controller
• パラメーターを元に再生する

アニメーションを選択
• Simple Animation
• スクリプトで再生するアニメーションを選択
Playable / Animation C# Jobs
• アニメーションの低レイヤー
• Playable API
• 再生するアニメーションを管理
• Animation C# Jobs
• Animationを制御
PlayableGraph
PlayableOutput
IAnimationJob
Kinematica
• AnimationClipによる

“常に同じアニメーション” の脱却
• 軌跡から行うべき、連続するポーズを

プロシージャルに選択する
• ポーズの組み方は機械学習で構築
• Playable / Animation C# Jobsで動作
• 絶賛開発中
おしまい

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