reference:https://docs.unity3d.com/ja/current/Manual/AnimationSection.html
Animation
- 以下が可能
- target を再設定可能な Animation
- 実行時の Animation の Weight 制御
- Animation の Play back 内での Event の呼び出し
- 高性能の State Machine の hierarchy と trasition による管理
- 表情 Animation 用の Blend shave
AnimationClip
- 特定の Object 位置、回転、他 Property の経時的な変化に関する情報が含まれている
- 各 Clip は1つの直線的 recording と考えると良い
- AnimatorController と呼ばれる構造化された flow chart のような system に整理される
AnimatorController
- 「 State Machine 」のような働きをし、現在再生中の Clip の追跡や、Animation の変更や blend のタイミングの追跡を行う
AnimatorComponent
- AnimationClip、AnimatorController、Avator の各 object をまとめる
- この component は AnimatorController への参照 Avator を持っている
- AnimatorController には、使用する AnimationClip への参照が含まれている
terminology(用語)
terminology |
description |
Retargeting |
1つの model 向けに作成した animation を他に適用すること |
Rigging(リギング) |
Mesh の bone joint の skelton 階層を構築するプロセス(Autodesk® 3dsMax® や Autodesk® Maya® などの外部ツールを使用して実施) |
Skinning |
キャラクターの Mesh や Skin に bone joint を紐づけるプロセス(Autodesk® 3dsMax® や Autodesk® Maya® などの外部ツールを使用して実施) |
Muscle Definition |
キャラクターの skelton を直感的に制御可能 |
T-pose |
キャラクターが真横に腕を T の形状に伸ばした pose(Avator を作成するためにキャラクターがとる必要のある pose) |
Bind-pose |
キャラクターがモデリングされたときの pose |
Rotation Animation
- 補間(interpolation)を使用して、Animation の中で視覚的に GameObject がある方向から別の方向へどのように動くかを計算
type |
description |
Euler Angles |
- 入力した角度で指定された GameObject に全範囲の動きを適用 - 回転が 365 度(360 度より大きい)である場合、GameObject は5度で止まる前に、1回転する |
Euler Angles (Quaternion) |
補間は上記の補間方法を使用するが、情報は Quaternion 曲線に Bake される(より多くの memory を使用するが、実行時間は若干速くなる) |
Quaternion |
- GameObject を特定の方向へ最短距離で回転させる - 回転の値が 5 度でも 365 度でも、GameObject は 5 度だけ回転(180 度以上の回転を表すことは不可) |
AnimationClip
- Animation 化されたキャラクターやシンプルな Animation に使用できる Animation データ
- 「休止」「歩く」「走る」などのある一例の単純な unit の動きを含む
Animation window
- AnimationClip を作成・編集できる
- 便利で直感的であるうえ、外部の 3D Animation soft の代替として機能するよう設計されている
- 動きの Animation に加え、Editor で Material や component の変数を Animation させ、timeline 上の指定されたポイントで呼び出される関数である Animation Event を AnimationClip に追加することも可能
- window 上で create ボタンを押下した際の unity 動作
- 新しい AnimatorController Asset を作成
- 新しい Clip を Default 状態として AnimatorController に追加
- Animation を適用する GameObject に AnimatorComponent を追加
- 新しい AnimatorController を AnimatorComponent に割り当て
curves
type |
description |
Clamped Auto(Default) |
curve が滑らかにキーを通過していくように自動的に設定 |
Free Smooth |
接線のハンドルをドラッグすることで接線を自由に設定可能 |
Flat |
接線が水平に設定 |
Broken - Free |
鋭い変化 & 接線のハンドルをドラッグして自由に接線を設定 |
Broken - Linear |
直線の curve (それぞれを直線で繋いだ状態) |
Broken - Constant |
curve は 2 つのキーの間の定数を保持(縦横線のみ) |
Animation Event
- reference:https://qiita.com/aimy-07/items/58e77d3396ded286affc
- Animation 内の指定タイミングで Script の関数を呼ぶことができる
- Animation に Event を設定すると、そのタイミングで Script 内の指定した関数が呼び出される
- 以下が実現可能
- Animation に合わせて音を再生、effect を表示、当たり判定をつける
- 関数は AnimationEvent により呼び出され、option として parameter を1つ付加することが可能
- float
- string
- int
- object
- AnimationEvent Object(メンバー変数を持ち、float、string、int、object を全て一緒に関数呼び出しをトリガーした event に関する情報とともに関数に受け渡す)
Animator Controller
- Animation の設定や管理を行う
- 中で使用されている AnimationClip と関連しており、いわゆる State Machine を使用して、様々な Animation の state や state 間の遷移を扱う
- これは一種の flow chart とも、Unity に含まれるビジュアル・プログラミング言語で書かれた簡単なプログラムとも考えることが可能
Animator Controller Asset
- AnimationClip の準備が整ったら、AnimatorController が必要
- AninmationClip が1つしかない場合でも、AnimatorController への登録必須
- Unity 内部で生成される AnimatorController Asset を使う事によって、Object の Animation set を保持する事が可能
- AnimatorController は、それを参照している Animator component を attach することによって、最終的に Object に適用される
Animator window
- AnimatorController Asset を作成・表示・修正
Animation State Machine
- Mecanim は、Flow chart に似た視覚的な layout system によって State Machine を表現し、Object の Animation 制御や順序づけを可能にする
- Action は「state」(歩行、アイドリングなどの ”ある具体的な状況や状態”)と呼ばれる
- 現在の state から入ることができる次の state の option を「state の遷移」と呼ぶ
- 一群の state、一群の遷移、現在の state を記憶する変数がまとまって State Machine を構成する
- State(アクション)
- Transition(遷移)
- Event(イベント)
Animation parameter
- AnimatorController 内で定義され、Script からアクセスしたり値を割り当てることができる変数
- Script をどのように制御するか、もしくはどのように State Machine の一連の流れに作用するかを定義
using UnityEngine;
using System.Collections;
public class SimplePlayer : MonoBehaviour {
Animator animator;
// 初期化に使用します
void Start (){
animator = GetComponent<Animator>();
}
// Update は各 frame に 1 度ずつ呼び出し
void Update (){
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
bool fire = Input.GetButtonDown("Fire1");
animator.SetFloat("Forward",v);
animator.SetFloat("Strafe",h);
animator.SetBool("Fire", fire);
}
void OnCollisionEnter(Collision col){
if (col.gameObject.CompareTag("Enemy"))
{
animator.SetTrigger("Die");
}
}
}
Transition
- 遷移により、巨大で複雑になった State Machine を単純化し、 State Machine の logic を高度に抽象化できる
- Animator window には必ず Entry node と Exit node がある
- Entry node:遷移開始
- Exit node:遷移終了
State Machine Behaviour
- 通常の Script(MonoBehaviour)を実際の GameObject に attach するのと同様の方法で、State Machine 内の state に StateMachineBehaviour Script を attach 可能
- State Machine が特定の state に「入る」、「出る」、「留まる」ときに実行される code を作成できる
Sub State Machine
- 複数 state を 1 つの名前のアイテムにたたんでまとめた Group
- Sub State Machine に "Up" で名前が始まる state が追加される((Up)Base Layer etc.)
- Up state は "外の世界" を意味し、Sub State Machine を囲む (含む) State Machine
- Sub State Machine の state から Up state への遷移を加えると、外の Machine の state の1つを選択する必要がある
Animation Layers
- 複雑な State Machine を体の各部分ごとに管理可能
- 下半身の Layer で歩きやジャンプ、上半身の Layer では Object を投げたり撃ったりするといった場合など
- 各 Layer では、Mask と Blend Type を指定
- Mask:Animation を適用する body parts を指定
- Blend Type:Animation をどのように適用するかを指定
- Override:前 Layer の Animation を置き換える
- Additive:前 Layer の Animation の上に追加される
- 追加 Layer の Animation に、前 Layer と同じ property が含まれている必要がある
- Sync
- 場合によっては、同じ State Machine を異なる Layer で再利用する方が便利な時がある
- 例えば "負傷した" 動作を表現したい場合に、"健康な" Animation ではなく、歩行/走行/ジャンプの "負傷した" Animation を持っている場合
- Sync チェックボックスをクリックしてから、同期したい Layer を選択すると、State Machine の構造は同じだが、各 state で使われる AnimationClip は区別される
- 同期した Layer は固有の State Machine を持たず、代わりに同期元 Layer の instance となる
- 同期した Layer view で State Machine の layout や構造への変更 (例えば、state または遷移の追加/削除)は、同期した Layer の source に対して行われる
- 同期した Layer の変更で唯一固有なのは、各 state 内で使用される選択された Animation だけ
Solo & Mute
name |
description |
note |
Solo |
該当遷移のみ再生 |
複数の Solo 遷移を設定して、Solo が有効になっているもののみを再生することも可能 |
Mute |
該当遷移を無効 |
|
Target Matching
reference:https://docs.unity3d.com/ja/current/ScriptReference/Animator.MatchTarget.html
- キャラクターの手や足が "決まった場所" に "特定のタイミング" で着地させたい場合などに使用
- 使用するときは正しい瞬間に呼び出さないと役立たない点に注意
using UnityEngine;
[RequireComponent(typeof(Animator))]
public class TargetCtrl : MonoBehaviour {
protected Animator animator;
// Scene 内の platform Object
public Transform jumpTarget = null;
void Start (){
animator = GetComponent<Animator>();
}
void Update (){
if(animator){
if(Input.GetButton("Fire1"))
animator.MatchTarget(jumpTarget.position, jumpTarget.rotation, AvatarTarget.LeftFoot,
new MatchTargetWeightMask(Vector3.one, 1f), 0.141f, 0.78f);
}
}
}
IK(インバース・キネマティクス:逆運動学)
- 空間で特定の点を決めてそこから逆算し、終了点が選択した位置になるように有効な方向に joint を向かせる
- 選択した位置の Object をキャラクターにタッチさせたり、平らでない地面にキャラクターの足をつける場合に役立つ
using UnityEngine;
using System;
using System.Collections;
[RequireComponent(typeof(Animator))]
public class IKControl : MonoBehaviour {
protected Animator animator;
public bool ikActive = false;
public Transform rightHandObj = null;
public Transform lookObj = null;
void Start ()
{
animator = GetComponent<Animator>();
}
// IK 計算のためのコールバック
void OnAnimatorIK()
{
if(animator){
if(ikActive){
// IK がアクティブなら、位置と回転を直接目的地に設定
// 割り当てられている場合は、ルックターゲット位置を設定
if(lookObj != null){
animator.SetLookAtWeight(1);
animator.SetLookAtPosition(lookObj.position);
}
// 割り当てられている場合は、右手のターゲット位置と回転を設定
if(rightHandObj != null){
animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1);
animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position);
animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation);
}
} else {
// IK がアクティブでない場合は、手と頭の位置と回転を元の位置に戻す
animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0);
animator.SetLookAtWeight(0);
}
}
}
}
Root Motion
Body Transform
- キャラクターの重心
- Mecanim の Retargeting Engine に使用
- 最も安定した Displacement Model を提供
- body の向き
- 下半身と上半身の body の向きの平均
- Avator の T pose に対して相対的
- Body Transform と body の向きは AnimationClip に格納
- Avatar に設定した muscle 設定を使用
- AnimationClip に格納される world 座標系の curve はこれらだけ
- それ以外の muscle curve と IK ゴール(手と足)は Body Transform に対して相対位置で格納される
Root Transform
- Body Transform を Y 平面上へ投影したもので Runtime に算出
- 1 frame 毎に計算
- Transform の変化を GameObject に適用する事で Object が移動する
AnimationClip Inspector
- AnimationClip Editor の設定(Root Transform Rotation、Root Transform Position (Y)、Root Transform Position (XZ))を使って Body Transform の投影である Root Transform を制御可能
- Body Transform のいくつかは Root Transform に転送される
- 動作の Y 位置を root Motion (軌道)の一部とするか、pose(Body Transform)の一部とする(Bake into Pose)かは、自由に決定できる
Root Transform Rotation
Bake into Pose
- 向きは Body Transform(または pose)に従う
- root の向きは一定で、差分の向きは同一
- つまり AnimationClip によって GameObject が回転されることはない
Based Upon
- Clip の向きを設定可能
- Body Orientation を使用すると、Clip は Body の前方 vector に従う
- たいていの Motion キャプチャ(Mocap)データ、すなわち歩く、走る、ジャンプでは正しく機能するが、機銃掃射(航空機から地上に向かって射撃を行う)のように Body の前方 vector に対して直角の場合は正しく機能しない
- このような場合は、Offset 設定を使って手動で向きを調整可能
- Original を使うと、import した Clip に対して指定した offset の値を自動的に加える
- key frame つきのデータで使用され、アーティストが設定したとおりの向きにする
Blend Tree
- Game Animationでは2つかそれ以上の Motion 間で blend を行うことがよくある
- 良く知られるケースはキャラクターの速度に基づいた歩行と走行 Animation の Blending
- Blend Tree と 遷移 の違い
- 遷移:ある Animation State から別 Animation State への移り変わりを、一定の時間内で滑らかに行うために使用
- Animation State Machine の一部として指定される
- Blend Tree:複数 Animation をそれらすべての部分部分を異なる度合いで組み込むことによって、滑らかに Blend(混合)できるようにするもの
- 各 Motion を最終的な Animation にどの程度影響させるかは、Blending Parameter を使用して制御
- blend された Motion が自然に見えるためには、性質とタイミングが類似した Motion 同士で blend される必要がある
- Blend Tree は、Animation State Machine における特殊なタイプの state
1D Blending
- 1つの parameter に基づいて子の Motion を blend する
2D Blending
- 2つの parameter に基づいて子の Motion を blend する
2D Simple Directional
- Motion が異なる向きを "表す" 場合に使用
- 同じ方向の複数 Motion は使用不可
- walk forward(前に歩く)+ walk backward(後ろに歩く)
- walk left ( 左に歩く)+ walk right(右に歩く)
- aim up (上を向く)+ aim down (下を向く)
- aim left (左を向く)+ aim right (右を向く)
- 位置 (0, 0)に、idle (休止)や aim straight (正面を向く)などの 1つの Motion を含むことが可能
2D Freeform Directional
- Motion が異なる向きを "表す" 場合に使用
- 同じ方向の複数 Motion を使用可能
- walk forward (前に歩く)+ run forward (前に走る)
- ひとまとまりの複数 Motion は常に、(0, 0)の位置に 1つの Motion 、例えば idle (休止)を必要とする
2D Freeform Cartesian
- Motion が異なる方向を "表さない" 場合に使用
- X および Y parameter に異なる概念、例えば角速度と直線スピードなどを表すことが可能
- walk forward no turn (前に歩く、曲がらない)
- run forward no turn (前に走る、曲がらない)
- walk forward turn right (前に歩く、右に曲がる)
- run forward turn right (前に走る、右に曲がる)
Direct
- 各 node の Weight を直接ユーザーが制御可能
- 顔の shape や idle 状態をランダムに Blending するのに便利
Direct Blend Tree
- それぞれの Blend Tree の子の Weight を Animator の parameter に直接設定可能
- 1D や 2D Blend Tree のように1つか2つの parameter を使って間接的に blend するのではなく、blend される様々な Animation を具体的に直接調節したい場合に役立つ
- 顔の表情の Blend shape Animation を Mix する場合や、付加的な Animation を Blend する際に特に便利
Additional options
option |
description |
note |
Time Scale |
AnimationClip の speed を変更 |
|
Mirroring |
Motion list 内の任意の Humanoid AnimationClip を Mirroring(左右反転)可能 |
Mirroring されていない original と同じ Animation を使用して行われ、使用 memory と容量を2倍にすることはない |
Animator Override Controller
- 今ある Animator Controller の拡張を可能にする Asset
Retargeting
- Mecanim で最も強力な機能
- 比較的簡単に、一群の Animation を 様々なキャラクター model に適用できる
Animation
Controller
- AnimatorComponent に Controller が設定されていなければ処理時間は増加しない
simple animation
- Blending なしで1つの AnimationClip を再生すると、古い Animation system を使うよりも遅くなる場合がある
- 古い system は非常に直接的で、curve を sampling し、直接 Transform に書き込む
- 現在の Animation system には、Blending に使用する一時的な Buffer があり、サンプリングされた curve やその他のデータの追加コピーを行う
- 現在の system layout は Animation Blending とより複雑な設定のために最適化される
Deprecated:Scale curve
- 移動や回転の Animation よりも非常に処理コストがかかる(可能な限り使用しない)
Layer
- Animation を評価し、AnimationLayer と Animation State Machine の overhead を最小限に抑えている
- 同期されているかどうかにかかわらず、他 Layer を Animator に追加するコストは、Layer によって再生される Animation と Blend Tree によって異なる
- Layer の Weight が 0 の場合、Unity は Layer の更新を skip する
Animation type
type |
description |
note |
Humanoid Animation |
import 時、Avator Mask(class-AvatarMask)を使用して IK ゴールや指の Animation を削除 |
|
Generic |
Root Motion を使用する方が、使用しない場合よりもコストがかかる |
Root Motion を使用しない場合は、Root bone を指定していないことを確認する |
Scene level
- Animator に query する際は、「文字列」の代わりに「Hash」を使用
- 小規模の AI Layer を実装して Animator を制御
- OnStateChange、OnTransitionBegin、その他のイベントの簡単なコールバックを提供可能
- 状態 tag を使用して、AI State Machine を Unity State Machine に簡単に一致可能
- 追加の curve を使用して event をシミュレーション
- 追加の curve を使用して Animation に印をつける
- 例えば、Target Matching と組み合わせて使用
Runtime
Visibility & Update
- Animator の Culling Mode を「Based on Renderers」に設定する
- Skinned Mesh Renderer の Update When Offscreen property を無効にする
- キャラクターが表示されない時に Animation を更新するのを防げる
Animation reference
Animator component
- Scene 内の GameObject に Animation を割り当てるために使用
- AnimatorComponent には、どの AnimationClip を使うか、そしていつ、どのように blend し、遷移させるのかを決定する AnimatorController への参照が必要
- GameObjectが Avator で定義された Humanoid Character の場合、既に追加済
property
- Controller
- attach された Animator Controller
- Avatar
- キャラクター用の Avator
- Humanoid Character を Animation 化するために Animator が使用されている場合
- Apply Root Motion
- キャラクターの位置と回転を Animation 自体から制御するか、または script から制御するか
- Update Mode
- Animator が更新されるタイミングと、それに使用される Time Scale を選択
- Normal
- Animator は Update の呼び出しと同期して更新され、Animator の速度は現在の Time Scale と一致
- Time Scale が遅くなると、Animation もそれに合わせて遅くなる
- Animate Physics
- Animator は FixedUpdate の呼び出しに同期して (物理システムと同時に)更新
- 物理 interaction のある Object の Motion を Animation 化する場合に使用
- 例えば、Rigid Body を押すキャラクターなど
- Unscaled Time
- Animator は Update の呼び出しと同期して更新されるが、Animator の速度は現在の Time Scale を無視して常に 100% の速度で Animation 化
- SE やゲームの一時停止用に異なる Time Scale を使用しつつ GUI System を通常速度で Animation 化する場合に便利
- Culling Mode
- Always Animate
- 常に Animation 化し、画面外でも Culling を行わない
- Cull Update Transform
- Renderer が表示されていない時、 Retarget、IK や Transform の書き込みは無効
- Cull
name |
description |
note |
Clip Count |
Animator に割り当てられた AnimatorController で使用されている、AnimationClip の合計数 |
|
Curves(Pos, Rot & Scale) |
Animation 化に使用する curve の総数 |
|
Muscles |
Animator で、Humanoid Animation に使用する Muscle Animation curve の数 |
|
Generic |
Animator が Material の色など他 proeprety を Animation 化するために使用する数値 (float)curve の数 |
|
PPtr |
sprite の Animation curve の総数 |
2D System で使用 |
Curves Count |
Animation curve の全合計数 |
|
Constant |
最適化で定数値にされた Animation curve の総数 |
Animation ファイルに値が変化しない curve が含まれていると自動的に適用 |
Dense |
最適化でデータの保存に “高密度” な方式(直線的に間を補間された離散値)を使用する Animation curve の数 |
少ない memory で動作可能 |
Stream |
String 型(curve 補間のための時間と接線の値)で “stream” 手法を使っているAnimation curve の総数 |
多くの memory を占有する(performance に影響) |
Animator
methods
public void SetInteger(string name, int value);
public void SetInteger(int id, int value);
- 現在の状態の AvatarTarget と targetNormalizedTime を設定
- 与えられた整数パラメータの値を設定
- Animator の state 間の遷移を triger する方法として使用
- Floats や Booleans の代わりに Integer を使う一つの方法として、複数 state を持つもの、例えば方向(turn left, turn rightなど)に使うことが可能
- 毎回 reset しなければならない複数の bool 値の代わりに、各方向を数値に対応できる
Animator Controller
- Object に紐づく AnimationClip、関連する Animation 遷移のセットを管理できる
- 例えば、space bar が押される度に、歩きの Animation からジャンプの Animation へ切り替えるなど
Animation State
name |
description |
note |
Motion |
state に割り当てられた AnimationClip または Blend Tree |
|
Speed |
この状態の Motion の Default の速度 |
|
Motion Time |
この状態の Motion の再生にかかる時間 |
|
Mirror |
この状態の Animation を mirroring できるようにする |
Humanoid Animation のある状態にのみ適用可 |
Cycle Offset |
offset は Motion の状態時間に追加される |
Motion Time には影響しない |
Foot IK |
この状態で Foot IK を尊重できるようにする |
Humanoid Animation のある状態にのみ適用可 |
Write Defaults |
Motion によって Animation 化されない property の Default 値を書き込むかどうか |
|
Transition |
この状態から発生する遷移のリスト |
|
Animation Transition
- State Machine が、ある Animation state から別 Animation state へ切り替わったり、blend したりすることを可能にする
- 遷移は 複数 state 間の blend にかかる時間の長さを指定するだけでなく、どのような条件下で blend が始まるかを指定
- 特定の条件が満たされたときにのみ遷移が起こるように設定することも可能
- これらの条件を設定するには、AnimatorController の parameter の値を指定する
State property
- 遷移の property を表示するには、Animator window で2つの state をつなぐ遷移の線をクリック
- Has Exit Time
- 遷移は Exit Time で指定した特定の時間に発生
- parameter に依存しない特別な遷移
- parameter の代わりに state の正規化された時間に依存する
- Settings
- Exit Time
- Has Exit Time が有効な場合
- Exit Time の値は遷移が始まる正確な時間を表す
- 正規化時間で表す
- 例えば Exit Time 0.75 は、その Animation の再生が75%に到達した最初の frame を意味する
- Exit Time の条件は true
- 次 frame では 条件は false
- Exit Time が 1 より小さい場合
- loop のたびに判定
- Animation の遷移の適切なタイミングを loop のたびに計ることが可能
- Exit Time が 1 より大きい場合
- 1度だけ判定
- 決まった回数の loop を行った後、特定の時点で終了できる
- 例えば、Exit Time 3.5 の遷移は、3.5 回ループを行った後1度だけ判定
- Fixed Duration
- 遷移時間は秒単位で決定
- チェックしない場合は、遷移時間は遷移元の state の正規時間に基づいて決定
- Transition Duration
- 現在の state の持続時間に対する遷移時間
- Fixed Duration に応じて、正規化された時間または秒で表される
- 遷移 graph で 2つの青いマーカーに挟まれた部分として表示される
- Transition Offset
- 遷移先 state の再生が開始される時点の offset
- 例えば 0.5 とすると、遷移先 state は timeline の 50% の時点から再生され始める
- Interruption Source
- Ordered Interruption
- 現在の遷移が(その順序に関係なく)他遷移によって割り込まれることを可能にするかどうか
- Conditions
- 遷移に1つまたは複数の条件を設定することが可能(条件なしも可)
- 無条件
- Exit Time のみを考慮し、終了時間に達すると遷移
- 1 つまたは複数の条件
- 遷移に Has Exit Time が選択 かつ 1 つ以上の条件
- 条件は state の Exit Time が過ぎるまでチェックされない
- 遷移が Animation の特定の部分内でのみ起こるようにできる
Interruption Source property
- AnyState の遷移は、常に queue の先頭に加えられる
- その後、他遷移が Interruption Source の値に基づいて queue に加えられる
name |
description |
None |
他遷移を加えることは不可 |
Current State |
現在の state からの遷移を予約可能 |
Next State |
次の state からの遷移を予約可能 |
Current State then Next State |
現在の state からの遷移を予約し、それから次の state からの遷移を予約可能 |
Next State then Current State |
次の state からの遷移を予約し、それから現在の state からの遷移を予約可能 |
Ordered Source property
- 予約されたものがどのようにパースされるかが変化
- その値によって、予約されたもののパースは異なるタイミングで終了する
name |
description |
Checked |
有効な遷移 または 現在の遷移が見つかっている時 |
Unchecked |
有効な遷移が見つかっている時 |
Playable API
- PlayableGraph と呼ばれる tree 構造に data source を整理して評価することで、tool、effect、他 Game PLay Mechanism を作成する方法
- AnimationController を量産する事無く animation を再生、動的な animation の追加、そして animation 同士を blend する
- AnimationController:全パターンを網羅した物を用意して「すべてを埋めない」イメージ
- Playable API:逐次 PlayableGraph に追加していくイメージ
- 複数 data source を Mix・Blend・変更し、1つの出力として再生可能
- Animation System にはすでに graph 編集 tool がある(Animation の再生に限定された State Machine system)
- Playable API はより自由自在で、他 system をサポートできるように設計されている
pros
- 動的な Animation の Blending が可能
- Scene の Object が独自 Animation を生成できる
- 例えば、武器、箱、罠の Animation を PlayableGraph に動的に加え、限られた時間だけ使用するなど
- AnimatorController Asset の作成と管理に関連する overhead 無しに、1つの Animation を簡単に再生できる
- 動的に blending graph を作成し、直接 frame 毎に Blending Weight を制御できる
- PlayableGraph は Runtime に作成され、条件に基づいて必要に応じて playable node が加えられる
- node が有効でもあり無効でもある "1サイズですべてに使用可" な大きな graph ではなく、PlayableGraph は、現状態の要件にぴったり合うように調整可能
PlayableGraph
- GameObject か component に bind した一群の playable の出力を定義
- 一群の playable とそれらの関係を定義
- playable とその出力を操作(playable を作成、接続、破棄可能)
- Playable と Playable 出力の主要な型は C# 構造体
- memory の garbage collection への割り当てを避けるため
-
Playable
はすべての playable の基底型
- つまり、常に暗示的に playable を
Playable
に cast 可能(その逆は不可)
- さらに、
Playable
は、 playable で実行するすべての基本 method を定義
- 型特有の method にアクセスするには、plyable を適切な型に cast する必要がある
- 同じことが
PlayableOutput
にも言える
-
PlayableOutput
はすべての playable の出力の基底型で、基本 method を定義
- すべての非抽象の Playable には、対応する型の playable を作成する静的 method
Create()
がある
-
Create()
method は常に PlayableGraph を最初の parameter として取る
- そして、graph は新規に作成された playable を所有する
- playable の型によっては、追加の parameter が必要な場合がある
- 非抽象の PlayableOutput もまた、外からのアクセス可能な
Create()
method を持つ
- 有効な PlayableOutput は Playable にリンクされていることが必要
- リンクされていない場合、PlayableOutput は何も行わない
- リンクするには
PlayableOutput.SetSourcePlayable()
method を使用
- リンクした Playable は、その特定の Playable の出力にとって Playable tree のルートのような働きをする
methods
method |
description |
note |
PlayableGraph.Create() |
PlayableGraph 作成 |
2つの playable を接続する際に使用 |
PlayableGraph.Play() |
PlayableGraph 再生 |
|
PlayableGraph.Stop() |
PlayableGraph 停止 |
|
PlayableGraph.Evaluate() |
PlayableGraph の特定の時刻の状態を評価 |
|
PlayableGraph.Destroy() |
PlayableGraph 破棄 |
- PlayableGraph で作成したすべての playable と playable の出力を自動的に破棄 - PlayableGraph を破棄するには、この破棄の method を手動で呼び出さなければならない |
ScriptPlayable & PlayableBehaviour
- カスタムの playable を作成するには、
PlayableBehaviour
base class から継承させる
public class MyCustomPlayableBehaviour : PlayableBehaviour {
}
- PlayableBehaviour をカスタムの playable として使用するには、
ScriptPlayable<>
object 内にカプセル化する必要もある
- カスタムの playable の instance がない場合は、以下を呼び出すことによって、object のための
ScriptPlayable<>
を作成可能
ScriptPlayable<MyCustomPlayableBehaviour>.Create(playableGraph);
- 既にカスタムの playable の instance がある場合、以下を呼び出すことによって
ScriptPlayable<>
で wrap 可能
- instance は
ScriptPlayable<>
に割り当てられる前に複製される
- この場合、
myPlayable
は public property にすることが可能
- public property は inspector で設定できる(script の各 instance の挙動を設定可能)
MyCustomPlayableBehaviour myPlayable = new MyCustomPlayableBehaviour();
ScriptPlayable<MyCustomPlayableBehaviour>.Create(playableGraph, myPlayable);
- 以下で
ScriptPlayable<>
の PlayableBehaviour
object を取得可能
ScriptPlayable<T> .GetBehaviour()
Discussion