ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】iTweenの停止と再実行について

time 2015/11/22

というわけで、今回はiTweenに関するちょっとしたメモのような感じになります!
お題はタイトル通り、iTwwenの停止と再実行に関してです。

自分のゲームでは所謂「2段ジャンプ」をiTweenで行っています。
AnimatorControllerの2段ジャンプステートにスクリプトを付与し、StateMachineBehaviourのOnStateEnter()で行っています。
Animatorの詳しい実装は割愛しますが、「ジャンプ中に再度ジャンプボタン押下」で実行します。

・・・が、実行したiTweenが残っている間に再度2段ジャンプをすると上手く動作しません。
timeで指定する値を小さくする手もありますが、全体的なアニメーションまで変わってしまい、得策とは言えません。
ここでiTween.Stop()の出番です!

using UnityEngine;

namespace StateController {

    public class DoubleJump : StateMachineBehaviour {

        public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            animator.gameObject.GetComponent<CharacterMotor>().movement.velocity.y = 0;
            iTween.Stop(animator.gameObject);

            iTween.MoveBy(animator.gameObject, iTween.Hash(
                "amount", new Vector3(0f, 25f, 0f),
                "time", 2f,
                "delay", 0.01f
            ));

            animator.ResetTrigger("Jump");
        }
    }
}

iTween.Stop()のオーバーロードは6種類あります。

・Stop()
・Stop(string type)
・Stop(GameObject target)
・Stop(GameObject target, bool includechildren)
・Stop(GameObject target, string type)
・Stop(GameObject target, string type, bool includechildren)

引数なしはシーン内の全iTweenが対象で、他は型や文字列、オブジェクトを指定して停止します。
「includechildren」で子オブジェクトを対象にするかを指定できます。
今回の対象はプレイヤー自身のiTweenなので、gameObjectを指定します。

iTween.Stop後にすぐ次のiTweenを実行すると上手くいかないようです。
自分の場合、引数として「delay」を指定し、体感できないレベルの遅延(0.01f)を入れてあげると上手くいきました!

iTweenは実行時にコンポーネントが付与されるので、それを削除・無効化するのも手かもしれません。
が、いちいち削除するのは面倒なので、自分は遅延させて実装しました。

まとめ

そんなわけで、iTweenの停止に関するちょっとしたお話でした。
iTweenは非常に便利ですが、思わぬところで詰まることがあるので、今回のような経験を覚えておきたいところです。

down

コメントする