一段时间后生成对象会导致不同的结果,具体取决于时间尺度



这是我脚本的一部分。游戏对象不会在我期望它们生成的时间生成。我试图改变与延迟值相关的时间尺度(即时间刻度= 1和baseDelay = .1f到时间刻度= 10和baseDelay = 1(。这就像一个魅力,我真的不知道为什么。我的代码有问题吗?固定更新和小浮点数的统一性问题吗?

图像:

  • http://i.epvpimg.com/hwgsbab.png
  • http://i.epvpimg.com/WYBfbab.png

using System; using System.Collections; 
using System.Collections.Generic; 
using UnityEngine;
public class GameController : MonoBehaviour { 
internal int xCount = 5; //bricks in x per line 
internal float spacing = .5f; //space between bricks and margin to edges 
internal float baseDelay = .1f; //time that needs to pass until the next movement internal 
float brickMovementPerStep = .05f; //movement distance per step 
int currentLineNumber = 0; //index for current line
 void FixedUpdate()
 {
 //accurate value of space which needs to pass
 float dist = ((screenSize.x - (2 * spacing + ((xCount - 1) * spacing))) / xCount) * .667f + spacing;
 float stepsPerSecond = 1 / baseDelay; //how many steps are there per second?
 float movementPerSecond = stepsPerSecond * brickMovementPerStep; //how far will a line have moved?
 float requiredTime = dist / movementPerSecond; //how long will a line need to travel until the next one can be spawned?
 timeSinceLastSpawn += Time.deltaTime;
 if(timeSinceLastSpawn >= requiredTime)
 {
     timeSinceLastSpawn = 0; //reset time
     currentLineNumber++;
     SpawnAndStartLevel(); //this instantiates and moves the line, it is moved continously
 }

}

Time.deltaTime

用于更新每一帧的函数中。 FixedUpdate()不会运行每一帧。 FixedUpdate()是针对物理的 - 因为你没有做任何物理,你应该把它重命名为Update()。我敢打赌,这将解决您时间上的异常情况。阅读更多

当然,可能会发生舍入误差。为此,我建议使用带有yield return WaitForSeconds(float)的协程,因为您似乎在固定的时间间隔内做事。

internal int xCount = 5; //bricks in x per line 
internal float spacing = .5f; //space between bricks and margin to edges 
internal float baseDelay = .1f; //time that needs to pass until the next movement internal 
float brickMovementPerStep = .05f; //movement distance per step 
int currentLineNumber = 0; //index for current line
bool run = true;
bool reset = false;
void Start() {
    StartCoroutine(LineRoutine(baseDelay));
}
public IEnumerator LineRoutine(float delay) {
    while (run){
        float dist = ((screenSize.x - (2 * spacing + ((xCount - 1) * spacing))) / xCount) * .667f + spacing;
        float stepsPerSecond = 1 / delay; //how many steps are there per second?
        float movementPerSecond = stepsPerSecond * brickMovementPerStep; //how far will a line have moved?
        float requiredTime = dist / movementPerSecond; //how long will a line need to travel until the next one can be spawned?
        while (!reset) {
            // stuff to happen every [requredTime] seconds
            yield return new WaitForSeconds(requiredTime);
            currentLineNumber++;
            SpawnAndStartLevel();
        }
        reset = false;
    }
}

顺便说一句,无论您在 FixedUpdate 中使用 Time.deltaTime 还是 Time.fixedDeltaTime,如 Unity 文档中所述,都无关

紧要

请注意,我不会每次迭代都重新计算所需的时间,因为在我看来它不会不断变化。 但是,如果将reset设置为 true,它将离开该循环并重新计算所需的时间。

最新更新