using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; namespace AriaPlugin.Runtime.iTweenHelper { /// /// iTweenコンポーネント. /// public abstract class iTweenBehaviourBase : Coroutine.EventObject { [Serializable] public class AnimationTarget { public GameObject target; public SendMessageParameter onupdate; } #region Field [SerializeField] protected List animationTargetList = new List(); [SerializeField] protected bool isAutoStart = true; [SerializeField] protected float time = 1f; [SerializeField] protected float delay = 0f; [SerializeField] protected bool ignoreTimeScale = false; [SerializeField] protected iTween.EaseType easeType; [SerializeField] protected iTween.LoopType loopType; [SerializeField] protected SendMessageParameter onupdate = new SendMessageParameter(); [SerializeField] protected UnityEvent onstart; [SerializeField] protected UnityEvent oncomplete; protected Action tweenAction = (target, hash) => { }; #endregion // Field End. #region Method /// /// /// protected abstract void Initialize(); /// /// /// protected virtual Hashtable CreateHash() { Action onStartAction = () => { onstart.Invoke(); }; Action onCompleteAction = () => { oncomplete.Invoke(); }; return iTween.Hash( "time", time, "delay", delay, "easetype", easeType, "looptype", loopType, "onstart", onStartAction, "oncomplete", onCompleteAction, "ignoretimescale", ignoreTimeScale ); } /// /// メソッドの登録処理. /// public void Register(Action action) { tweenAction += action; } /// /// アニメーション開始処理. /// public void StartAnimation() { StartCoroutine(OnEventProcess()); } /// /// /// public override IEnumerator OnEventProcess() { var hash = CreateHash(); Func addHashAnimationTarget = (Hashtable hashtable, AnimationTarget param) => { if (param?.onupdate != null) { hashtable["onupdate"] = param.onupdate.invokeMethod; hashtable["onupdatetarget"] = param.onupdate.notifier; } return hashtable; }; for (int index = 1, max = animationTargetList.Count; index < max; index++) { tweenAction(animationTargetList[index].target, addHashAnimationTarget(hash, animationTargetList[index])); } yield return new WaitForTweenAnimation(animationTargetList[0].target, addHashAnimationTarget(hash, animationTargetList[0]), tweenAction); } /// /// コンポーネントの初期化. /// protected virtual void Reset() { animationTargetList.Clear(); animationTargetList.Add(new AnimationTarget() { target = this.gameObject, onupdate = new SendMessageParameter() { notifier = this.gameObject } }); } /// /// Unityによって呼び出される. /// private void Start() { Initialize(); if (isAutoStart) { StartAnimation(); } } #endregion // Method End. #if UNITY_EDITOR #region Editor [UnityEditor.MenuItem("CONTEXT/iTweenBehaviourBase/[ForTest]Invoke Start Animation")] private static void InvokeStartAnimation(UnityEditor.MenuCommand menuCommand) { var component = menuCommand.context as iTweenBehaviourBase; if (component == null) { return; } component.StartAnimation(); } #endregion // Editor End. #endif // UNITY_EDITOR END. } }