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.
}
}