1 回答
TA贡献1906条经验 获得超3个赞
我使用 stepCount 在 blenshapes、着色器变量(如不透明度)上实现更平滑的过渡。并且必须使用 stepCount>=100。
这些步骤都将在第二秒发生......但是:1
您的代码以一定的最佳帧速率运行(在 PC 上和编辑器中大多更高),这导致“标准”大约在两帧之间!60 f/s
Time.deltaTime
0.017 seconds
yield return new WaitForSeconds(XY);
或者一般来说,任何使用的东西都会至少等待一帧!yield
因此,当然,一旦变得比实际可能的帧速率和两帧之间的实时时间更小,您的功能就会中断。特别是例如,当您说您希望每秒执行几次时。deltaTime
>=100
比帧速率更频繁地更新值也是没有意义的,因为用户不会比实际渲染帧更快地注意到任何更改。
此外,可能是一个性能密集型调用(老实说不知道),因此它也可能减慢执行速度,从而导致额外的延迟。SetBlendShapeWeight
如何使用具有特定 stepCount 的协程并拥有完美的时序
超过一定限度,你就做不到。
但是,为什么您需要/想要使用固定步骤呢?value
既然是一个,而且看起来你真正想要的是一个平稳的过渡,你可以简单地做value
float
IEnumerator ScaleDown(float duration)
{
print(Time.time);
timePassed = 0f;
do
{
// a linear interpolated value between 0 and 1
var value = timePassed / duration;
// optionaly you could even add some ease-in and ease-out
//value = SmoothStep(0, 1, value);
meshRenderer.SetBlendShapeWeight(1, value * 100f);
// increase by the time passed since last frame
// to avoid overshooting use Mathf.Min with the remaining difference
// between duration and passedTime
timePassed += Mathf.Min(duration - timePassed, Time.deltaTime);
yield return null;
} while (timePassed < duration);
print(Time.time);
}
我,你仍然想反过来假装它,并使其以固定的步长更新<帧速率,你可以简单地将平滑过渡的值四舍五入到该值,例如stepCount
value = Mathf.Round(value / deltaValue)) * deltaValue;
应向上或向下舍入到 的下一个完整步骤。deltaValue
另请注意,在较新的 Unity 版本中,不再像以前版本那样自动限制在范围内。SetBlendShapeWeight
[0; 100]
不过,大多数 3D 建模程序都会导出具有 Unity 中范围的模型[0;100]
BlendShape 权重范围包括模型中定义的最小权重和最大权重之间的值。
- 1 回答
- 0 关注
- 158 浏览
添加回答
举报