动画曲线上的Evaluate
函数每次获取一个值
https://docs.unity3d.com/ScriptReference/AnimationCurve.Evaluate.html
但(我)不清楚使用的是什么时间基准或单位。
对于ParticleSystem.MinMaxCurve
,这被明确描述为曲线持续时间的归一化0到1范围的值:
https://docs.unity3d.com/ScriptReference/ParticleSystem.MinMaxCurve.Evaluate.html
归一化时间(在0 - 1的范围内,其中1代表100%)求曲线的值。这在以下情况下有效particlessystem . minmaxcurve .mode设置为ParticleSystemCurveMode。曲线或particlesystemcurvemode . twcurves .
更新:
对于考虑性能的用户:AnimationCurve的Evaluate在Unity的MonoBehaviour世界的传统意义上是非常快的,它有一个内置的方法来缓存周围键的查找,并保留最后评估的位置。在求值循环中尤其快,因为这个。高度老式优化,由Unity。
然而,ParticleSystem。MinMaxCurve的评估受益,是工作友好更新的一部分,unity引擎。ParticleSystemJobs特性。
在较小的使用中(大约1000个评估步骤或更少),它们大致相同。但是有了作业和大量细粒度的评估(超过10,000个),MinMaxCurve就领先了。
在大多数情况下使用0
到1
,但完全取决于您如何配置和使用您的…你可以很容易地在0
之前和1
之后用关键帧扩展AnimationCurve
。
你可以得到AnimationCurve
的持续时间基本上你可以将任何动画曲线归一化为时间0
和1
之间的值
public static class AniamtionCurveUtils
{
public static float EvaluateNormalizedTime(this AnimationCurve curve, float normalizedTime)
{
if(curve.length <= 0)
{
Debug.LogError("Given curve has 0 keyframes!");
return float.NaN;
}
// get the time of the first keyframe in the curve
var start = curve[0].time;
if(curve.length == 1)
{
Debug.LogWarning("Given curve has only 1 single keyframe!");
return start;
}
// get the time of the last keyframe in the curve
var end = curve[curve.length - 1].time;
// get the duration fo the curve
var duration = end - start;
// get the de-normalized time mapping the input 0 to 1 onto the actual time range
// between start and end
var actualTime = start + Mathf.Clamp(normalizedTime, 0, 1) * duration;
// finally use that calculated time to actually evaluate the curve
return curve.Evaluate(actualTime);
}
}
和
var someValue = someCurve.EvaluateNormalizedTime(someNormalizedTime);