using UnityEngine;
using System.Collections;
using UnityEngine.UI;
namespace Tween
{
///
/// transfrom组件拓展类
///
public static class TweenExtension
{
#region 播放控制/暂停/重置/反转等
///
/// 对象身上的所有动画
///
/// The trans.
public static void TnPause(this Transform trans)
{
PauseOrContinue(trans.gameObject, true);
}
public static void TnReverse(this Transform trans)
{
for (int i = 0; i < TweenUtil.GetInstance().animList.Count; i++)
{
if (TweenUtil.GetInstance().animList[i].animGameObject == trans.gameObject)
{
TweenUtil.GetInstance().animList[i].Reverse();
}
}
}
///
/// 继续播放对象身上的所有动画
///
/// The trans.
public static void TnPlay(this Transform trans)
{
PauseOrContinue(trans.gameObject, false);
}
///
/// 所有动画立即从头开始
///
public static void TnRestart(this Transform trans)
{
PauseOrContinue(trans.gameObject, isReset: true);
}
private static void PauseOrContinue(GameObject animGameObject, bool isPause = true, bool isReset = false)
{
for (int i = 0; i < TweenUtil.GetInstance().animList.Count; i++)
{
if (TweenUtil.GetInstance().animList[i].animGameObject == animGameObject)
{
TweenUtil.GetInstance().animList[i].isPause = isPause;
if (isReset)
{
TweenUtil.GetInstance().animList[i].currentTime = 0;
TweenUtil.GetInstance().animList[i].isDone = false;
}
}
}
}
///
/// 停止一个对象身上的所有动画
///
/// 要停止动画的对象
/// 是否触发回调
public static void TnStop(this Transform trans, bool isCallBack = false)
{
for (int i = 0; i < TweenUtil.GetInstance().animList.Count; i++)
{
if (TweenUtil.GetInstance().animList[i].animGameObject == trans.gameObject)
{
if (isCallBack)
{
TweenScript dataTmp = TweenUtil.GetInstance().animList[i];
dataTmp.executeCallBack();
}
TweenScript tweenData = TweenUtil.GetInstance().animList[i];
TweenUtil.GetInstance().animList.RemoveAt(i);
i--;
StackObjectPool.PutObject(tweenData);
}
}
}
#endregion
#region TweenMove
///
/// 动画移动到某位置
///
///
public static TweenScript TnLocalMove(this Transform trans, Vector3? from, Vector3 to, float time = 0.5f,
float delayTime = 0)
{
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.isLocal = true;
tweenTmp.animGameObject = trans.gameObject;
tweenTmp.animType = AnimType.LocalPosition;
tweenTmp.fromV3 = from ?? trans.localPosition;
tweenTmp.toV3 = to;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
public static TweenScript TnMove(this Transform trans, Vector3? from, Vector3 to, float time = 0.5f,
float delayTime = 0, Transform toTransform = null)
{
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.isLocal = true;
tweenTmp.animGameObject = trans.gameObject;
tweenTmp.animType = AnimType.Position;
tweenTmp.fromV3 = from ?? trans.position;
tweenTmp.toV3 = to;
tweenTmp.toTransform = toTransform;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
//
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
#region TweenRotate
public static TweenScript TnRotate(this Transform trans, Vector3? from, Vector3 to,
float time = 0.5f,
float delayTime = 0,
bool isLocal = true)
{
AnimType animType;
Vector3 fromTmp;
if (isLocal)
{
fromTmp = from ?? trans.localEulerAngles;
animType = AnimType.LocalRotate;
}
else
{
fromTmp = from ?? trans.eulerAngles;
animType = AnimType.Rotate;
}
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.animGameObject = trans.gameObject;
tweenTmp.animType = animType;
tweenTmp.fromV3 = fromTmp;
tweenTmp.toV3 = to;
tweenTmp.isLocal = isLocal;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
#region TweenScale
public static TweenScript TnScale(this Transform trans, Vector3? from, Vector3 to,
float time = 0.5f,
float delayTime = 0)
{
Vector3 fromTmp = from ?? trans.localScale;
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.animGameObject = trans.gameObject;
tweenTmp.animType = AnimType.LocalScale;
tweenTmp.fromV3 = fromTmp;
tweenTmp.toV3 = to;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
#region TweenColor
public static TweenScript TnColorTo(this Transform trans, Color from, Color to,
float time = 0.5f,
float delayTime = 0,
bool isChild = false)
{
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.animGameObject = trans.gameObject;
tweenTmp.animType = AnimType.Color;
tweenTmp.fromColor = from;
tweenTmp.toColor = to;
tweenTmp.isChild = isChild;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
public static TweenScript TnAlphaTo(GameObject animObject, float from, float to,
float time = 0.5f,
float delayTime = 0,
bool isChild = false)
{
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.animGameObject = animObject;
tweenTmp.animType = AnimType.Alpha;
tweenTmp.fromFloat = from;
tweenTmp.toFloat = to;
tweenTmp.isChild = isChild;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
#region UGUI Color
///
/// 动画过度到目标颜色
///
public static TweenScript TnUguiColor(this RectTransform rectTrans, Color? from, Color to,
float time = 0.5f,
float delayTime = 0,
bool isChild = false)
{
Color fromTmp = from ?? Color.white;
if (from == null)
{
if (rectTrans.GetComponent() != null)
{
fromTmp = from ?? rectTrans.GetComponent().color;
}
}
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.animGameObject = rectTrans.gameObject;
tweenTmp.animType = AnimType.UGUI_Color;
tweenTmp.fromColor = fromTmp;
tweenTmp.toColor = to;
tweenTmp.isChild = isChild;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
#region UGUI Alpha
public static TweenScript TnUguiAlpha(this RectTransform rectTrans, float? from, float to,
float time,
float delayTime = 0,
bool isChild = false)
{
float fromTmp = from ?? 1;
if (from == null)
{
if (rectTrans.GetComponent() != null)
{
fromTmp = from ?? rectTrans.GetComponent().color.a;
}
}
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.animGameObject = rectTrans.gameObject;
tweenTmp.animType = AnimType.UGUI_Alpha;
tweenTmp.fromFloat = fromTmp;
tweenTmp.toFloat = to;
tweenTmp.isChild = isChild;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
#region UGUI Move
///
/// UGUI Move RectTransform .anchoredPosition3D
///
public static TweenScript TnUguiMove(this RectTransform rectTrans, Vector3 to,
float time = 0.5f,
float delayTime = 0)
{
Vector3 fromTmp = rectTrans.GetComponent().anchoredPosition;
TweenScript tweenTmp = StackObjectPool.GetObject();
;
tweenTmp.animGameObject = rectTrans.gameObject;
tweenTmp.animType = AnimType.UGUI_AnchoredPosition;
tweenTmp.fromV3 = fromTmp;
tweenTmp.toV3 = to;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
public static TweenScript TnUguiRotate(this RectTransform rectTrans, Vector3 to,
float time = 0.5f,
float delayTime = 0)
{
Vector3 fromTmp = rectTrans.GetComponent().eulerAngles;
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.animGameObject = rectTrans.gameObject;
tweenTmp.animType = AnimType.UGUI_AnchoredRotate;
tweenTmp.fromV3 = fromTmp;
tweenTmp.toV3 = to;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
public static TweenScript TnUguiLocalRotate(this RectTransform rectTrans, Vector3 to,
float time = 0.5f,
float delayTime = 0
)
{
Vector3 fromTmp = rectTrans.GetComponent().localEulerAngles;
TweenScript tweenTmp = StackObjectPool.GetObject();
;
tweenTmp.animGameObject = rectTrans.gameObject;
tweenTmp.animType = AnimType.UGUI_AnchoredLocalRotate;
tweenTmp.fromV3 = fromTmp;
tweenTmp.toV3 = to;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
public static TweenScript TnUguiScale(this RectTransform rectTrans, Vector3 to,
float time = 0.5f,
float delayTime = 0)
{
Vector3 fromTmp = rectTrans.GetComponent().localScale;
TweenScript tweenTmp = StackObjectPool.GetObject();
;
tweenTmp.animGameObject = rectTrans.gameObject;
tweenTmp.animType = AnimType.UGUI_AnchoredScale;
tweenTmp.fromV3 = fromTmp;
tweenTmp.toV3 = to;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
#region UGUI_Size /width/height
///
/// UGUI RectTransfrom 放大缩小
/// width/height
///
public static TweenScript TnUguiSize(this RectTransform rectTrans, Vector2? from, Vector2 to,
float time = 0.5f,
float delayTime = 0)
{
Vector2 fromTmp = from ?? rectTrans.GetComponent().sizeDelta;
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.animGameObject = rectTrans.gameObject;
tweenTmp.animType = AnimType.UGUI_Size;
tweenTmp.fromV2 = fromTmp;
tweenTmp.toV2 = to;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
#region Display and Hide
///
/// 隐藏/显示
///
public static TweenScript TnBlink(this Transform trans, float space,
float time = 0.5f,
float delayTime = 0)
{
TweenScript tweenTmp = StackObjectPool.GetObject();
tweenTmp.animType = AnimType.Blink;
tweenTmp.animGameObject = trans.gameObject;
tweenTmp.blinkTime = space;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
#region TweenPathMove
public static TweenScript TnPathMove(this Transform trans, Vector3? from, Vector3[] path,
float time = 2,
float delayTime = 0,
bool isLocal = false,
PathType pathType = PathType.PathLinear)
{
TweenScript tweenTmp = StackObjectPool.GetObject();
if (pathType == PathType.Line)
{
pathType = PathType.PathLinear;
}
if (isLocal)
{
tweenTmp.animType = AnimType.LocalPosition; // 动画类型
tweenTmp.fromV3 = from ?? trans.transform.localPosition;
}
else
{
tweenTmp.animType = AnimType.Position;
tweenTmp.fromV3 = from ?? trans.transform.position;
}
if (path.Length < 2)
{
pathType = PathType.Line; //小于1个点。
Debug.LogError("Path point it's too short ");
}
else
{
Vector3[] realPath = new Vector3[path.Length + 1];
realPath[0] = tweenTmp.fromV3;
for (int i = 0; i < path.Length; i++)
{
realPath[i + 1] = path[i];
}
tweenTmp.pathPoints = realPath;
}
tweenTmp.animGameObject = trans.gameObject;
tweenTmp.isLocal = isLocal;
tweenTmp.pathType = pathType;
tweenTmp.SetDelay(delayTime);
tweenTmp.totalTime = time;
tweenTmp.Init();
TweenUtil.GetInstance().animList.Add(tweenTmp);
return tweenTmp;
}
#endregion
}
}