Animator

使い方

①Animatorを作る
②既存のAnimationをドロップすると「State」ができる。
③「State」同士をTransitionを作って結ぶ
③Animatorの右上のタブからParametersを選び、「+」で任意のフラグを追加する(例えばBoolで作って、チェックを入れる)
④transitionをクリックして③で作ったフラグの条件true/falseをconditionを追加する
⑤AnimatorにAddしているscriptからフラグを制御して、stateの遷移を制御する
 if (Input.GetKey(KeyCode.Space))
   anim.SetBool ("DoWin", true);
 else
   anim.SetBool ("DoWin", false);
 例えば、スペースキーを押したままにすると、DoWinフラグがtrueになり、
 Animatorで作った遷移に従って、該当のAnimationが再生される

遷移を簡単に記述する方法

例えば、Playerがチョップをするモーションの場合、チョップが終わると必ずIdleに戻るので、
戻る遷移は、条件を無くして、has exit timeを残しておく。
こうすれば、モーション完了まではモーションが継続し、終わったらIdleに自動的に戻る。
わざわざflagをfalseにする処理を入れるのは無駄だし、モーション完了が分からないので、
曖昧なタイマーを仕込むことに成る。

animationのBlend

 AnimatorのAnimationは、遷移する時に、Animation同士のブレンドがされて、自然な変化になるように調整される。ブレンドの割合は、transitionをクリックして選択したsettingsで調整できる
 ただし、2DのSpriteではBlendなんてできないので不要


2DでのAnimation

multiple指定のSpriteで、SpriteEditorから複数のモーションを選択して設定することで、その複数シーンを連続して再生するAnimationが作られ、かつ、Animatorに一つのstateとして登録される

アニメーションを止める方法

animator.speed = 0;

AnimatorStateInfo

Animator anim;
int runStateHash = Animator.StringToHash("Base Layer.Run");
// 予めハッシュを取得しておく Runがstateの名前
void Start()
{
  anim= GetComponent<Animator>();
}
void Update()
{
  AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0); //0はLayer番号
  stateInfo.nameHashにAnimatorの現在のステートのハッシュが入っている
  if( stateInfo.nameHash == runStateHash) { ... }
  //走っている状態の時といった条件が指定できる
}

Animatorの遷移をコードで行う


parametersを設定してフラグをon/offするのは設定が面倒なので、
コードで直接遷移を実現する方法
CrossFade関数は、アニメとアニメをブレンドして実行する
第一引数はstateの名称

スペースキーを押すと前に進む
public class GirlController : MonoBehaviour {
  Animator animator;
  void Start () {
    animator = GetComponent<Animator> ();
    animator.Play ("Idle");
  }
  void Update () {
    if (Input.GetKeyDown (KeyCode.Space)) {
      animator.CrossFade("Walk",1f);
    }
  }
}


Animationをコードから指定する


AddComponentでAnimationを追加する
sizeに登録したいanimationの数を入れて、
Elementにドロップして登録する
単純に再生するときは、
animation.Play ("idle");
現在のアニメーションからブレンドして再生する時は、
animation.CrossFade ("Run", 0.5f);


最初から再生させる

 animation.CrossFadeQueued ("up_sword", 0.5f, QueueMode.CompleteOthers);
 //通常のクロスフェードと若干異なり最初から再生される
 //CrossFade()側を使うとloopの場合、フレームがStopしてもクリアされず進んだ状態で記憶されている

アニメ遷移時にイベント起動

 AnimationEvent ev = new AnimationEvent ();
 ev.time = 0.0f;
 ev.functionName = "StepSound";
 ev.floatParameter = 1.0f;
 animation ["run"].clip.AddEvent (ev);

タグ:

unity
最終更新:2015年05月30日 13:37