首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么团结会被这个脚本卡在"Application.EnterPlayMode“上呢?

为什么团结会被这个脚本卡在"Application.EnterPlayMode“上呢?
EN

Stack Overflow用户
提问于 2022-08-17 14:05:33
回答 1查看 72关注 0票数 0

当一个脚本启用时,在尝试通过游戏模式测试游戏时,团结将卡在"Application.EnterPlayMode“上。阻止它的唯一方法是通过任务管理器()杀死程序。我也看到过类似的问题,其中的问题是脚本中的无限循环。在对我的代码进行三次检查之后,我无法找到任何循环,并担心可能会出现其他问题(下面是正在讨论的脚本)。如果有帮助的话,这个脚本的目标是周期性地生成一个敌人,目前是5秒。如果你知道任何其他原因或在我的脚本中找到一个循环,请让我知道。

代码语言:javascript
运行
复制
using System;
using System.Threading;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemySpawnerScript : MonoBehaviour
{

    public GameObject enemyPrefab;

    public int spawnRate = 5;
    int timeFromLastSpawn = 0;

    // Start is called before the first frame update
    void Start()
    {
        Timer();
    }

    void Timer ()
    {
        for (timeFromLastSpawn = 0; timeFromLastSpawn < spawnRate; timeFromLastSpawn++)
        {
            Thread.Sleep(1000);
        }
        int randomYPos = new System.Random().Next(0, 5);
        SpawnNewEnemy(randomYPos);
        Timer();
    }

    void SpawnNewEnemy(float yPos)
    {
        Instantiate(enemyPrefab, new Vector2(-12, yPos), Quaternion.identity);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-17 14:16:03

千万不要在Unity (或者大部分的程序,真的)中使用Thread.Sleep来计时,因为这会暂停整个游戏线程,而不仅仅是一个脚本(您可能认为是这样)。

在这种情况下,您有两个(基本)选项。您可以使用柯鲁丁WaitForSeconds

代码语言:javascript
运行
复制
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(Timer());
    }

    IEnumerator Timer()
    {
        Random random = new System.Random(); //reuse your random instances
        while (spawnEnemies) {
            yield new WaitForSeconds(spawnRate); //wait for spawnRate seconds
            int randomYPos = random.Next(0, 5);
            SpawnNewEnemy(randomYPos);
        }
    }

或者Update方法中的计时器变量:

代码语言:javascript
运行
复制
    private float spawnRate = 5;
    private float timeSinceSpawn;

    private Random random = new System.Random(); //reuse your random instances

    void Update()
    {
        timeSinceSpawn += Time.deltaTime;

        if (timeSinceSpawn > spawnRate) { //only spawn if we need to
            int randomYPos = random.Next(0, 5);
            SpawnNewEnemy(randomYPos);
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73389915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档