アニメーションへの第一歩

Unity-Chanを使用して色々試した結果のメモ。
なお各語は自分用なので正しいものと一致するとは限らない。

・Animator Contollerの設定およびAnimator操作
Projectの中でCreate->Animator Controllerを作成する。
Animator Controllerを選択しAnimator Windowに移ることでアニメーションの状態遷移を作成する。
f:id:DYMN:20140625111205p:plain
Parametersで状態遷移に使用する変数(Float, Int, Bool, Trigger)を作成。スクリプト内と相互にやり取りできるようになる。

各StateとAnimationファイルを結びつけ、State間を矢印で結び遷移条件を付与することでオブジェクトに対するアニメーションを操作する。

新StateはCreate State->Emptyで作成する。From New Blend Treeについては後述。

図中の場合、IdleフラグがTrueになることでIdle状態にいる場合、Rest状態に移ることを意味している。
True下の+/-を使用することで他の条件を追加し、フラグのANDを取ることができる。
新たな矢印を追加することでORを取ることができる。たぶん。

遷移に使用する変数は左下のParameterで追加・削除を行う。+で追加、-で削除。

AnimationControllerをモデルに適用する場合は対象となるオブジェクトにAnimatorコンポーネントを追加し、Inspector上からControllerにAnimationControllerファイルを指定する。

スクリプト内での操作

スクリプト内でAnimationContollerにアクセスする場合は、ContollerをAnimationに適用した状態で
Animator anim = GetComponent();
のようにGetComponentで取得する。

スクリプト内での変数の操作例
anim.SetBool("Jump", false); "Jump"フラグをFalseにする
anim.SetFloat("Speed", Mathf.Abs(h)); "Speed"に変数hの絶対値をセットする
anim.GetBool("OnGround"); "OnGround"変数の現在の状態を取得する(Bool)
anim.GetFloat("JumpHeight"); "JumpHeight"変数の現在の値を取得する(Float)
anim.SetTrigger("Sliding"); "Sliding"変数をON/OFFする
anim.ResetTrigger("Sliding");

現在の状態Stateの取得
予め
static int idleState = Animator.StringToHash("Base Layer.Idle");
のような形でState毎のHash値を取得しておき(INT)
private AnimatorStateInfo currentBaseState = anim.GetCurrentAnimatorStateInfo(0)
を毎フレーム行い、Stateの現在状態を取得する。
以後
if(currentBaseState.nameHash == idleState)
の形で現在Stateに基いた処理を行うことが可能。遷移中か否かは
anim.IsInTransition(0)
で取得できる。

・各アニメーションへの設定

Stateから辿る場合。
Stateに設定されているアニメーションファイルを辿り、Animations内の親になるPrefabファイルを選択する。
(Explorerで見るとFBXファイルになっている)
Inspector->Animations内のCurvesを選択するとアニメーションの時間を横軸にしたグラフを操作可能。
JumpHeightの場合、時間経過で飛び上がった高さを変更するので、凸型のカーブを作成する。作成した後はInspector下部の「Apply」を押すことで適用する。
逆に言うと作成に失敗した場合はRevertを押すと元に戻る。
このカーブをスクリプト内で取得することでジャンプ時のキャラクターの当たり判定の大きさ変更に使用する。
f:id:DYMN:20140625111220p:plain

・BlendTree
新Stateを作るときにFrom New Blend Treeを選択することが可能。1つのStateの中で変数の値に応じて複数のアニメーションを呼び出すことができる。
図中Blend TreeにWALKとRUNの2つのアニメーションを設定し、変数Speedの0/0.8を閾値として与えている。
Animator側に与えたSpeedが0.8以上になると走りのアニメーションになる。
f:id:DYMN:20140625111222p:plain

参考http://www.slideshare.net/gametsukuru/ss-34996719