【问题标题】:Movement is dependent to frame-rate. How can i make it independent from frame-rate运动取决于帧速率。我怎样才能让它独立于帧速率
【发布时间】:2021-05-07 21:10:32
【问题描述】:

我对编码很陌生。直到现在我搜索了很多东西,但我仍然无法解决我的问题。我正在尝试使游戏对象遵循线/图。我试图给他一个负 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;

        }

【问题讨论】:

  • 我在 Unity 上工作不多,但 Time.deltaTime 可能是您想要的?
  • 我几乎可以肯定我可以用关键字 Time 来解决它,我尝试使用 Time.deltaTime 但似乎我无法让它工作。

标签: c# unity3d game-physics


【解决方案1】:

请注意,使用 this answer 中的 DateTime.NowTimeSpan 计算非常昂贵...尤其是如果您每帧使用它只是为了计算以秒为单位的增量。

这实际上正是 Unity 在 Time.deltaTime 中提供的,自最后几个渲染以来经过的时间(以秒为单位).. 如果我们已经知道该值,为什么还要计算它复杂 ;)

curve += curveupdate * Time.deltaTime;

简单来说,乘以 Time.deltaTime 会将任何值从“每帧值”转换为与帧速率无关的“每秒值”

【讨论】:

    【解决方案2】:

    您必须考虑“每单位时间的变化率”,而不是考虑“变化率”。

    例如,您似乎正在根据curveupdate = 0.05f; 更新curve,它的变化率为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,如果过去了几个小时,它最终会变得非常非常大。因此,对于最终用户而言,随着时间的推移,变化率应该是一致的。

    【讨论】:

    • 这在 Unity 中是完全错误的。显然,在 Unity 中有一种方法可以做到这一点,因为这显然是基于帧的游戏引擎的全部意义所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2014-10-12
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多