using UnityEngine;
|
using System.Collections;
|
using System;
|
|
namespace Snxxz.UI
|
{
|
[RequireComponent(typeof(RectTransform))]
|
public class Tween : MonoBehaviour
|
{
|
public TweenCurve curve;
|
public Vector3 from;
|
public Vector3 to;
|
|
public DelayMode delayMode = DelayMode.Time;
|
public float delay = 0f;
|
|
public float duration = 1f;
|
public Trigger trigger = Trigger.Manual;
|
public WrapMode wrapMode;
|
public bool reversal;
|
|
protected RectTransform rectTransform { get { return this.transform as RectTransform; } }
|
|
protected float accumulatedTime;
|
protected float curveLength;
|
protected bool doTween = false;
|
|
Action onPlayEndCallBack;
|
|
public virtual void SetStartState()
|
{
|
|
}
|
|
public virtual void SetEndState()
|
{
|
|
}
|
|
public void Play()
|
{
|
onPlayEndCallBack = null;
|
reversal = false;
|
StopAllCoroutines();
|
StartCoroutine(Co_StartTween());
|
}
|
|
public void Play(bool _reversal)
|
{
|
onPlayEndCallBack = null;
|
reversal = _reversal;
|
StopAllCoroutines();
|
StartCoroutine(Co_StartTween());
|
}
|
|
public void Play(Action _callBack)
|
{
|
reversal = false;
|
onPlayEndCallBack = _callBack;
|
StopAllCoroutines();
|
StartCoroutine(Co_StartTween());
|
}
|
|
public void Play(bool _reversal, Action _callBack)
|
{
|
reversal = _reversal;
|
onPlayEndCallBack = _callBack;
|
StopAllCoroutines();
|
StartCoroutine(Co_StartTween());
|
}
|
|
void Start()
|
{
|
if (trigger == Trigger.Start)
|
{
|
StartCoroutine(Co_StartTween());
|
}
|
}
|
|
protected virtual void OnEnable()
|
{
|
if (trigger == Trigger.Enable)
|
{
|
StartCoroutine(Co_StartTween());
|
}
|
}
|
|
protected virtual void OnDisable()
|
{
|
onPlayEndCallBack = null;
|
StopAllCoroutines();
|
}
|
|
void LateUpdate()
|
{
|
if (doTween && duration > 0.001f)
|
{
|
accumulatedTime += Time.deltaTime;
|
UpdateVector3();
|
|
switch (wrapMode)
|
{
|
case WrapMode.Once:
|
if (accumulatedTime > duration)
|
{
|
OnOnceEnd();
|
doTween = false;
|
}
|
break;
|
}
|
}
|
}
|
|
IEnumerator Co_StartTween()
|
{
|
if (delay < 0f)
|
{
|
DebugEx.LogError("Delaytime should not be less than zero!");
|
yield break;
|
}
|
if (duration < 0.001f)
|
{
|
DebugEx.LogError("Duration should not be less than zero!");
|
yield break;
|
}
|
|
if (curve.keys.Length < 2)
|
{
|
DebugEx.LogError("不正确的曲线!");
|
yield break;
|
}
|
|
accumulatedTime = 0f;
|
doTween = false;
|
OnPrepare();
|
switch (delayMode)
|
{
|
case DelayMode.OneFrame:
|
yield return null;
|
break;
|
case DelayMode.TwiceFrame:
|
yield return null;
|
yield return null;
|
break;
|
case DelayMode.Time:
|
if (delay > 0.001f)
|
{
|
yield return new WaitForSeconds(delay);
|
}
|
break;
|
}
|
|
curveLength = curve.keys[curve.keys.Length - 1].time - curve.keys[0].time;
|
doTween = true;
|
|
}
|
|
protected Vector3 CalculateVector3()
|
{
|
Vector3 newVector3 = Vector3.zero;
|
float t = 0f;
|
switch (wrapMode)
|
{
|
case WrapMode.Once:
|
t = (accumulatedTime / duration) * curveLength;
|
break;
|
case WrapMode.Loop:
|
t = Mathf.Repeat((accumulatedTime / duration) * curveLength, 1);
|
break;
|
case WrapMode.PingPong:
|
t = Mathf.PingPong((accumulatedTime / duration) * curveLength, 1);
|
break;
|
}
|
|
var value = curve.Evaluate(reversal ? curveLength - t : t);
|
newVector3 = Vector3.LerpUnclamped(from, to, value);
|
|
return newVector3;
|
}
|
|
protected virtual void OnPrepare()
|
{
|
|
}
|
|
protected virtual void OnOnceEnd()
|
{
|
if (onPlayEndCallBack != null)
|
{
|
onPlayEndCallBack();
|
onPlayEndCallBack = null;
|
}
|
}
|
|
protected virtual void UpdateVector3()
|
{
|
|
}
|
|
public void Stop()
|
{
|
doTween = false;
|
}
|
|
public enum DelayMode
|
{
|
OneFrame,
|
TwiceFrame,
|
Time,
|
}
|
|
public enum Trigger
|
{
|
Manual,
|
Start,
|
Enable,
|
}
|
|
public enum WrapMode
|
{
|
Once,
|
Loop,
|
PingPong,
|
}
|
}
|
}
|