2020/11/09
というわけで、今回は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は非常に便利ですが、思わぬところで詰まることがあるので、今回のような経験を覚えておきたいところです。