赞
踩
前篇:Unity,C#版的动画曲线,Tween:EaseIn,EaseOut,EaseInOut(编程语言翻译版本)
https://blog.csdn.net/qq_37776196/article/details/114667670
效果预览:http://robertpenner.com/easing/easing_demo.html
整理了语法和逻辑,拆分了会让人难以理解的连写代码。
我是很讨厌连写代码的, 大量的三元运算和一行代码中多个赋值操作。
下面再附送一段测试代码
public class Tween { public static float GetTime(float time, float nDuration) { return time > nDuration ? nDuration : time; } public static float Linear(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); return nChange * time / nDuration + nBegin; } public class Quad { public static float easeIn(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration; return nChange * time * time + nBegin; } public static float easeOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration; return -nChange * time * (time - 2) + nBegin; } public static float easeInOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / (nDuration / 2); if (time < 1) { return nChange / 2 * time * time + nBegin; } time--; return -nChange / 2 * (time * (time - 2) - 1) + nBegin; } } public class Cubic { public static float easeIn(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration; return nChange * time * time * time + nBegin; } public static float easeOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration - 1; return nChange * (time * time * time + 1) + nBegin; } public static float easeInOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / (nDuration / 2); if (time < 1) { return nChange / 2 * time * time * time + nBegin; } time -= 2; return nChange / 2 * (time * time * time + 2) + nBegin; } } public class Quart { public static float easeIn(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration; return nChange * time * time * time * time + nBegin; } public static float easeOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration - 1; return -nChange * (time * time * time * time - 1) + nBegin; } public static float easeInOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / (nDuration / 2); if (time < 1) { return nChange / 2 * time * time * time * time + nBegin; } time -= 2; return -nChange / 2 * (time * time * time * time - 2) + nBegin; } } public class Quint { public static float easeIn(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration; return nChange * time * time * time * time * time + nBegin; } public static float easeOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration - 1; return nChange * (time * time * time * time * time + 1) + nBegin; } public static float easeInOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / (nDuration / 2); if (time < 1) { return nChange / 2 * time * time * time * time * time + nBegin; } time -= 2; return nChange / 2 * (time * time * time * time * time + 2) + nBegin; } } public class Sine { public static float easeIn(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); return -nChange * Mathf.Cos(time / nDuration * (Mathf.PI / 2)) + nChange + nBegin; } public static float easeOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); return nChange * Mathf.Sin(time / nDuration * (Mathf.PI / 2)) + nBegin; } public static float easeInOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); return -nChange / 2 * (Mathf.Cos(Mathf.PI * time / nDuration) - 1) + nBegin; } } public class Expo { public static float easeIn(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); if (time == 0) { return nBegin; } else { return nChange * Mathf.Pow(2, 10 * (time / nDuration - 1)) + nBegin; } } public static float easeOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); if (time == nDuration) { return nBegin + nChange; } else { return nChange * (-Mathf.Pow(2, -10 * time / nDuration) + 1) + nBegin; } } public static float easeInOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); if (time == 0) { return nBegin; } if (time == nDuration) { return nBegin + nChange; } time = time /(nDuration / 2); if (time < 1) { return nChange / 2 * Mathf.Pow(2, 10 * (time - 1)) + nBegin; } time--; return nChange / 2 * (-Mathf.Pow(2, -10 * time) + 2) + nBegin; } } public class Circ { public static float easeIn(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration; return -nChange * (Mathf.Sqrt(1 - time * time) - 1) + nBegin; } public static float easeOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration - 1; return nChange * Mathf.Sqrt(1 - time * time) + nBegin; } public static float easeInOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / (nDuration / 2); if (time < 1) { return -nChange / 2 * (Mathf.Sqrt(1 - time * time) - 1) + nBegin; } time -= 2; return nChange / 2 * (Mathf.Sqrt(1 - time * time) + 1) + nBegin; } } public class Elastic { public static float easeIn(float time, float nBegin, float nChange, float nDuration, float a = 0, float p = 0) { time = GetTime(time, nDuration); if (time == 0) { return nBegin; } time = time / nDuration; if (time == 1) { return nBegin + nChange; } if (p == 0) { p = nDuration * 0.3f; } float s; if (a == 0 || a < Mathf.Abs(nChange)) { a = nChange; s = p / 4; } else { s = p / (2 * Mathf.PI) * Mathf.Asin(nChange / a); } time -= 1; return -(a * Mathf.Pow(2, 10 * time) * Mathf.Sin((time * nDuration - s) * (2 * Mathf.PI) / p)) + nBegin; } public static float easeOut(float time, float nBegin, float nChange, float nDuration, float a = 0, float p = 0) { time = GetTime(time, nDuration); if (time == 0) { return nBegin; } time = time / nDuration; if (time == 1) { return nBegin + nChange; } if (p == 0) { p = nDuration * 0.3f; } float s; if (a == 0 || a < Mathf.Abs(nChange)) { a = nChange; s = p / 4; } else { s = p / (2 * Mathf.PI) * Mathf.Asin(nChange / a); } return (a * Mathf.Pow(2, -10 * time) * Mathf.Sin((time * nDuration - s) * (2 * Mathf.PI) / p) + nChange + nBegin); } public static float easeInOut(float time, float nBegin, float nChange, float nDuration, float a = 0, float p = 0) { time = GetTime(time, nDuration); if (time == 0) { return nBegin; } time = time / (nDuration / 2); if (time == 2) { return nBegin + nChange; } if (p == 0) { p = nDuration * (0.3f * 1.5f); } float s; if (a == 0 || a < Mathf.Abs(nChange)) { a = nChange; s = p / 4; } else { s = p / (2 * Mathf.PI) * Mathf.Asin(nChange / a); } if (time < 1) { time -= 1; return -0.5f * (a * Mathf.Pow(2, 10 * time) * Mathf.Sin((time * nDuration - s) * (2 * Mathf.PI) / p)) + nBegin; } time -= 1; return a * Mathf.Pow(2, -10 * time) * Mathf.Sin((time * nDuration - s) * (2 * Mathf.PI) / p) * 0.5f + nChange + nBegin; } } public class Back { public static float easeIn(float time, float nBegin, float nChange, float nDuration, float s = 0) { time = GetTime(time, nDuration); if (s == 0) { s = 1.70158f; } time = time / nDuration; return nChange * time * time * ((s + 1) * time - s) + nBegin; } public static float easeOut(float time, float nBegin, float nChange, float nDuration, float s = 0) { time = GetTime(time, nDuration); if (s == 0) { s = 1.70158f; } time = time / nDuration - 1; return nChange * (time * time * ((s + 1) * time + s) + 1) + nBegin; } public static float easeInOut(float time, float nBegin, float nChange, float nDuration, float s = 0) { time = GetTime(time, nDuration); if (s == 0) { s = 1.70158f; } time = time / (nDuration / 2); if (time < 1) { return nChange / 2 * (time * time * (((s *= 1.525f) + 1) * time - s)) + nBegin; } time -= 2; return nChange / 2 * (time * time * (((s *= 1.525f) + 1) * time + s) + 2) + nBegin; } } public class Bounce { public static float easeIn(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); return nChange - easeOut(nDuration - time, 0, nChange, nDuration) + nBegin; } public static float easeOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); time = time / nDuration; if (time < (1 / 2.75f)) { return nChange * (7.5625f * time * time) + nBegin; } else if (time < (2 / 2.75f)) { time -= 1.5f / 2.75f; return nChange * (7.5625f * time * time + 0.75f) + nBegin; } else if (time < (2.5f / 2.75f)) { time -= 2.25f / 2.75f; return nChange * (7.5625f * time * time + 0.9375f) + nBegin; } else { time -= 2.625f / 2.75f; return nChange * (7.5625f * time * time + 0.984375f) + nBegin; } } public static float easeInOut(float time, float nBegin, float nChange, float nDuration) { time = GetTime(time, nDuration); if (time < nDuration / 2) { return easeIn(time * 2, 0, nChange, nDuration) * 0.5f + nBegin; } else return easeOut(time * 2 - nDuration, 0, nChange, nDuration) * 0.5f + nChange * 0.5f + nBegin; } } }
测试代码:
public class NewBehaviourScript : MonoBehaviour { private bool m_isPlay = false; public Transform[] m_trans = null; private string[] m_strNames = new string[] { "Quad", "Cubic", "Quart", "Quint", "Sine", "Expo", "Circ", "Elastic", "Back", "Bounce" }; private void Start() { int nCount = m_strNames.Length * 3; int n3Count = 0; int nNameIndex = 0; m_trans = new Transform[nCount]; for (int i = 0; i < nCount; i++) { GameObject newObj = GameObject.CreatePrimitive(PrimitiveType.Sphere); if (n3Count >= 3) { n3Count = 0; nNameIndex++; } newObj.name = m_strNames[nNameIndex] + n3Count.ToString(); n3Count++; m_trans[i] = newObj.transform; m_trans[i].position = new Vector3(i, 0, 0); } } private float nTime = 0; private void Update() { if (Input.GetKeyDown(KeyCode.A)) { nTime = 0; m_isPlay = true; } if (m_isPlay) { if (nTime >= 2) { m_isPlay = false; } float nValue = 0; int nIndex = 0; nValue = Tween.Quad.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Quad.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Quad.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Cubic.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Cubic.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Cubic.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Quart.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Quart.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Quart.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Quint.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Quint.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Quint.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Sine.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Sine.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Sine.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Expo.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Expo.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Expo.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Circ.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Circ.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Circ.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Elastic.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Elastic.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Elastic.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Back.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Back.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Back.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Bounce.easeIn(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Bounce.easeOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nValue = Tween.Bounce.easeInOut(nTime, 0, 5, 1); m_trans[nIndex].position = new Vector3(nIndex, nValue, 0); nIndex++; nTime += Time.deltaTime; } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。