协同程序导致对象之间的间距不均匀

时间:2017-04-10 20:06:04

标签: c# unity3d

我有一个Coroutine,我尝试过使用WaitForSecondsRealtimeWaitForSeconds。当我运行Coroutine时,延迟在几次迭代中是相同的,但是有一个间隙,延迟时间稍长,然后又返回,然后再次出现延迟。

这是一张正在发生的事情的图片,你可以看到圈子之间有一些间隙,我希望这些间隙更加稳定。

Gap

以下是我正在使用的Coroutine

public float shootDelay = 0.03f;

IEnumerator Shoot(Vector3 direction) {
    direction.z = 0f;
    foreach (GameObject ball in balls) {
        float speed = ball.GetComponent<Ball>().speed;
        ball.GetComponent<Ball>().rb.velocity = direction.normalized * speed;
        yield return new WaitForSecondsRealtime(shootDelay);
    }
}

1 个答案:

答案 0 :(得分:1)

很难从你的一小段代码中确切地知道你的问题是什么。一个好的Minimal, Complete, and Verifiable code example会有很大的帮助(可能减去标准的Unity3d样板......为Unity3d问题提供恰当数量的代码是一门艺术。)

但是似乎就像你试图在“球”从某事物“射击”之间实施延迟。因此,您希望以精确的间隔初始化每个球。它们不是,导致间隔不规则。

不幸的是,我不认为你可以指望WaitForSecondsRealtime()(或WaitForSeconds(),就此而言......这可能是一个更好的选择,因为如果你改变游戏它会自动调整模拟速度)。 These functions有一些重要的不精确来源,你需要考虑,特别是等待的时间只在当前帧完全完成后计算,而你的协程只在指定时间后的第一帧恢复。过去。

考虑这种不精确性的一种方法是使用Time.time值来跟踪自您开始发射子弹以来实际经过的模拟时间。在循环之前的协同程序中将变量初始化为当前值。然后,当您设置项目符号对象的velocity时,还要根据速度以及当前时间值与该项目符号的预期时间值之间的差异设置其position。然后等待一段时间,而不是你想要的确切时间间隔,而是等待当前时间和下一个项目符号时间之间差异的时间间隔。

如果没有一个好的MCVE,我尝试测试它是不实际的(即,我没有),但这样的事情应该有效:

IEnumerator Shoot(Vector3 direction) {
    direction.z = 0f;
    float nextBulletTime = Time.time;
    foreach (GameObject ball in balls) {
        Ball ballComponent = ball.GetComponent<Ball>();
        float speed = ballComponent.speed;
        Rigidbody rb = ballComponent.rb;

        rb.velocity = direction.normalized * speed;
        rb.position += rb.velocity * (Time.time - nextBulletTime);

        nextBulletTime += shootDelay;
        yield return new WaitForSeconds(nextBulletTime - Time.time);
    }
}