Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待特定的秒数来繁殖敌人_C#_Unity3d_Timer - Fatal编程技术网

C# 等待特定的秒数来繁殖敌人

C# 等待特定的秒数来繁殖敌人,c#,unity3d,timer,C#,Unity3d,Timer,所以。。。我在这个Wave系统工作了一个小游戏,我想让系统在繁殖另一个敌人之前等待一段特定的时间,所以我做了这样一件事: void ExecuteWaveAction(WaveAction action) { int numberOfSpawns = spawnLocations.Length; int currentSpawnToInstantiate = 0; float timeLeftToSpawnEnemy = 0f; for (int i = 0;

所以。。。我在这个Wave系统工作了一个小游戏,我想让系统在繁殖另一个敌人之前等待一段特定的时间,所以我做了这样一件事:

void ExecuteWaveAction(WaveAction action)
{
    int numberOfSpawns = spawnLocations.Length;
    int currentSpawnToInstantiate = 0;
    float timeLeftToSpawnEnemy = 0f;

    for (int i = 0; i < action.quantityOfEnemysToSpawn; i++) 
    {
        if (timeLeftToSpawnEnemy < action.spawnRate) 
        {
            timeLeftToSpawnEnemy += Time.deltaTime;
            i--;
        }
        else
        {
            GameObject.Instantiate (action.enemyToSpawn, spawnLocations [currentSpawnToInstantiate].position, Quaternion.identity);
            currentSpawnToInstantiate++;

            timeLeftToSpawnEnemy = 0f;

            if (currentSpawnToInstantiate >= numberOfSpawns)
                currentSpawnToInstantiate = 0;
        }
    }
}
我不知道代码出了什么问题,当我调试一切似乎都很好时,脚本实际上会在生成之前等待,但当我播放脚本时,会同时生成所有生物


如果有人能帮助我,我会非常感激,最后,如果我犯了任何拼写错误或英语错误,我很抱歉,我不是一个母语为英语的人。 完成最后一帧只读所用的时间(秒)

使用此功能使游戏帧速率独立

在Unity中,每当您需要制定一个与时间相关的场景时,您必须使用协同例程,否则,度量增量时间完全取决于您的代码逻辑

int numberOfSpawns = spawnLocations.Length;
int currentSpawnToInstantiate = 0;
float timeLeftToSpawnEnemy = 0f;
WaveAction action = set this in advance;

void Start()
{
    action = ... 
    ExecuteWaveAction(); 
}

void ExecuteWaveAction()
{
    numberOfSpawns = spawnLocations.Length;
    currentSpawnToInstantiate = 0;
    timeLeftToSpawnEnemy = 0f;
    i = 0;    
}
在一个简单的协程中,我们将逻辑包装在一个循环中,并且我们有一个yield语句,该语句的值指示协程在每次传递之后应该等待的时间帧的数量

Update和FixedUpdate方法是Unity内置的协程,它们分别在Time.deltaTime和Time.fixedDeltaTime秒执行

由于ExecuteWaveAction必须使用增量时间,因此生成的逻辑必须具有协同程序才能工作

int numberOfSpawns = spawnLocations.Length;
int currentSpawnToInstantiate = 0;
float timeLeftToSpawnEnemy = 0f;
WaveAction action = set this in advance;

void Start()
{
    action = ... 
    ExecuteWaveAction(); 
}

void ExecuteWaveAction()
{
    numberOfSpawns = spawnLocations.Length;
    currentSpawnToInstantiate = 0;
    timeLeftToSpawnEnemy = 0f;
    i = 0;    
}
现在看看循环逻辑是如何从原始方法中分离出来并放入一个协程的:

int i = 0;
void Update()
{
    //if spawning is active then continue...
    if (i < action.quantityOfEnemysToSpawn) 
    {
        if (timeLeftToSpawnEnemy < action.spawnRate) 
        {
            timeLeftToSpawnEnemy += Time.deltaTime;
        }
        else
        {
            i++;

            GameObject.Instantiate (action.enemyToSpawn, spawnLocations [currentSpawnToInstantiate].position, Quaternion.identity);
            currentSpawnToInstantiate++;

            timeLeftToSpawnEnemy = 0f;

            if (currentSpawnToInstantiate >= numberOfSpawns)
                currentSpawnToInstantiate = 0;
        }
    }
}
注:

你可能想知道为什么我们不能在循环中使用Time.deltaTime

答案是:因为Time.deltaTime表示一帧的时间长度,它基本上等于同一更新方法的每两次连续执行之间的延迟,但是一个简单的循环在一帧中同时运行,因此Time.deltaTime只告诉我们循环没有处理的其他延迟


换句话说,Unity不在一个循环内等待一个帧结束,但是它在每个协同进程等待时间的执行之后=帧长度,即时间。DeltTime/Time.FixDeltTalMy或手动协同程序等待时间。

首先让我们看一下时间。 完成最后一帧只读所用的时间(秒)

使用此功能使游戏帧速率独立

在Unity中,每当您需要制定一个与时间相关的场景时,您必须使用协同例程,否则,度量增量时间完全取决于您的代码逻辑

int numberOfSpawns = spawnLocations.Length;
int currentSpawnToInstantiate = 0;
float timeLeftToSpawnEnemy = 0f;
WaveAction action = set this in advance;

void Start()
{
    action = ... 
    ExecuteWaveAction(); 
}

void ExecuteWaveAction()
{
    numberOfSpawns = spawnLocations.Length;
    currentSpawnToInstantiate = 0;
    timeLeftToSpawnEnemy = 0f;
    i = 0;    
}
在一个简单的协程中,我们将逻辑包装在一个循环中,并且我们有一个yield语句,该语句的值指示协程在每次传递之后应该等待的时间帧的数量

Update和FixedUpdate方法是Unity内置的协程,它们分别在Time.deltaTime和Time.fixedDeltaTime秒执行

由于ExecuteWaveAction必须使用增量时间,因此生成的逻辑必须具有协同程序才能工作

int numberOfSpawns = spawnLocations.Length;
int currentSpawnToInstantiate = 0;
float timeLeftToSpawnEnemy = 0f;
WaveAction action = set this in advance;

void Start()
{
    action = ... 
    ExecuteWaveAction(); 
}

void ExecuteWaveAction()
{
    numberOfSpawns = spawnLocations.Length;
    currentSpawnToInstantiate = 0;
    timeLeftToSpawnEnemy = 0f;
    i = 0;    
}
现在看看循环逻辑是如何从原始方法中分离出来并放入一个协程的:

int i = 0;
void Update()
{
    //if spawning is active then continue...
    if (i < action.quantityOfEnemysToSpawn) 
    {
        if (timeLeftToSpawnEnemy < action.spawnRate) 
        {
            timeLeftToSpawnEnemy += Time.deltaTime;
        }
        else
        {
            i++;

            GameObject.Instantiate (action.enemyToSpawn, spawnLocations [currentSpawnToInstantiate].position, Quaternion.identity);
            currentSpawnToInstantiate++;

            timeLeftToSpawnEnemy = 0f;

            if (currentSpawnToInstantiate >= numberOfSpawns)
                currentSpawnToInstantiate = 0;
        }
    }
}
注:

你可能想知道为什么我们不能在循环中使用Time.deltaTime

答案是:因为Time.deltaTime表示一帧的时间长度,它基本上等于同一更新方法的每两次连续执行之间的延迟,但是一个简单的循环在一帧中同时运行,因此Time.deltaTime只告诉我们循环没有处理的其他延迟


换句话说,Unity不会在循环内等待帧结束,而是在执行每个协程等待时间=帧长度后等待,即time.deltaTime或time.fixedDeltaTime或手动协程等待时间。

我建议使用协程:

IEnumerator ExecuteWaveAction(WaveAction action) {
    int currentSpawnToInstantiate = 0;
    for (int i = 0; i < action.quantityOfEnemysToSpawn; i++) 
    {
            // spawn object
            GameObject.Instantiate (action.enemyToSpawn, spawnLocations [currentSpawnToInstantiate].position, Quaternion.identity);
            currentSpawnToInstantiate++;
            if (currentSpawnToInstantiate >= numberOfSpawns)
                currentSpawnToInstantiate = 0;

            // waits for 1 sec before continue. you can change the time value
            yield return new WaitForSeconds(1);
        }
    }

我建议为此使用协同程序:

IEnumerator ExecuteWaveAction(WaveAction action) {
    int currentSpawnToInstantiate = 0;
    for (int i = 0; i < action.quantityOfEnemysToSpawn; i++) 
    {
            // spawn object
            GameObject.Instantiate (action.enemyToSpawn, spawnLocations [currentSpawnToInstantiate].position, Quaternion.identity);
            currentSpawnToInstantiate++;
            if (currentSpawnToInstantiate >= numberOfSpawns)
                currentSpawnToInstantiate = 0;

            // waits for 1 sec before continue. you can change the time value
            yield return new WaitForSeconds(1);
        }
    }

你将Time.deltaTime添加到一个循环中的TimeleftoSpawnEbust,即你的繁殖率是action.QuantityofenemySpown比你预期的快。另外,通过执行i-在你更改了TimeleftoSpawnEbust之后,你有效地使你的代码在同一帧中循环,直到有人最终繁殖。那么,你的方法是什么??因为我没有俱乐部,所以大多数人都会参加联谊会。更容易阅读,并且与框架无关。虽然使用您的方法确实可以做到这一点,但我建议您尝试使用@BrandonMiller所说的方法:使用协同程序。协同程序是为这样的任务而设计的。你将Time.deltaTime添加到一个循环中的timeleftoprowndefect,即你的生成速率是action.quantityofenemytospawn,比你预期的快。另外,通过执行i-在你更改了timeleftoprowndefect之后,你有效地使你的代码在同一帧中循环,直到有人最终生成。因此,你会怎么做??因为我没有俱乐部,所以大多数人都会参加联谊会。更容易阅读,并且与框架无关。虽然用你的方法肯定可以做到这一点,但我建议你尝试一下@Bran donMiller说:使用协同程序。协同程序是为这样的任务而设计的。