278 lines
No EOL
8.1 KiB
C#
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;
|
|
}
|
|
}
|
|
} |