C# 如何修复随机停止敌人繁殖的繁殖脚本?

C# 如何修复随机停止敌人繁殖的繁殖脚本?,c#,unity3d,C#,Unity3d,我有一个简单的脚本,它应该可以生成具有时间延迟的僵尸,这些僵尸可以输入。脚本似乎工作正常,但在我移动角色一段时间后,运行脚本的游戏对象停止繁殖僵尸。如果我的角色静止不动,僵尸将继续繁殖。红色箭头指向正在繁殖僵尸的游戏对象 场景设置如下所示: 首先将生成函数与启动函数分开,以避免混淆 void Start() { StartCoroutine(SpawningRoutine()); } 那你想让你的协同程序永远继续产卵吗?您需要在协同程序中创建一个循环。在下面的例子中,我做了一个无限

我有一个简单的脚本,它应该可以生成具有时间延迟的僵尸,这些僵尸可以输入。脚本似乎工作正常,但在我移动角色一段时间后,运行脚本的游戏对象停止繁殖僵尸。如果我的角色静止不动,僵尸将继续繁殖。红色箭头指向正在繁殖僵尸的游戏对象

场景设置如下所示:


首先将生成函数与启动函数分开,以避免混淆

void Start()
{
    StartCoroutine(SpawningRoutine());
}
那你想让你的协同程序永远继续产卵吗?您需要在协同程序中创建一个循环。在下面的例子中,我做了一个无限循环,但是你可以有一个计数器来计算你想要的僵尸数量

IEnumerator SpawningRoutine()
{
    while(true)
    {
        var obj = Instantiate(zombie, transform.position, transform.rotation) as GameObject;
        yield return new WaitForSeconds(delayTime);
    }
}
最后,请记住将此生成脚本放在一个不是僵尸的对象上。有一个单独的spawn对象,上面只有这个脚本。你可能已经这么做了

编辑以响应日志记录:

将日志脚本添加到僵尸预制中,如下所示:

private static int zombieCounter = 0;
void Start()
{
    Debug.Log("Number of zombies spawned so far: " + zombieCounter++);
}

您实际上不需要为此使用协同程序,InvokeRepeating应该足够好了。还要确保你的僵尸预制是私有的,这样它就不会被其他脚本所取代

[SerializeField] private GameObject zombie;
float waitBeforeFirstSpawn = 0f;
float delayTime = 4f;

void Start()
{
    InvokeRepeating("SpawnZombie", waitBeforeFirstSpawn, delayTime);
}

void SpawnZombie()
{
    GameObject zombieGO = Instantiate(zombie, transform.position, transform.rotation) as GameObject;
}

我似乎仍然有问题,你可以发布一个你的僵尸预制和玩家的屏幕截图,所有的脚本都可见吗?场景中一定有其他东西干扰了你的产卵者,酷,谢谢。你的PlayerMove脚本引用产卵器吗?或者你有任何键盘处理代码,可能会影响产卵器?我想它实际上有更多的东西,我的拍摄脚本可能。因为当我拍摄时,它会在冷却后很快停止产卵,这是一个很好的线索。你能在问题中发布你的射击脚本吗?也许能控制玩家冻结应用程序吗?你说只有当玩家移动时才会发生。僵尸预制是公共的,所以他可以在inspector@DávidFlorek[现场]将通过编辑器访问私有字段。@DávidFlorek是的,但从他所说的来看,似乎他在产卵脚本之外的某个地方用null覆盖了他的僵尸预设,因此它将为他修复它。此外,正如Reasuria所说,他可以设置[SerializeField]从inspectorI访问它,我想他是放了一个僵尸实例而不是一个预置。因此,当他射击并杀死实例时,它将被销毁并从生成脚本中删除。可能也是这样。
[SerializeField] private GameObject zombie;
float waitBeforeFirstSpawn = 0f;
float delayTime = 4f;

void Start()
{
    InvokeRepeating("SpawnZombie", waitBeforeFirstSpawn, delayTime);
}

void SpawnZombie()
{
    GameObject zombieGO = Instantiate(zombie, transform.position, transform.rotation) as GameObject;
}