Animator

「Animator」の編集履歴(バックアップ)一覧に戻る

Animator - (2015/05/30 (土) 13:37:41) のソース

*使い方
①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の遷移をコードで行う
http://tsubakit1.hateblo.jp/entry/2015/02/11/223849
参考

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);
     }
   }
 }

CrossFade仕様
http://docs.unity3d.com/ScriptReference/Animator.CrossFade.html

*Animationをコードから指定する
参考
http://unitylab.wiki.fc2.com/wiki/%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

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);