DCAnimatorV2/Runtime/Utils/EasingFunctions.cs

278 lines
No EOL
8.1 KiB
C#

using UnityEngine;
namespace DC.Animator.Utils
{
public static class Easing
{
public delegate float Function(float t);
public enum Type
{
Linear,
EaseInSine,
EaseOutSine,
EaseInOutSine,
EaseInQuad,
EaseOutQuad,
EaseInOutQuad,
EaseInCubic,
EaseOutCubic,
EaseInOutCubic,
EaseInQuart,
EaseOutQuart,
EaseInOutQuart,
EaseInQuint,
EaseOutQuint,
EaseInOutQuint,
EaseInExpo,
EaseOutExpo,
EaseInOutExpo,
EaseInCirc,
EaseOutCirc,
EaseInOutCirc,
EaseInBack,
EaseOutBack,
EaseInOutBack,
EaseInElastic,
EaseOutElastic,
EaseInOutElastic,
EaseInBounce,
EaseOutBounce,
EaseInOutBounce
}
private const float PI = Mathf.PI;
private const float C1 = 1.70158f;
private const float C2 = C1 * 1.525f;
private const float C3 = C1 + 1f;
private const float C4 = 2f * PI / 3f;
private const float C5 = 2f * PI / 4.5f;
public static Function GetEasingFunction(Type type)
{
return type switch
{
Type.Linear => Linear,
Type.EaseInSine => EaseInSine,
Type.EaseOutSine => EaseOutSine,
Type.EaseInOutSine => EaseInOutSine,
Type.EaseInQuad => EaseInQuad,
Type.EaseOutQuad => EaseOutQuad,
Type.EaseInOutQuad => EaseInOutQuad,
Type.EaseInCubic => EaseInCubic,
Type.EaseOutCubic => EaseOutCubic,
Type.EaseInOutCubic => EaseInOutCubic,
Type.EaseInQuart => EaseInQuart,
Type.EaseOutQuart => EaseOutQuart,
Type.EaseInOutQuart => EaseInOutQuart,
Type.EaseInQuint => EaseInQuint,
Type.EaseOutQuint => EaseOutQuint,
Type.EaseInOutQuint => EaseInOutQuint,
Type.EaseInExpo => EaseInExpo,
Type.EaseOutExpo => EaseOutExpo,
Type.EaseInOutExpo => EaseInOutExpo,
Type.EaseInCirc => EaseInCirc,
Type.EaseOutCirc => EaseOutCirc,
Type.EaseInOutCirc => EaseInOutCirc,
Type.EaseInBack => EaseInBack,
Type.EaseOutBack => EaseOutBack,
Type.EaseInOutBack => EaseInOutBack,
Type.EaseInElastic => EaseInElastic,
Type.EaseOutElastic => EaseOutElastic,
Type.EaseInOutElastic => EaseInOutElastic,
Type.EaseInBounce => EaseInBounce,
Type.EaseOutBounce => EaseOutBounce,
Type.EaseInOutBounce => EaseInOutBounce,
_ => Linear
};
}
public static float Linear(float t)
{
return t;
}
public static float EaseInSine(float t)
{
return 1f - Mathf.Cos(t * PI / 2f);
}
public static float EaseOutSine(float t)
{
return Mathf.Sin(t * PI / 2f);
}
public static float EaseInOutSine(float t)
{
return -(Mathf.Cos(PI * t) - 1f) / 2f;
}
public static float EaseInQuad(float t)
{
return t * t;
}
public static float EaseOutQuad(float t)
{
return 1f - (1f - t) * (1f - t);
}
public static float EaseInOutQuad(float t)
{
return t < 0.5f ? 2f * t * t : 1f - Mathf.Pow(-2f * t + 2f, 2f) / 2f;
}
public static float EaseInCubic(float t)
{
return t * t * t;
}
public static float EaseOutCubic(float t)
{
return 1f - Mathf.Pow(1f - t, 3f);
}
public static float EaseInOutCubic(float t)
{
return t < 0.5f ? 4f * t * t * t : 1f - Mathf.Pow(-2f * t + 2f, 3f) / 2f;
}
public static float EaseInQuart(float t)
{
return t * t * t * t;
}
public static float EaseOutQuart(float t)
{
return 1f - Mathf.Pow(1f - t, 4f);
}
public static float EaseInOutQuart(float t)
{
return t < 0.5f ? 8f * t * t * t * t : 1f - Mathf.Pow(-2f * t + 2f, 4f) / 2f;
}
public static float EaseInQuint(float t)
{
return t * t * t * t * t;
}
public static float EaseOutQuint(float t)
{
return 1f - Mathf.Pow(1f - t, 5f);
}
public static float EaseInOutQuint(float t)
{
return t < 0.5f ? 16f * t * t * t * t * t : 1f - Mathf.Pow(-2f * t + 2f, 5f) / 2f;
}
public static float EaseInExpo(float t)
{
return t == 0f ? 0f : Mathf.Pow(2f, 10f * t - 10f);
}
public static float EaseOutExpo(float t)
{
return t == 1f ? 1f : 1f - Mathf.Pow(2f, -10f * t);
}
public static float EaseInOutExpo(float t)
{
return t == 0f ? 0f :
t == 1f ? 1f :
t < 0.5f ? Mathf.Pow(2f, 20f * t - 10f) / 2f :
(2f - Mathf.Pow(2f, -20f * t + 10f)) / 2f;
}
public static float EaseInCirc(float t)
{
return 1f - Mathf.Sqrt(1f - Mathf.Pow(t, 2f));
}
public static float EaseOutCirc(float t)
{
return Mathf.Sqrt(1f - Mathf.Pow(t - 1f, 2f));
}
public static float EaseInOutCirc(float t)
{
return t < 0.5f
? (1f - Mathf.Sqrt(1f - Mathf.Pow(2f * t, 2f))) / 2f
: (Mathf.Sqrt(1f - Mathf.Pow(-2f * t + 2f, 2f)) + 1f) / 2f;
}
public static float EaseInBack(float t)
{
return C3 * t * t * t - C1 * t * t;
}
public static float EaseOutBack(float t)
{
return 1f + C3 * Mathf.Pow(t - 1f, 3f) + C1 * Mathf.Pow(t - 1f, 2f);
}
public static float EaseInOutBack(float t)
{
return t < 0.5f
? Mathf.Pow(2f * t, 2f) * ((C2 + 1f) * 2f * t - C2) / 2f
: (Mathf.Pow(2f * t - 2f, 2f) * ((C2 + 1f) * (t * 2f - 2f) + C2) + 2f) / 2f;
}
public static float EaseInElastic(float t)
{
return t switch
{
0f => 0f,
1f => 1f,
_ => -Mathf.Pow(2f, 10f * t - 10f) * Mathf.Sin((t * 10f - 10.75f) * C4)
};
}
public static float EaseOutElastic(float t)
{
return t switch
{
0f => 0f,
1f => 1f,
_ => Mathf.Pow(2f, -10f * t) * Mathf.Sin((t * 10f - 0.75f) * C4) + 1f
};
}
public static float EaseInOutElastic(float t)
{
return t == 0f ? 0f :
t == 1f ? 1f :
t < 0.5f ? -(Mathf.Pow(2f, 20f * t - 10f) * Mathf.Sin((20f * t - 11.125f) * C5)) / 2f :
Mathf.Pow(2f, -20f * t + 10f) * Mathf.Sin((20f * t - 11.125f) * C5) / 2f + 1f;
}
public static float EaseInBounce(float t)
{
return 1f - EaseOutBounce(1f - t);
}
public static float EaseOutBounce(float t)
{
switch (t)
{
case < 1f / 2.75f:
return 7.5625f * t * t;
case < 2f / 2.75f:
t -= 1.5f / 2.75f;
return 7.5625f * t * t + 0.75f;
case < 2.5f / 2.75f:
t -= 2.25f / 2.75f;
return 7.5625f * t * t + 0.9375f;
default:
t -= 2.625f / 2.75f;
return 7.5625f * t * t + 0.984375f;
}
}
public static float EaseInOutBounce(float t)
{
return t < 0.5f ? (1f - EaseOutBounce(1f - 2f * t)) / 2f : (1f + EaseOutBounce(2f * t - 1f)) / 2f;
}
}
}