问题描述
我对编码很陌生。直到现在我搜索了很多东西,但我仍然无法解决我的问题。我试图让一个游戏对象跟随一条线/图。我试图给他一个负 Y 速度并添加小数字(类似于;更新{mybody.veLocity += 0.005})每次更新以使其移动。但我遇到了一个问题,在低帧率下,我的对象采用超宽路径,而在较高帧率下,它采用超窄路径。如何让我的动作独立。
private float curve = 0;
private float curvemax = 2.3f;
[Serializefield]
private float curveupdate = 0.05f;
if (tracking.found && !hareketeBaşlandı)
{
curve = -(curvemax);
triggered1 = true;
hareketeBaşlandı = true;
print(curve);
}
if (transform.position.y != y1-curvemax && tracking.found)
{
curve += curveupdate;
print(curve+"Curving");
}
if (curve >= (curvemax))
{
curve = 0;
y2 = transform.position.y;
transform.position = new Vector3(transform.position.x,y1,transform.position.z);
tracking.found = false;
tracking.shouldsearch = false;
StartCoroutine("trackCD");
print("track off");
myBody.veLocity = new Vector2(myBody.veLocity.x,curve);
hareketeBaşlandı = false;
}
解决方法
请注意,在 this answer 中使用 DateTime.Now
和 TimeSpan
计算非常昂贵……尤其是如果您每一帧都使用它来计算增量在几秒钟内。
这实际上正是 Unity 已经在 Time.deltaTime
中提供的内容,即自上次渲染以来经过的时间(以秒为单位)..所以如果我们已经知道值,为什么还要复杂地计算它;)
curve += curveupdate * Time.deltaTime;
简单地说,乘以 Time.deltaTime
将任何值从“每帧值”转换为与帧速率无关的“每秒值”
与其考虑“变化率”,不如考虑“每单位时间的变化率”。
例如,您似乎正在根据 curve
更新 curveupdate = 0.05f;
,其变化率为 0.05f
。您需要考虑每秒的变化率。假设您目前每帧有 0.05f
次变化,假设每秒 10 帧,这意味着您的每秒变化率为 0.5f
(高出 10 倍)。
然后应用此数量乘以经过的秒数。这是操作方法。
首先当你开始动画时,你需要记住它是什么时候开始的:
var lastUpdateTime = DateTime.Now;
然后改变这个:
curve += curveupdate;
为此:
DateTime currentTime = DateTime.Now;
float secondsElapsed = (float)(currentTime - lastUpdateTime).TotalMilliseconds / 1000F;
curve += (curveupdate * secondsElaped);
lastUpdateTime = currentTime;
这样,变化量会随着时间的推移而变化。如果没有时间过去,它会一直缩小到 0,如果过了几个小时,它最终会变得非常非常大。因此,对于最终用户来说,变化率应该随着时间的推移保持一致。