统一曲线评估是归一化时间,还是什么单位?



动画曲线上的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就领先了。

在大多数情况下使用01,但完全取决于您如何配置和使用您的…你可以很容易地在0之前和1之后用关键帧扩展AnimationCurve

你可以得到AnimationCurve的持续时间基本上你可以将任何动画曲线归一化为时间01之间的值

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);

相关内容

  • 没有找到相关文章

最新更新