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.
1049 lines
32 KiB
1049 lines
32 KiB
using UnityEngine; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using UnityEngine.UI; |
|
using System; |
|
|
|
namespace Tween |
|
{ |
|
public class TweenScript : IStackObject |
|
{ |
|
#region 参数 |
|
|
|
//基本变量 |
|
public GameObject animGameObject; |
|
|
|
public AnimType animType; |
|
public PathType pathType = PathType.Line; |
|
public bool isDone = false; |
|
public float currentTime = 0; |
|
public float totalTime = 0; |
|
private float currentPercentage; // 可不用初始化或重置 |
|
|
|
|
|
//V3 |
|
public Vector3 fromV3; |
|
|
|
public Vector3 toV3; |
|
|
|
//V2 |
|
public Vector2 fromV2; |
|
|
|
public Vector2 toV2; |
|
|
|
//Float |
|
public float fromFloat = 0; |
|
|
|
public float toFloat = 0; |
|
|
|
//Move To(优先 toV3) |
|
public Transform toTransform; |
|
|
|
//Color |
|
public Color fromColor; |
|
|
|
public Color toColor; |
|
|
|
List<Color> m_oldColor = new List<Color>(); |
|
|
|
//闪烁 |
|
public float blinkTime = 0; |
|
|
|
float blinkCurrentTime = 0; |
|
|
|
//其他设置 |
|
public bool isChild = false; |
|
|
|
public bool isLocal = false; |
|
|
|
public bool isPause = false; |
|
|
|
//路径 |
|
public Vector3[] pathPoints = null; //路径 |
|
|
|
private float[] pathWeith; |
|
|
|
private int currentStep = 0; |
|
|
|
//自定义函数 |
|
public AnimCustomMethodVector3 customMethodV3; |
|
|
|
public AnimCustomMethodVector2 customMethodV2; |
|
|
|
public AnimCustomMethodFloat customMethodFloat; |
|
|
|
//缓存变量 |
|
RectTransform m_rectRransform; |
|
|
|
Transform m_transform; |
|
|
|
#endregion |
|
|
|
#region 非必须初始化变量/动画循环/延迟/缓动等。 |
|
|
|
private bool isRecyclable = true; |
|
private object[] animParameter; //动画回调参数 |
|
private AnimCallBack animCallBack; |
|
private float delayTime = 0; |
|
private bool isIgnoreTimeScale = false; |
|
private Ease easeType = Ease.Linear; |
|
private int loopCount = -1; // 动画重复次数 |
|
private LoopType loopType = LoopType.Once; |
|
private AnimationCurve curve; |
|
|
|
/// <summary> |
|
/// </summary> |
|
/// <param name="isable">false 不回收脚本</param> |
|
/// <returns></returns> |
|
public TweenScript SetRecyclable(bool isable) |
|
{ |
|
isRecyclable = isable; |
|
return this; |
|
} |
|
|
|
public TweenScript SetCallBack(AnimCallBack callBack, object[] parameter = null) |
|
{ |
|
animCallBack = callBack; |
|
animParameter = parameter; |
|
return this; |
|
} |
|
|
|
public TweenScript SetLoopType(LoopType type, int loopCount = -1) |
|
{ |
|
loopType = type; |
|
this.loopCount = loopCount; |
|
return this; |
|
} |
|
|
|
public TweenScript SetIgnoreIimeScale(bool ignore) |
|
{ |
|
isIgnoreTimeScale = ignore; |
|
return this; |
|
} |
|
|
|
public TweenScript SetDelay(float delay) |
|
{ |
|
delayTime = delay; |
|
return this; |
|
} |
|
|
|
public TweenScript SetEase(Ease ease) |
|
{ |
|
easeType = ease; |
|
return this; |
|
} |
|
|
|
public TweenScript SetEase(AnimationCurve animationCurve) |
|
{ |
|
easeType = Ease.Default; |
|
curve = animationCurve; |
|
return this; |
|
} |
|
|
|
#endregion |
|
|
|
#region 核心函数 |
|
|
|
public void executeUpdate() |
|
{ |
|
if (isPause || isDone) |
|
{ |
|
return; |
|
} |
|
if (delayTime <= 0) |
|
{ |
|
if (isIgnoreTimeScale) |
|
{ |
|
currentTime += Time.unscaledDeltaTime; |
|
} |
|
else |
|
{ |
|
currentTime += Time.deltaTime; |
|
} |
|
} |
|
else |
|
{ |
|
if (isIgnoreTimeScale) |
|
{ |
|
delayTime -= Time.unscaledDeltaTime; |
|
} |
|
else |
|
{ |
|
delayTime -= Time.deltaTime; |
|
} |
|
} |
|
if (currentTime >= totalTime) |
|
{ |
|
currentTime = totalTime; |
|
isDone = true; |
|
} |
|
try |
|
{ |
|
switch (animType) |
|
{ |
|
case AnimType.UGUI_Color: |
|
UguiColor(); |
|
break; |
|
case AnimType.UGUI_Alpha: |
|
UguiAlpha(); |
|
break; |
|
case AnimType.UGUI_AnchoredPosition: |
|
UguiPosition(); |
|
break; |
|
case AnimType.UGUI_AnchoredRotate: |
|
UguiRotate(); |
|
break; |
|
case AnimType.UGUI_AnchoredLocalRotate: |
|
UguiRotate(); |
|
break; |
|
case AnimType.UGUI_AnchoredScale: |
|
UguiScale(); |
|
break; |
|
case AnimType.UGUI_Size: |
|
SizeDelta(); |
|
break; |
|
case AnimType.Position: |
|
Position(); |
|
break; |
|
case AnimType.LocalPosition: |
|
LocalPosition(); |
|
break; |
|
case AnimType.LocalScale: |
|
LocalScale(); |
|
break; |
|
case AnimType.LocalRotate: |
|
LocalRotate(); |
|
break; |
|
case AnimType.Rotate: |
|
Rotate(); |
|
break; |
|
case AnimType.Color: |
|
UpdateColor(); |
|
break; |
|
case AnimType.Alpha: |
|
UpdateAlpha(); |
|
break; |
|
case AnimType.Custom_Vector3: |
|
CustomMethodVector3(); |
|
break; |
|
case AnimType.Custom_Vector2: |
|
CustomMethodVector2(); |
|
break; |
|
case AnimType.Custom_Float: |
|
CustomMethodFloat(); |
|
break; |
|
case AnimType.Blink: |
|
Blink(); |
|
break; |
|
} |
|
} |
|
catch (Exception e) |
|
{ |
|
Debug.LogError("TweenUtil Error Exception: " + e.ToString()); |
|
} |
|
} |
|
|
|
//动画播放完毕执行回调 |
|
public void executeCallBack() |
|
{ |
|
try |
|
{ |
|
if (animCallBack != null) |
|
{ |
|
animCallBack(animParameter); |
|
} |
|
} |
|
catch (Exception e) |
|
{ |
|
Debug.LogError(e.ToString()); |
|
} |
|
} |
|
|
|
public void Pause() |
|
{ |
|
isPause = true; |
|
} |
|
|
|
public void Play() |
|
{ |
|
isPause = false; |
|
} |
|
|
|
public void Restart() |
|
{ |
|
isPause = false; |
|
isDone = false; |
|
currentTime = 0; |
|
ResetPathInfo(); |
|
} |
|
|
|
public void Reverse() |
|
{ |
|
currentTime = totalTime - currentTime; |
|
PingpangExchange(); |
|
isDone = false; |
|
} |
|
|
|
/// <summary> |
|
/// 是否继续循环播放动画 |
|
/// false 将回收脚本 |
|
/// </summary> |
|
/// <returns></returns> |
|
public bool AnimReplayLogic() |
|
{ |
|
switch (loopType) |
|
{ |
|
case LoopType.Once: |
|
ResetPathInfo(); |
|
return !isRecyclable; // 回收脚本与否 |
|
case LoopType.Loop: |
|
Restart(); |
|
break; |
|
case LoopType.PingPang: |
|
currentTime = 0; |
|
isDone = false; |
|
PingpangExchange(); |
|
break; |
|
} |
|
if (loopCount == -1) |
|
{ |
|
return true; |
|
} |
|
else |
|
{ |
|
loopCount--; |
|
if (loopCount > 0) return true; |
|
return !isRecyclable; |
|
} |
|
} |
|
|
|
private void PingpangExchange() |
|
{ |
|
ExchangeV2(); |
|
ExchangeColor(); |
|
ExchangeAlpha(); |
|
ExchangePos(); |
|
ResetPathInfo(true); |
|
} |
|
|
|
#region 循环逻辑 |
|
|
|
public void ResetPathInfo(bool isExchange = false) |
|
{ |
|
if (pathType == PathType.Line) |
|
{ |
|
return; |
|
} |
|
currentStep = 0; |
|
if (isExchange) |
|
{ |
|
Array.Reverse(pathPoints); |
|
InitPathWeight(); |
|
return; |
|
} |
|
if (pathWeith.Length > 1) |
|
{ |
|
// 重置已插值量 |
|
pathWeith[pathWeith.Length - 1] = 0; |
|
} |
|
} |
|
|
|
public void ExchangeV2() |
|
{ |
|
Vector2 Vtmp = fromV2; |
|
fromV2 = toV2; |
|
toV2 = Vtmp; |
|
} |
|
|
|
public void ExchangePos() |
|
{ |
|
Vector3 Vtmp = fromV3; |
|
fromV3 = toV3; |
|
toV3 = Vtmp; |
|
} |
|
|
|
public void ExchangeColor() |
|
{ |
|
if (animType == AnimType.Color || animType == AnimType.UGUI_Color) |
|
{ |
|
// Debug.Log("exchangge"); |
|
Color colorTemp = fromColor; |
|
fromColor = toColor; |
|
toColor = colorTemp; |
|
} |
|
} |
|
|
|
public void ExchangeAlpha() |
|
{ |
|
float alphaTmp = fromFloat; |
|
fromFloat = toFloat; |
|
toFloat = alphaTmp; |
|
} |
|
|
|
#endregion |
|
|
|
#endregion |
|
|
|
#region 初始化/公共 |
|
|
|
public void Init() |
|
{ |
|
switch (animType) |
|
{ |
|
case AnimType.UGUI_Color: |
|
UguiColorInit(isChild); |
|
break; |
|
case AnimType.UGUI_Alpha: |
|
UguiAlphaInit(isChild); |
|
break; |
|
case AnimType.UGUI_AnchoredPosition: |
|
case AnimType.UGUI_AnchoredRotate: |
|
case AnimType.UGUI_AnchoredLocalRotate: |
|
case AnimType.UGUI_AnchoredScale: |
|
UguiAnchoredInit(); |
|
break; |
|
case AnimType.UGUI_Size: |
|
UguiAnchoredInit(); |
|
break; |
|
case AnimType.Color: |
|
ColorInit(isChild); |
|
break; |
|
case AnimType.Alpha: |
|
AlphaInit(isChild); |
|
break; |
|
case AnimType.Position: |
|
TransfromInit(); |
|
break; |
|
case AnimType.LocalPosition: |
|
TransfromInit(); |
|
break; |
|
case AnimType.LocalScale: |
|
TransfromInit(); |
|
break; |
|
case AnimType.LocalRotate: |
|
TransfromInit(); |
|
break; |
|
case AnimType.Rotate: |
|
TransfromInit(); |
|
break; |
|
} |
|
InitPathWeight(); |
|
} |
|
|
|
private void InitPathWeight() |
|
{ |
|
currentStep = 0; |
|
if (pathType == PathType.PathLinear) |
|
{ |
|
float part = 20; |
|
pathWeith = new float[pathPoints.Length]; |
|
float sum = 0; |
|
Vector3 oldVector3 = Vector3.zero, nowVector3 = Vector3.zero; |
|
for (int i = 0; i < pathPoints.Length - 1; i++) |
|
{ |
|
pathWeith[i] = 0; //此时保存长度 |
|
oldVector3 = TweenMath.CatmullRomPoint(pathPoints[LimitRangeInt(i - 1, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(i, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(i + 1, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(i + 2, pathPoints.Length - 1)], 0); |
|
for (int j = 1; j <= part; j++) |
|
{ |
|
nowVector3 = TweenMath.CatmullRomPoint(pathPoints[LimitRangeInt(i - 1, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(i, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(i + 1, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(i + 2, pathPoints.Length - 1)], j / part); |
|
pathWeith[i] += Vector3.Distance(oldVector3, nowVector3); |
|
oldVector3 = nowVector3; |
|
} |
|
sum += pathWeith[i]; |
|
} |
|
for (int i = 0; i < pathWeith.Length - 1; i++) |
|
{ |
|
pathWeith[i] = pathWeith[i] / sum; // 插值百分比 |
|
} |
|
pathWeith[pathWeith.Length - 1] = 0; //保存已插值完成的百分比 |
|
} |
|
if (pathType == PathType.PathBreak) |
|
{ |
|
// 根据距离分配时间 |
|
pathWeith = new float[pathPoints.Length]; |
|
float sum = 0; |
|
for (int i = 0; i < pathPoints.Length - 1; i++) |
|
{ |
|
pathWeith[i] = Vector3.Distance(pathPoints[i], pathPoints[i + 1]); |
|
sum += pathWeith[i]; |
|
} |
|
for (int i = 0; i < pathWeith.Length - 1; i++) |
|
{ |
|
pathWeith[i] = pathWeith[i] / sum; // 插值百分比 |
|
} |
|
pathWeith[pathWeith.Length - 1] = 0; //已插值完成的百分比 |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 当脚本初始化时 |
|
/// </summary> |
|
public void OnInit() |
|
{ |
|
} |
|
|
|
public void OnPop() |
|
{ |
|
} |
|
|
|
/// <summary> |
|
/// 回收脚本时 |
|
/// 初始化 |
|
/// </summary> |
|
public void OnPush() |
|
{ |
|
loopType = LoopType.Once; |
|
easeType = Ease.Linear; |
|
isPause = false; |
|
isIgnoreTimeScale = false; |
|
delayTime = 0; |
|
isDone = false; |
|
currentTime = 0; |
|
totalTime = 0; |
|
loopCount = -1; |
|
pathType = PathType.Line; |
|
pathPoints = null; |
|
currentStep = 0; |
|
// m_floatContral = null; |
|
//toTransform = null; |
|
} |
|
|
|
#endregion |
|
|
|
#region CustomMethod |
|
|
|
public void CustomMethodFloat() |
|
{ |
|
if (customMethodFloat != null) |
|
customMethodFloat(GetInterpValue(fromFloat, toFloat)); |
|
} |
|
|
|
public void CustomMethodVector2() |
|
{ |
|
if (customMethodV2 != null) |
|
customMethodV2(GetInterpV3(fromV2, toV2)); |
|
} |
|
|
|
public void CustomMethodVector3() |
|
{ |
|
if (customMethodV3 != null) |
|
customMethodV3(GetInterpV3(fromV3, toV3)); |
|
} |
|
|
|
#endregion |
|
|
|
#region UGUI |
|
|
|
#region UGUI_Color |
|
|
|
List<Image> m_animObjectList_Image = new List<Image>(); |
|
List<Text> m_animObjectList_Text = new List<Text>(); |
|
|
|
#region ALpha |
|
|
|
public void UguiAlphaInit(bool isChild) |
|
{ |
|
// Debug.Log(animGameObject.name); |
|
m_animObjectList_Image.Clear(); |
|
m_animObjectList_Text.Clear(); |
|
m_oldColor.Clear(); |
|
if (isChild) |
|
{ |
|
Image[] images = animGameObject.GetComponentsInChildren<Image>(); |
|
for (int i = 0; i < images.Length; i++) |
|
{ |
|
if (images[i].transform.GetComponent<Mask>() == null) |
|
{ |
|
m_animObjectList_Image.Add(images[i]); |
|
m_oldColor.Add(images[i].color); |
|
} |
|
} |
|
Text[] texts = animGameObject.GetComponentsInChildren<Text>(); |
|
for (int i = 0; i < texts.Length; i++) |
|
{ |
|
m_animObjectList_Text.Add(texts[i]); |
|
m_oldColor.Add(texts[i].color); |
|
} |
|
} |
|
else |
|
{ |
|
Image image = animGameObject.GetComponent<Image>(); |
|
Text text = animGameObject.GetComponent<Text>(); |
|
if (image != null) |
|
{ |
|
m_animObjectList_Image.Add(image); |
|
m_oldColor.Add(image.color); |
|
} |
|
if (text != null) |
|
{ |
|
m_animObjectList_Text.Add(text); |
|
m_oldColor.Add(text.color); |
|
} |
|
} |
|
SetUGUIAlpha(fromFloat); |
|
} |
|
|
|
void UguiAlpha() |
|
{ |
|
SetUGUIAlpha(GetInterpValue(fromFloat, toFloat)); |
|
} |
|
|
|
Color colTmp = new Color(); |
|
|
|
private void SetUGUIAlpha(float a) |
|
{ |
|
Color newColor = colTmp; |
|
int index = 0; |
|
// Debug.Log("Count:" + m_animObjectList_Text.Count); |
|
for (int i = 0; i < m_animObjectList_Image.Count; i++) |
|
{ |
|
newColor = m_oldColor[index]; |
|
newColor.a = a; |
|
m_animObjectList_Image[i].color = newColor; |
|
index++; |
|
} |
|
for (int i = 0; i < m_animObjectList_Text.Count; i++) |
|
{ |
|
newColor = m_oldColor[index]; |
|
newColor.a = a; |
|
m_animObjectList_Text[i].color = newColor; |
|
index++; |
|
} |
|
} |
|
|
|
#endregion |
|
|
|
#region Color |
|
|
|
void UguiColor() |
|
{ |
|
SetUGUIColor(GetInterpolationColor(fromColor, toColor)); |
|
} |
|
|
|
public void UguiColorInit(bool isChild) |
|
{ |
|
m_animObjectList_Image.Clear(); |
|
m_animObjectList_Text.Clear(); |
|
if (isChild) |
|
{ |
|
Image[] images = animGameObject.GetComponentsInChildren<Image>(); |
|
for (int i = 0; i < images.Length; i++) |
|
{ |
|
if (images[i].transform.GetComponent<Mask>() == null) |
|
{ |
|
m_animObjectList_Image.Add(images[i]); |
|
} |
|
else |
|
{ |
|
//Debug.LogError("name:" + images[i].gameObject.name); |
|
} |
|
} |
|
Text[] texts = animGameObject.GetComponentsInChildren<Text>(); |
|
for (int i = 0; i < texts.Length; i++) |
|
{ |
|
m_animObjectList_Text.Add(texts[i]); |
|
} |
|
} |
|
else |
|
{ |
|
Image image = animGameObject.GetComponent<Image>(); |
|
Text text = animGameObject.GetComponent<Text>(); |
|
if (image != null) |
|
{ |
|
m_animObjectList_Image.Add(image); |
|
} |
|
if (text != null) |
|
{ |
|
m_animObjectList_Text.Add(text); |
|
} |
|
} |
|
SetUGUIColor(fromColor); |
|
} |
|
|
|
void SetUGUIColor(Color color) |
|
{ |
|
for (int i = 0; i < m_animObjectList_Image.Count; i++) |
|
{ |
|
m_animObjectList_Image[i].color = color; |
|
} |
|
for (int i = 0; i < m_animObjectList_Text.Count; i++) |
|
{ |
|
m_animObjectList_Text[i].color = color; |
|
} |
|
} |
|
|
|
#endregion |
|
|
|
#endregion |
|
|
|
#region UGUI_SizeDelta |
|
|
|
void SizeDelta() |
|
{ |
|
if (m_rectRransform == null) |
|
{ |
|
Debug.LogError(m_transform.name + "缺少RectTransform组件,不能进行sizeDelta变换!!"); |
|
return; |
|
} |
|
m_rectRransform.sizeDelta = GetInterpV3(fromV2, toV2); |
|
} |
|
|
|
#endregion |
|
|
|
#region UGUI_Position |
|
|
|
public void UguiAnchoredInit() |
|
{ |
|
m_rectRransform = animGameObject.GetComponent<RectTransform>(); |
|
} |
|
|
|
void UguiPosition() |
|
{ |
|
m_rectRransform.anchoredPosition3D = GetInterpV3(fromV3, toV3); |
|
} |
|
|
|
void UguiRotate() |
|
{ |
|
m_rectRransform.eulerAngles = GetInterpV3(fromV3, toV3); |
|
} |
|
|
|
void UguiLocalRotate() |
|
{ |
|
m_rectRransform.localEulerAngles = GetInterpV3(fromV3, toV3); |
|
} |
|
|
|
void UguiScale() |
|
{ |
|
m_rectRransform.localScale = GetInterpV3(fromV3, toV3); |
|
} |
|
|
|
#endregion |
|
|
|
#endregion |
|
|
|
#region Transfrom |
|
|
|
public void TransfromInit() |
|
{ |
|
m_transform = animGameObject.transform; |
|
} |
|
|
|
void Position() |
|
{ |
|
if (toTransform != null) |
|
{ |
|
m_transform.position = GetInterpV3(fromV3, toTransform.position); |
|
} |
|
else |
|
{ |
|
m_transform.position = GetInterpV3(fromV3, toV3); |
|
} |
|
} |
|
|
|
void LocalPosition() |
|
{ |
|
m_transform.localPosition = GetInterpV3(fromV3, toV3); |
|
} |
|
|
|
void LocalRotate() |
|
{ |
|
m_transform.localEulerAngles = GetInterpV3(fromV3, toV3); |
|
} |
|
|
|
void Rotate() |
|
{ |
|
m_transform.eulerAngles = GetInterpV3(fromV3, toV3); |
|
} |
|
|
|
void LocalScale() |
|
{ |
|
m_transform.localScale = GetInterpV3(fromV3, toV3); |
|
} |
|
|
|
#endregion |
|
|
|
#region Color |
|
|
|
List<SpriteRenderer> m_animObjectList_Sprite = new List<SpriteRenderer>(); |
|
|
|
#region ALPHA |
|
|
|
public void AlphaInit(bool isChild) |
|
{ |
|
m_animObjectList_Sprite.Clear(); |
|
m_oldColor.Clear(); |
|
if (isChild) |
|
{ |
|
SpriteRenderer[] images = animGameObject.GetComponentsInChildren<SpriteRenderer>(); |
|
for (int i = 0; i < images.Length; i++) |
|
{ |
|
m_animObjectList_Sprite.Add(images[i]); |
|
m_oldColor.Add(images[i].color); |
|
} |
|
} |
|
else |
|
{ |
|
SpriteRenderer image = animGameObject.GetComponent<SpriteRenderer>(); |
|
if (image != null) |
|
{ |
|
m_animObjectList_Sprite.Add(image); |
|
m_oldColor.Add(image.color); |
|
} |
|
} |
|
SetAlpha(fromFloat); |
|
} |
|
|
|
void UpdateAlpha() |
|
{ |
|
SetAlpha(GetInterpValue(fromFloat, toFloat)); |
|
} |
|
|
|
private void SetAlpha(float a) |
|
{ |
|
Color newColor = new Color(); |
|
int index = 0; |
|
for (int i = 0; i < m_animObjectList_Sprite.Count; i++) |
|
{ |
|
newColor = m_oldColor[index]; |
|
newColor.a = a; |
|
Debug.Log(a); |
|
m_animObjectList_Sprite[i].color = newColor; |
|
index++; |
|
} |
|
} |
|
|
|
#endregion |
|
|
|
#region Color |
|
|
|
public void ColorInit(bool isChild) |
|
{ |
|
m_animObjectList_Sprite.Clear(); |
|
m_oldColor.Clear(); |
|
if (isChild) |
|
{ |
|
SpriteRenderer[] images = animGameObject.GetComponentsInChildren<SpriteRenderer>(); |
|
for (int i = 0; i < images.Length; i++) |
|
{ |
|
m_animObjectList_Sprite.Add(images[i]); |
|
} |
|
} |
|
else |
|
{ |
|
SpriteRenderer image = animGameObject.GetComponent<SpriteRenderer>(); |
|
if (image != null) |
|
{ |
|
m_animObjectList_Sprite.Add(image); |
|
} |
|
} |
|
SetColor(fromColor); |
|
} |
|
|
|
void UpdateColor() |
|
{ |
|
SetColor(GetInterpolationColor(fromColor, toColor)); |
|
} |
|
|
|
Color GetInterpolationColor(Color oldValue, Color aimValue) |
|
{ |
|
Color result = new Color(GetInterpValue(oldValue.r, aimValue.r), |
|
GetInterpValue(oldValue.g, aimValue.g), |
|
GetInterpValue(oldValue.b, aimValue.b), |
|
GetInterpValue(oldValue.a, aimValue.a)); |
|
return result; |
|
} |
|
|
|
private void SetColor(Color color) |
|
{ |
|
for (int i = 0; i < m_animObjectList_Sprite.Count; i++) |
|
{ |
|
m_animObjectList_Sprite[i].color = color; |
|
} |
|
} |
|
|
|
#endregion |
|
|
|
#endregion |
|
|
|
#region 闪烁 |
|
|
|
void Blink() |
|
{ |
|
if (blinkCurrentTime < 0) |
|
{ |
|
blinkCurrentTime = blinkTime; |
|
animGameObject.SetActive(!animGameObject.activeSelf); |
|
} |
|
else |
|
{ |
|
blinkCurrentTime -= Time.deltaTime; |
|
} |
|
} |
|
|
|
#endregion |
|
|
|
#region 线性插值入口 |
|
|
|
float GetInterpValue(float oldValue, float aimValue) |
|
{ |
|
return GetInterp(oldValue, aimValue, currentTime, totalTime); |
|
} |
|
/// <summary> |
|
/// 曲线 缓动 插值时间 |
|
/// </summary> |
|
/// <returns></returns> |
|
float GetInterpTimePercentage() |
|
{ |
|
return GetInterp(0, 1, currentTime / totalTime, 1); |
|
} |
|
|
|
/// <summary> |
|
/// 插值入口 |
|
/// </summary> |
|
/// <returns></returns> |
|
float GetInterp(float fromValue, float aimValue, float current, float total) |
|
{ |
|
switch (easeType) |
|
{ |
|
// 线性 |
|
case Ease.Linear: |
|
return Mathf.Lerp(fromValue, aimValue, current / total); |
|
case Ease.InBack: |
|
return TweenMath.InBack(fromValue, aimValue, current, total); |
|
case Ease.OutBack: |
|
return TweenMath.OutBack(fromValue, aimValue, current, total); |
|
case Ease.InOutBack: |
|
return TweenMath.InOutBack(fromValue, aimValue, current, total); |
|
case Ease.OutInBack: |
|
return TweenMath.OutInBack(fromValue, aimValue, current, total); |
|
case Ease.InQuad: |
|
return TweenMath.InQuad(fromValue, aimValue, current, total); |
|
case Ease.OutQuad: |
|
return TweenMath.OutQuad(fromValue, aimValue, current, total); |
|
case Ease.InoutQuad: |
|
return TweenMath.InoutQuad(fromValue, aimValue, current, total); |
|
case Ease.InCubic: |
|
return TweenMath.InCubic(fromValue, aimValue, current, total); |
|
case Ease.OutCubic: |
|
return TweenMath.OutCubic(fromValue, aimValue, current, total); |
|
case Ease.InoutCubic: |
|
return TweenMath.InoutCubic(fromValue, aimValue, current, total); |
|
case Ease.InQuart: |
|
return TweenMath.InQuart(fromValue, aimValue, current, total); |
|
case Ease.OutQuart: |
|
return TweenMath.OutQuart(fromValue, aimValue, current, total); |
|
case Ease.InOutQuart: |
|
return TweenMath.InOutQuart(fromValue, aimValue, current, total); |
|
case Ease.OutInQuart: |
|
return TweenMath.OutInQuart(fromValue, aimValue, current, total); |
|
case Ease.InQuint: |
|
return TweenMath.InQuint(fromValue, aimValue, current, total); |
|
case Ease.OutQuint: |
|
return TweenMath.OutQuint(fromValue, aimValue, current, total); |
|
case Ease.InOutQuint: |
|
return TweenMath.InOutQuint(fromValue, aimValue, current, total); |
|
case Ease.OutInQuint: |
|
return TweenMath.OutInQuint(fromValue, aimValue, current, total); |
|
case Ease.InSine: |
|
return TweenMath.InSine(fromValue, aimValue, current, total); |
|
case Ease.OutSine: |
|
return TweenMath.OutSine(fromValue, aimValue, current, total); |
|
case Ease.InOutSine: |
|
return TweenMath.InOutSine(fromValue, aimValue, current, total); |
|
case Ease.OutInSine: |
|
return TweenMath.OutInSine(fromValue, aimValue, current, total); |
|
case Ease.InExpo: |
|
return TweenMath.InExpo(fromValue, aimValue, current, total); |
|
case Ease.OutExpo: |
|
return TweenMath.OutExpo(fromValue, aimValue, current, total); |
|
case Ease.InOutExpo: |
|
return TweenMath.InOutExpo(fromValue, aimValue, current, total); |
|
case Ease.OutInExpo: |
|
return TweenMath.OutInExpo(fromValue, aimValue, current, total); |
|
case Ease.InBounce: |
|
return TweenMath.InBounce(fromValue, aimValue, current, total); |
|
case Ease.OutBounce: |
|
return TweenMath.OutBounce(fromValue, aimValue, current, total); |
|
case Ease.InOutBounce: |
|
return TweenMath.InOutBounce(fromValue, aimValue, current, total); |
|
case Ease.OutInBounce: |
|
return TweenMath.OutInBounce(fromValue, aimValue, current, total); |
|
// animationcurve |
|
case Ease.Default: |
|
return curve.Evaluate(current / total) * (aimValue - fromValue) + fromValue; |
|
} |
|
return 0; |
|
} |
|
|
|
Vector3 GetInterpV3(Vector3 oldValue, Vector3 aimValue) |
|
{ |
|
Vector3 result = Vector3.zero; |
|
if (pathType == PathType.Line) |
|
{ |
|
result = new Vector3( |
|
GetInterpValue(oldValue.x, aimValue.x), |
|
GetInterpValue(oldValue.y, aimValue.y), |
|
GetInterpValue(oldValue.z, aimValue.z) |
|
); |
|
} |
|
else |
|
{ |
|
// 曲线运动插值 percentage 插值进度 |
|
currentPercentage = GetInterpTimePercentage(); |
|
// Debug.Log(currentPercentage); |
|
result = GetInterpPathV3(); |
|
} |
|
return result; |
|
} |
|
|
|
private Vector3 GetInterpPathV3() |
|
{ |
|
float t = currentPercentage - pathWeith[pathWeith.Length - 1]; |
|
if (t >= pathWeith[currentStep]) |
|
{ |
|
pathWeith[pathWeith.Length - 1] += pathWeith[currentStep]; |
|
t -= pathWeith[currentStep]; |
|
++currentStep; |
|
} |
|
t /= pathWeith[currentStep]; |
|
switch (pathType) |
|
{ |
|
case PathType.PathBreak: |
|
return Vector3.Lerp(pathPoints[LimitRangeInt(currentStep, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(currentStep + 1, pathPoints.Length - 1)], t); // 线性插值 |
|
case PathType.PathLinear: |
|
return TweenMath.CatmullRomPoint(pathPoints[LimitRangeInt(currentStep - 1, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(currentStep, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(currentStep + 1, pathPoints.Length - 1)], |
|
pathPoints[LimitRangeInt(currentStep + 2, pathPoints.Length - 1)], t); |
|
default: |
|
return Vector3.zero; |
|
} |
|
} |
|
|
|
// 防止越界 |
|
private int LimitRangeInt(int t, int max, int min = 0) |
|
{ |
|
if (t < 0 | max <= 0) |
|
{ |
|
return 0; |
|
} |
|
else if (t > max) |
|
{ |
|
return max; |
|
} |
|
else |
|
{ |
|
return t; |
|
} |
|
} |
|
|
|
#endregion |
|
} |
|
} |