You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
408 lines
14 KiB
408 lines
14 KiB
4 years ago
|
using UnityEngine;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System;
|
||
|
using UnityEngine.UI;
|
||
|
#if UNITY_EDITOR
|
||
|
using UnityEditor;
|
||
|
#endif
|
||
|
namespace Tween
|
||
|
{
|
||
|
public class TweenUtil : MonoBehaviour
|
||
|
{
|
||
|
#region 静态部分
|
||
|
static TweenUtil instance;
|
||
|
// static AnimParamHash HashTemp = new AnimParamHash();
|
||
|
public static TweenUtil GetInstance()
|
||
|
{
|
||
|
if (instance == null)
|
||
|
{
|
||
|
GameObject animGameObject = new GameObject();
|
||
|
animGameObject.name = "[TweenUtil]";
|
||
|
instance = animGameObject.AddComponent<TweenUtil>();
|
||
|
#if UNITY_EDITOR
|
||
|
if (Application.isPlaying)
|
||
|
{
|
||
|
DontDestroyOnLoad(instance.gameObject);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
EditorApplication.update += instance.Update;
|
||
|
}
|
||
|
#else
|
||
|
DontDestroyOnLoad(instance.gameObject);
|
||
|
#endif
|
||
|
}
|
||
|
return instance;
|
||
|
}
|
||
|
#region CustomTween
|
||
|
public static TweenScript CustomTweenFloat(AnimCustomMethodFloat method, float from, float to,
|
||
|
float time = 0.5f,
|
||
|
float delayTime = 0,
|
||
|
bool IsIgnoreTimeScale = false,
|
||
|
LoopType repeatType = LoopType.Once,
|
||
|
int repeatCount = -1)
|
||
|
{
|
||
|
TweenScript tweenTmp = StackObjectPool<TweenScript>.GetObject();
|
||
|
tweenTmp.animType = AnimType.Custom_Float;
|
||
|
tweenTmp.fromFloat = from;
|
||
|
tweenTmp.toFloat = to;
|
||
|
tweenTmp.customMethodFloat = method;
|
||
|
tweenTmp.SetDelay(delayTime);
|
||
|
tweenTmp.totalTime = time;
|
||
|
tweenTmp.SetLoopType(repeatType, repeatCount);
|
||
|
// l_tmp.isIgnoreTimeScale = IsIgnoreTimeScale;
|
||
|
tweenTmp.Init();
|
||
|
GetInstance().animList.Add(tweenTmp);
|
||
|
return tweenTmp;
|
||
|
}
|
||
|
public static TweenScript CustomTweenVector2(AnimCustomMethodVector2 method, Vector2 from, Vector2 to,
|
||
|
float time = 0.5f,
|
||
|
float delayTime = 0,
|
||
|
bool IsIgnoreTimeScale = false,
|
||
|
LoopType repeatType = LoopType.Once,
|
||
|
int repeatCount = -1)
|
||
|
{
|
||
|
TweenScript tweenTmp = StackObjectPool<TweenScript>.GetObject();
|
||
|
tweenTmp.animType = AnimType.Custom_Vector2;
|
||
|
tweenTmp.fromV2 = from;
|
||
|
tweenTmp.toV2 = to;
|
||
|
tweenTmp.customMethodV2 = method;
|
||
|
tweenTmp.SetDelay(delayTime);
|
||
|
tweenTmp.totalTime = time;
|
||
|
tweenTmp.SetLoopType(repeatType, repeatCount);
|
||
|
// l_tmp.isIgnoreTimeScale = IsIgnoreTimeScale;
|
||
|
tweenTmp.Init();
|
||
|
GetInstance().animList.Add(tweenTmp);
|
||
|
return tweenTmp;
|
||
|
}
|
||
|
public static TweenScript CustomTweenVector3(AnimCustomMethodVector3 method, Vector3 from, Vector3 to,
|
||
|
float time = 0.5f,
|
||
|
float delayTime = 0,
|
||
|
bool IsIgnoreTimeScale = false,
|
||
|
LoopType repeatType = LoopType.Once,
|
||
|
int repeatCount = -1)
|
||
|
{
|
||
|
TweenScript tweenTmp = StackObjectPool<TweenScript>.GetObject();
|
||
|
tweenTmp.animType = AnimType.Custom_Vector3;
|
||
|
tweenTmp.fromV3 = from;
|
||
|
tweenTmp.toV2 = to;
|
||
|
tweenTmp.customMethodV3 = method;
|
||
|
tweenTmp.SetDelay(delayTime);
|
||
|
tweenTmp.totalTime = time;
|
||
|
tweenTmp.SetLoopType(repeatType, repeatCount);
|
||
|
// l_tmp.isIgnoreTimeScale = IsIgnoreTimeScale;
|
||
|
tweenTmp.Init();
|
||
|
GetInstance().animList.Add(tweenTmp);
|
||
|
return tweenTmp;
|
||
|
}
|
||
|
#endregion
|
||
|
#region ValueTo
|
||
|
/*
|
||
|
public static TweenScript ValueTo(AnimParamHash l_animHash)
|
||
|
{
|
||
|
TweenScript l_tmp = l_animHash.GetAnimData();
|
||
|
l_tmp.Init();
|
||
|
GetInstance().animList.Add(l_tmp);
|
||
|
return l_tmp;
|
||
|
}
|
||
|
public class AnimParamHash : Dictionary<AnimParamType, object>
|
||
|
{
|
||
|
public AnimParamHash(params object[] l_params)
|
||
|
{
|
||
|
for (int i = 0; i < l_params.Length; i += 2)
|
||
|
{
|
||
|
this[(AnimParamType)l_params[i]] = l_params[i + 1];
|
||
|
}
|
||
|
}
|
||
|
public AnimParamHash SetData(params object[] l_params)
|
||
|
{
|
||
|
Clear();
|
||
|
for (int i = 0; i < l_params.Length; i += 2)
|
||
|
{
|
||
|
this[(AnimParamType)l_params[i]] = l_params[i + 1];
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
public TweenScript GetAnimData()
|
||
|
{
|
||
|
TweenScript DataTmp = StackObjectPool<TweenScript>.GetObject();
|
||
|
foreach (var hash in this)
|
||
|
{
|
||
|
AnimParamType l_ParamType = hash.Key;
|
||
|
switch (l_ParamType)
|
||
|
{
|
||
|
//基础参数
|
||
|
case AnimParamType.GameObj:
|
||
|
DataTmp.animGameObject = (GameObject)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.AnimType:
|
||
|
DataTmp.animType = (AnimType)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.Time:
|
||
|
DataTmp.totalTime = (float)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.InteType:
|
||
|
DataTmp.m_easeType = (Ease)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.RepeatType:
|
||
|
DataTmp.repeatType = (RepeatType)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.RepeatCount:
|
||
|
DataTmp.repeatCount = (int)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.DelayTime:
|
||
|
DataTmp.delayTime = (float)hash.Value;
|
||
|
break;
|
||
|
//From
|
||
|
case AnimParamType.FromV3:
|
||
|
DataTmp.fromV3 = (Vector3)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.FromV2:
|
||
|
DataTmp.fromV2 = (Vector2)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.FromColor:
|
||
|
DataTmp.fromColor = (Color)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.FromFloat:
|
||
|
DataTmp.fromFloat = (float)hash.Value;
|
||
|
break;
|
||
|
//To
|
||
|
case AnimParamType.ToV3:
|
||
|
DataTmp.toV3 = (Vector3)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.ToV2:
|
||
|
DataTmp.toV2 = (Vector2)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.ToColor:
|
||
|
DataTmp.toColor = (Color)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.ToFloat:
|
||
|
DataTmp.toFloat = (float)hash.Value;
|
||
|
break;
|
||
|
//动画回调
|
||
|
case AnimParamType.CallBack:
|
||
|
DataTmp.animCallBack = (AnimCallBack)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.CallBackParams:
|
||
|
DataTmp.animParameter = (object[])hash.Value;
|
||
|
break;
|
||
|
//定制函数
|
||
|
case AnimParamType.CustomMethodV3:
|
||
|
DataTmp.customMethodV3 = (AnimCustomMethodVector3)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.CustomMethodV2:
|
||
|
DataTmp.customMethodV2 = (AnimCustomMethodVector2)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.CustomMethodFloat:
|
||
|
DataTmp.customMethodFloat = (AnimCustomMethodFloat)hash.Value;
|
||
|
break;
|
||
|
//闪烁
|
||
|
case AnimParamType.Space:
|
||
|
DataTmp.blinkTime = (float)hash.Value;
|
||
|
break;
|
||
|
//路径运动
|
||
|
case AnimParamType.PathType:
|
||
|
DataTmp.m_pathType = (PathType)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.PathData:
|
||
|
DataTmp.pathPoints = (Vector3[])hash.Value;
|
||
|
break;
|
||
|
//其他设置
|
||
|
case AnimParamType.IsIncludeChild:
|
||
|
DataTmp.isChild = (bool)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.IsLocal:
|
||
|
DataTmp.isLocal = (bool)hash.Value;
|
||
|
break;
|
||
|
case AnimParamType.IsIgnoreTimeScale:
|
||
|
DataTmp.isIgnoreTimeScale = (bool)hash.Value;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return DataTmp;
|
||
|
}
|
||
|
}
|
||
|
*/
|
||
|
#endregion
|
||
|
#region 功能函数
|
||
|
/// <summary>
|
||
|
/// 停止一个动画
|
||
|
/// </summary>
|
||
|
/// <param name="animGameObject">要停止的动画</param>
|
||
|
/// <param name="isCallBack">是否触发回调</param>
|
||
|
public static void StopAnim(TweenScript tweenData, bool isCallBack = false)
|
||
|
{
|
||
|
if (isCallBack)
|
||
|
{
|
||
|
tweenData.executeCallBack();
|
||
|
}
|
||
|
GetInstance().animList.Remove(tweenData);
|
||
|
StackObjectPool<TweenScript>.PutObject(tweenData);
|
||
|
}
|
||
|
public static void FinishAnim(TweenScript tweenData)
|
||
|
{
|
||
|
tweenData.currentTime = tweenData.totalTime;
|
||
|
tweenData.executeUpdate();
|
||
|
tweenData.executeCallBack();
|
||
|
GetInstance().animList.Remove(tweenData);
|
||
|
StackObjectPool<TweenScript>.PutObject(tweenData);
|
||
|
}
|
||
|
public static void ClearAllAnim(bool isCallBack = false)
|
||
|
{
|
||
|
if (isCallBack)
|
||
|
{
|
||
|
for (int i = 0; i < GetInstance().animList.Count; i++)
|
||
|
{
|
||
|
GetInstance().animList[i].executeCallBack();
|
||
|
GetInstance().animList.RemoveAt(i);
|
||
|
i--;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
GetInstance().animList.Clear();
|
||
|
}
|
||
|
}
|
||
|
#endregion
|
||
|
#endregion
|
||
|
#region 实例部分
|
||
|
public List<TweenScript> animList = new List<TweenScript>();
|
||
|
public void Update()
|
||
|
{
|
||
|
for (int i = 0; i < animList.Count; i++)
|
||
|
{
|
||
|
animList[i].executeUpdate();
|
||
|
if (animList[i].isDone == true)
|
||
|
{
|
||
|
TweenScript tweenTmp = animList[i];
|
||
|
if (!tweenTmp.AnimReplayLogic())
|
||
|
{
|
||
|
animList.Remove(tweenTmp);
|
||
|
i--;
|
||
|
StackObjectPool<TweenScript>.PutObject(tweenTmp);
|
||
|
}
|
||
|
tweenTmp.executeCallBack();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endregion
|
||
|
}
|
||
|
#region 枚举与代理声明
|
||
|
public delegate void AnimCallBack(params object[] arg);
|
||
|
public delegate void AnimCustomMethodVector3(Vector3 data);
|
||
|
public delegate void AnimCustomMethodVector2(Vector2 data);
|
||
|
public delegate void AnimCustomMethodFloat(float data);
|
||
|
/// <summary>
|
||
|
/// 动画类型
|
||
|
/// </summary>
|
||
|
public enum AnimType
|
||
|
{
|
||
|
LocalPosition,
|
||
|
Position,
|
||
|
LocalScale,
|
||
|
LocalRotate,
|
||
|
Rotate,
|
||
|
Color, // SpriteRenderer.Color
|
||
|
Alpha,
|
||
|
UGUI_Color, // Image.Color Text.Color
|
||
|
UGUI_Alpha,
|
||
|
UGUI_AnchoredPosition,
|
||
|
UGUI_AnchoredRotate,
|
||
|
UGUI_AnchoredLocalRotate,
|
||
|
UGUI_AnchoredScale,
|
||
|
UGUI_Size,
|
||
|
Custom_Vector3,
|
||
|
Custom_Vector2,
|
||
|
Custom_Float,
|
||
|
Blink,
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 插值算法类型
|
||
|
/// </summary>
|
||
|
public enum Ease
|
||
|
{
|
||
|
Default,
|
||
|
Linear,
|
||
|
InBack,
|
||
|
OutBack,
|
||
|
InOutBack,
|
||
|
OutInBack,
|
||
|
InQuad,
|
||
|
OutQuad,
|
||
|
InoutQuad,
|
||
|
InCubic,
|
||
|
OutCubic,
|
||
|
InoutCubic,
|
||
|
OutInCubic,
|
||
|
InQuart,
|
||
|
OutQuart,
|
||
|
InOutQuart,
|
||
|
OutInQuart,
|
||
|
InQuint,
|
||
|
OutQuint,
|
||
|
InOutQuint,
|
||
|
OutInQuint,
|
||
|
InSine,
|
||
|
OutSine,
|
||
|
InOutSine,
|
||
|
OutInSine,
|
||
|
InExpo,
|
||
|
OutExpo,
|
||
|
InOutExpo,
|
||
|
OutInExpo,
|
||
|
OutBounce,
|
||
|
InBounce,
|
||
|
InOutBounce,
|
||
|
OutInBounce,
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 动画控制类型
|
||
|
/// </summary>
|
||
|
// public enum AnimParamType
|
||
|
// {
|
||
|
// GameObj,
|
||
|
// FromV3,
|
||
|
// FromV2,
|
||
|
// FromFloat,
|
||
|
// FromColor,
|
||
|
// ToV3,
|
||
|
// ToV2,
|
||
|
// ToFloat,
|
||
|
// ToColor,
|
||
|
// DelayTime,
|
||
|
// AnimType,
|
||
|
// Time,
|
||
|
// InteType,
|
||
|
// IsIgnoreTimeScale,
|
||
|
// PathType,
|
||
|
// PathData,
|
||
|
// // floatControl,
|
||
|
// IsIncludeChild,
|
||
|
// IsLocal,
|
||
|
// RepeatType,
|
||
|
// RepeatCount,
|
||
|
// CustomMethodV3,
|
||
|
// CustomMethodV2,
|
||
|
// CustomMethodFloat,
|
||
|
// Space,
|
||
|
// CallBack,
|
||
|
// CallBackParams
|
||
|
// }
|
||
|
/// <summary>
|
||
|
/// 路径类型
|
||
|
/// </summary>
|
||
|
public enum PathType
|
||
|
{
|
||
|
Line,
|
||
|
PathBreak,
|
||
|
PathLinear,
|
||
|
}
|
||
|
public enum LoopType
|
||
|
{
|
||
|
Once,
|
||
|
Loop,
|
||
|
PingPang,
|
||
|
}
|
||
|
#endregion
|
||
|
}
|