Unity Curve Evaluate 是归一化时间,还是什么单位?
Unity Curve Evaluate is normalised time, or what units?
动画曲线上的Evaluate
函数一次取一个值。
https://docs.unity3d.com/ScriptReference/AnimationCurve.Evaluate.html
但(我)不清楚使用的是什么时基或单位。
对于 ParticleSystem.MinMaxCurve
,这被明确描述为被评估为曲线持续时间值的标准化 0 到 1 范围:
https://docs.unity3d.com/ScriptReference/ParticleSystem.MinMaxCurve.Evaluate.html
Normalized time (in the range 0 - 1, where 1 represents 100%) at which
to evaluate the curve. This is valid when
ParticleSystem.MinMaxCurve.mode is set to
ParticleSystemCurveMode.Curve or ParticleSystemCurveMode.TwoCurves.
更新:
对于那些考虑性能的人:
AnimationCurve 的 Evaluate 在 Unity 的 MonoBehaviour 世界的传统意义上非常快,具有内置方法来缓存周围键的查找,并保留最后计算的位置。因此,在评估循环中特别快。高度老派优化,由 Unity。
但是,ParticleSystem.MinMaxCurve 的评估受益于 UnityEngine.ParticleSystemJobs 功能的乔布斯友好更新,并且是乔布斯友好更新的一部分。
在少量使用中(大约 1000 个评估步骤或更少),它们大致相同。但是有了 Jobs 和大量细粒度的评估(超过 10,000),MinMaxCurve 领先。
它在大多数情况下使用 0
到 1
但完全取决于您如何配置和使用您的...您可以轻松地在 [=12] 之前使用关键帧扩展 AnimationCurve
=] 及以后 1
.
但是您可以获得 AnimationCurve
的持续时间,因此基本上您可以使用 [=20= 将任何动画曲线标准化为 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);
动画曲线上的Evaluate
函数一次取一个值。
https://docs.unity3d.com/ScriptReference/AnimationCurve.Evaluate.html
但(我)不清楚使用的是什么时基或单位。
对于 ParticleSystem.MinMaxCurve
,这被明确描述为被评估为曲线持续时间值的标准化 0 到 1 范围:
https://docs.unity3d.com/ScriptReference/ParticleSystem.MinMaxCurve.Evaluate.html
Normalized time (in the range 0 - 1, where 1 represents 100%) at which to evaluate the curve. This is valid when ParticleSystem.MinMaxCurve.mode is set to ParticleSystemCurveMode.Curve or ParticleSystemCurveMode.TwoCurves.
更新:
对于那些考虑性能的人: AnimationCurve 的 Evaluate 在 Unity 的 MonoBehaviour 世界的传统意义上非常快,具有内置方法来缓存周围键的查找,并保留最后计算的位置。因此,在评估循环中特别快。高度老派优化,由 Unity。
但是,ParticleSystem.MinMaxCurve 的评估受益于 UnityEngine.ParticleSystemJobs 功能的乔布斯友好更新,并且是乔布斯友好更新的一部分。
在少量使用中(大约 1000 个评估步骤或更少),它们大致相同。但是有了 Jobs 和大量细粒度的评估(超过 10,000),MinMaxCurve 领先。
它在大多数情况下使用 0
到 1
但完全取决于您如何配置和使用您的...您可以轻松地在 [=12] 之前使用关键帧扩展 AnimationCurve
=] 及以后 1
.
但是您可以获得 AnimationCurve
的持续时间,因此基本上您可以使用 [=20= 将任何动画曲线标准化为 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);