今回はステートマシンを使用せずAnimatorでアニメーションを再生する、Simple Animationについてです。
ステートマシンにサヨナラを
Unity 4辺りから登場した多機能アニメーション再生機能 Mecanimですが、多くの場合「ステートマシンで制御する」という非常に面倒くさい制御機構を持つせいで、多くの手間がかかってきました。
例えばアニメーションにキャンセルが組み込まれると、スパゲティのごとく複雑なステートマシンを(しかもグラフィカルに!)組まなければならず…
例えばアニメーションを動的に追加したいようなケースでは、非常に面倒なお作法が存在し…
例えば普通にステートマシンを管理する場合も、大抵の場合はスクリプト側とステートマシン側で二重にパラメータを管理し…
例えば…例えば…例えば…
という感じで、制御機構に重大な問題を持っていたMecanimサンよりも、問題はあるにしても制御が簡単なレガシーAnimationコンポーネントを未だに採用している人はかなり多かった訳です。
Playable API
色々面倒くさいMecanimでしたが、Playable APIにてアニメーション再生の為の低レベルAPIにアクセスが可能になり、それを単品で処理する事が可能になりました。
これでアニメーションコントローラーを使用せずアニメーションを単体で再生可能になった訳です。
自分もそれを色々とコネコネして、Animation Controllerを使用せずアニメーションを再生する簡単なコンポーネントを作ったりもしました。
Unity公式の旧Animationを模したアニメーション再生コンポーネント
で、最近、旧Animationコンポーネントを模したアニメーション再生コンポーネントが、Unity公式Githubにオープンソースで登場しました。
Animationと同じようなインターフェースで、ステートマシン無しにアニメーションが再生できます。
アニメーション切替も超絶シンプル
またアニメーションの切替もAnimationと同じようなインターフェースで、ステートマシン無しにアニメーションが切替出来ます。
その際には、アニメーションには別途別名を設定して、そちらを使用して切り替えます。
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class PlayAnimation : MonoBehaviour | |
{ | |
void Update() | |
{ | |
if (Input.GetKeyDown (KeyCode.A)) { | |
GetComponent<SimpleAnimation> ().CrossFade ("Default", 0.5f); | |
} | |
if (Input.GetKeyDown (KeyCode.S)) { | |
GetComponent<SimpleAnimation> ().CrossFade ("Running", 0.5f); | |
} | |
} | |
} |
AnimatorのOptimised Game Objectも使える
SImpleAnimationはAnimator上で動作しているので、Mecanimで多少良い機能であるリターゲット(Humanoidなら大体使いまわせるアレ)や、Optimize Game Objectは使えます。少ないGameObjectで再生したり、着せ替えたりが便利です。ラグドール使えないけど。
AnimationControllerとの共存は?
AnimatorにAnimationControllerをセットした状態でSimpleAnimationを使用すると、SimpleAnimationが優先されました。
これは運によるかもしれませんが、どちらも使う…という感じの事は無理なようです。
もしAnimationControllerで既に動作しているキャラクターにアニメーションを流し込みたいといった場合には、Timelineを使うのが良いかもしれません。
どちらにしろ
これで2Dでステートマシン制御という、無意味な縛りが無くなりました。
AnimationControllerにステートマシンを置いて遷移を書かない…みたいな、色々な意味で勿体無い実装ともオサラバです。
ヤッタネ!