我对编码还很陌生。到目前为止,我搜索了很多东西,但仍然无法解决我的问题。我正在尝试使游戏对象遵循线条/图形。我试图给他一个负 Y 速度,并在每次更新时添加少量数字(例如;update{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;
}
请注意,使用
DateTime.Now
和 TimeSpan
计算(如这个答案)非常昂贵......特别是如果您使用它每帧只是为了以秒为单位计算增量。
Time.deltaTime
中提供的,自上一帧渲染以来所经过的时间(以秒为单位).. 那么,如果我们已经知道该值,为什么要计算它复杂 ;)
curve += curveupdate * Time.deltaTime;
简单来说,乘以
Time.deltaTime
将任何值从“每帧值”转换为与帧速率无关的“每秒值”
不要考虑“变化率”,而必须考虑“每单位时间的变化率”。
例如,您似乎正在基于
curve
更新 curveupdate = 0.05f;
,其变化率为 0.05f
。您需要考虑每秒的变化率。假设您当前每帧获得 0.05f
变化,假设每秒 10 帧,这意味着每秒的变化率为 0.5f
(高十倍)。
然后将此金额乘以经过的秒数。以下是具体操作方法。
首先,当您开始动画时,您需要记住它何时开始:
var lastUpdateTime = DateTime.Now;
然后更改此:
curve += curveupdate;
对此:
DateTime currentTime = DateTime.Now;
float secondsElapsed = (float)(currentTime - lastUpdateTime).TotalMilliseconds / 1000F;
curve += (curveupdate * secondsElaped);
lastUpdateTime = currentTime;
这样,变化量就会根据过去的时间而变化。如果没有经过任何时间,它会一直缩小到 0,如果经过了几个小时,它最终会变得非常非常大。对于最终用户来说,随着时间的推移,变化率应该看起来是一致的。