using UnityEngine; using System.Collections; namespace UnityChan { // // ↑↓キーでループアニメーションを切り替えるスクリプト(ランダム切り替え付き)Ver.3 // 2014/04/03 N.Kobayashi // // Require these components when using this script [RequireComponent(typeof(Animator))] public class IdleChanger : MonoBehaviour { private Animator anim; // Animatorへの参照 private AnimatorStateInfo currentState; // 現在のステート状態を保存する参照 private AnimatorStateInfo previousState; // ひとつ前のステート状態を保存する参照 public bool _random = false; // ランダム判定スタートスイッチ public float _threshold = 0.5f; // ランダム判定の閾値 public float _interval = 10f; // ランダム判定のインターバル //private float _seed = 0.0f; // ランダム判定用シード // Use this for initialization void Start () { // 各参照の初期化 anim = GetComponent (); currentState = anim.GetCurrentAnimatorStateInfo (0); previousState = currentState; // ランダム判定用関数をスタートする StartCoroutine ("RandomChange"); } // Update is called once per frame void Update () { // ↑キー/スペースが押されたら、ステートを次に送る処理 if (Input.GetKeyDown ("up") || Input.GetButton ("Jump")) { // ブーリアンNextをtrueにする anim.SetBool ("Next", true); } // ↓キーが押されたら、ステートを前に戻す処理 if (Input.GetKeyDown ("down")) { // ブーリアンBackをtrueにする anim.SetBool ("Back", true); } // "Next"フラグがtrueの時の処理 if (anim.GetBool ("Next")) { // 現在のステートをチェックし、ステート名が違っていたらブーリアンをfalseに戻す currentState = anim.GetCurrentAnimatorStateInfo (0); if (previousState.fullPathHash != currentState.fullPathHash) { anim.SetBool ("Next", false); previousState = currentState; } } // "Back"フラグがtrueの時の処理 if (anim.GetBool ("Back")) { // 現在のステートをチェックし、ステート名が違っていたらブーリアンをfalseに戻す currentState = anim.GetCurrentAnimatorStateInfo (0); if (previousState.fullPathHash != currentState.fullPathHash) { anim.SetBool ("Back", false); previousState = currentState; } } } void OnGUI () { GUI.Box (new Rect (Screen.width - 110, 10, 100, 90), "Change Motion"); if (GUI.Button (new Rect (Screen.width - 100, 40, 80, 20), "Next")) anim.SetBool ("Next", true); if (GUI.Button (new Rect (Screen.width - 100, 70, 80, 20), "Back")) anim.SetBool ("Back", true); } // ランダム判定用関数 IEnumerator RandomChange () { // 無限ループ開始 while (true) { //ランダム判定スイッチオンの場合 if (_random) { // ランダムシードを取り出し、その大きさによってフラグ設定をする float _seed = Random.Range (0.0f, 1.0f); if (_seed < _threshold) { anim.SetBool ("Back", true); } else if (_seed >= _threshold) { anim.SetBool ("Next", true); } } // 次の判定までインターバルを置く yield return new WaitForSeconds (_interval); } } } }