Skip to content

Instantly share code, notes, and snippets.

@valryon

valryon/Interpolators.cs

Last active Oct 10, 2017
Embed
What would you like to do?
Interpolators coroutine for Unity!
// 2015 - Pixelnest STudio
// <summary>
/// Coroutine helpers for interpolateors
/// </summary>
public class Interpolators
{
public readonly static AnimationCurve LinearCurve;
public readonly static AnimationCurve EaseOutCurve;
public readonly static AnimationCurve EaseInCurve;
public readonly static AnimationCurve EaseInOutCurve;
static Interpolators()
{
// See: http://www.alsacreations.com/tuto/lire/876-transitions-css3-transition-timing-function.html
LinearCurve = AnimationCurve.Linear(0f, 0f, 1f, 1f);
EaseOutCurve = new AnimationCurve();
EaseOutCurve.AddKey(new Keyframe(0f, 0f)
{
inTangent = 2,
outTangent = 2,
tangentMode = 0
});
EaseOutCurve.AddKey(new Keyframe(1f, 1f)
{
inTangent = 0,
outTangent = 0,
tangentMode = 0
});
EaseInCurve = new AnimationCurve();
EaseInCurve.AddKey(new Keyframe(0f, 0f)
{
inTangent = 0,
outTangent = 0,
tangentMode = 0
});
EaseInCurve.AddKey(new Keyframe(1f, 1f)
{
inTangent = 2,
outTangent = 2,
tangentMode = 0
});
EaseInOutCurve = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f);
}
/// <summary>
/// Linear interpolation
/// </summary>
/// <remarks>Formula: min + (max - min) * t</remarks>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="duration"></param>
/// <param name="step"></param>
/// <param name="completed"></param>
/// <returns></returns>
public static IEnumerator Linear(float from, float to, float duration, Action<float> step, Action completed)
{
return InterpolateFloat(false, LinearCurve, from, to, duration,step, completed);
}
/// <summary>
/// Linear interpolation independant from Time.timeScale
/// </summary>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="duration"></param>
/// <param name="step"></param>
/// <param name="completed"></param>
/// <returns></returns>
public static IEnumerator LinearRealtime(float from, float to, float duration, System.Action<float> step, System.Action completed)
{
return InterpolateFloat(true, LinearCurve, from, to, duration, step, completed);
}
/// <summary>
/// Linear interpolation
/// </summary>
/// <remarks>Formula: min + (max - min) * t</remarks>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="duration"></param>
/// <param name="step"></param>
/// <param name="completed"></param>
/// <returns></returns>
public static IEnumerator Linear(Vector3 from, Vector3 to, float duration, Action<Vector3> step, Action completed)
{
return InterpolateVector(false, LinearCurve, from, to, duration, step, completed);
}
/// <summary>
/// Interpolation with curves
/// </summary>
/// <param name="curve"></param>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="duration"></param>
/// <param name="step"></param>
/// <param name="completed"></param>
/// <returns></returns>
public static IEnumerator Curve(AnimationCurve curve, float from, float to, float duration, System.Action<float> step, System.Action completed)
{
return InterpolateFloat(false, curve, from, to, duration, step, completed);
}
/// <summary>
/// Interpolation with curves
/// </summary>
/// <param name="curve"></param>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="duration"></param>
/// <param name="step"></param>
/// <param name="completed"></param>
/// <returns></returns>
public static IEnumerator Curve(AnimationCurve curve, Vector3 from, Vector3 to, float duration, System.Action<Vector3> step, System.Action completed)
{
return InterpolateVector(false, curve, from, to, duration, step, completed);
}
/// <summary>
/// Interpolation with curves independant from Time.timeScale
/// </summary>
/// <param name="curve"></param>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="duration"></param>
/// <param name="step"></param>
/// <param name="completed"></param>
/// <returns></returns>
public static IEnumerator CurveRealtime(AnimationCurve curve, Vector3 from, Vector3 to, float duration, System.Action<Vector3> step, System.Action completed)
{
return InterpolateVector(true, curve, from, to, duration, step, completed);
}
/// <summary>
/// Interpolation with curves independant from Time.timeScale
/// </summary>
/// <param name="curve"></param>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="duration"></param>
/// <param name="step"></param>
/// <param name="completed"></param>
/// <returns></returns>
public static IEnumerator CurveRealtime(AnimationCurve curve, float from, float to, float duration, System.Action<float> step, System.Action completed)
{
return InterpolateFloat(true, curve, from, to, duration, step, completed);
}
/// <summary>
/// Interpolator implementation
/// </summary>
/// <param name="realtime"></param>
/// <param name="curve"></param>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="duration"></param>
/// <param name="step"></param>
/// <param name="completed"></param>
/// <returns></returns>
public static IEnumerator InterpolateFloat(bool realtime, AnimationCurve curve, float from, float to, float duration, System.Action<float> step, System.Action completed)
{
float t = 0;
float lastTime = Time.realtimeSinceStartup;
while (t < 1)
{
yield return null;
float timeDela = Time.deltaTime;
if (realtime)
{
timeDela = (Time.realtimeSinceStartup - lastTime);
}
t += (timeDela / duration);
float stepValue = Mathf.Lerp(from, to, curve.Evaluate(t));
if (step != null)
{
step(stepValue);
}
lastTime = Time.realtimeSinceStartup;
}
if (completed != null)
{
completed();
}
}
/// <summary>
/// Interpolator implementation
/// </summary>
/// <param name="realtime"></param>
/// <param name="curve"></param>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="duration"></param>
/// <param name="step"></param>
/// <param name="completed"></param>
/// <returns></returns>
public static IEnumerator InterpolateVector(bool realtime, AnimationCurve curve, Vector3 from, Vector3 to, float duration, System.Action<Vector3> step, System.Action completed)
{
float t = 0;
float lastTime = Time.realtimeSinceStartup;
while (t < 1)
{
yield return null;
float timeDela = Time.deltaTime;
if (realtime)
{
timeDela = (Time.realtimeSinceStartup - lastTime);
}
t += (timeDela / duration);
Vector3 stepValue = Vector3.Lerp(from, to, curve.Evaluate(t));
if (step != null)
{
step(stepValue);
}
lastTime = Time.realtimeSinceStartup;
}
if (completed != null)
{
completed();
}
}
}
Vector3 start = this.transform.position;
Vector3 end = start + new Vector3(5,0);
float duration = 3f;
StartCoroutine(Interpolators.Curve(Interpolators.EaseInOutCurve, 0f, 1f, duration,
(step) => {
this.transform.position = Vector3.Lerp(start, end, step);
},
()=> {
Debug.Log("Finished :)");
}
));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment