はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity 初めてAnimatorをまともに触った

あいさつ

どうも、はかせです。
最近Unityが続いています。
今日も今日とてUnityです。
今日はAnimatorですよ。

便利だけどメンドクサイAnimator

AnimatorはノードベースでAnimationの遷移等を管理できるものです。
ノードベースなのでスクリプトを一行も書かずにAnimationの追加、遷移ができます。
おまけに今のAnimationの再生状況が書くノードの下らへんにシークバーで表示もされるという
ぶっちゃけこれがあればAnimationとかちょろくね?って思うくらいGUIのみでAnimationの管理ができます。

そうGUIでならね。

メンドクサイのはスクリプトを絡ませようとした時です。
単純にAnimationのタイミングに合わせてやるだけならAnimationEventを使えば
ほぼGUIで実現できます。

ただスクリプトでAnimatorの遷移を管理しようとか思い出したら沼にハマります。
大人しくGUIでやりましょう。スクリプトなんぞ要らんのです。
と言わんばかりにスクリプトで操作するのはだるいです。
まずAnimation遷移ですが基本は専用のパラメータをAnimatorに用意して
Set○○系のメソッドに値を渡して遷移させます。

SetBool("設定したパラメータの名前",設定する値);
SetFloat("設定したパラメータの名前",設定する値);
SetInteger("設定したパラメータの名前",設定する値);

こいつの何が使いづらいかって
パラメータの名前がstring型で完全一致を要求してくるところです。
string型の文字列なんで予測変換も出ないですし
間違っていても警告一つでません。
そして今どのパラメータがどの値かを把握しきらなければ
意図したとおりの遷移もなかなかしてくれません。

多分ステートマシンやらなにやらとかとうまいこと折り合いをつけて
使うために必要なことだったんでしょう。
確かにState Machine Behaviourとかを継承して
スクリプトをノードにぶち込むとかもありますが、
ただAnimationを制御したいだけにしては手間がかかりすぎてる感じがします。

他にもAnimationの再生状態を直接取得する術がなく
再生時間などから再生状況を自前で判断するしかないとか
正直使いづらいです。
その程度Animatorの中に詰め込んでおいてほしいです。

まぁぐちぐち言っててもUnityさんがAnimatorを
スクリプトから扱いやすくしてくれるとはとても思えないので
なんかごにょるしかないです。

Animatorごにょり案

ネット上にも結構落ちてる方法ですが
AnimationClipを矢印で繋がずに
全て独立しておいておきスクリプト側で遷移を判断して
Animationを直接呼び出すやり方を私はよくやります。

そんなんするならAnimatorでなくていいやんって言われそうですが、
UnityでAnimationしたければほぼ絶対ついてくるので仕方ありません。
インスペクタなりでAnimationの名前を設定し

Animator.Play(Animator.StringToHash("Animationの名前"));

これで呼びます。
あとは呼ぶタイミングをうまいことするだけです。

あとがき

今回はUnityAnimatorの愚痴でした。
使いづらいですが
Unityの思考的におそらくノンコーディングを目指してると思うので
ある意味正しい形なんだと思います。
(私が異端者ですw)

異端者は異端者なりにUnityに向かい合いたいと思います。

それでは今回はこの辺でノシ