如何通过随机停止产生敌人来修复我的产卵脚本?

时间:2017-06-06 04:34:55

标签: c# unity3d

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

screenshot 1

using UnityEngine;
using System.Collections;

public class spawn : MonoBehaviour
{
    public GameObject zombie;
    public float delayTime = 4f;

    IEnumerator Start()
    {
        var obj = Instantiate(zombie, transform.position, transform.rotation) as GameObject;
        yield return new WaitForSeconds(delayTime);
        StartCoroutine(Start());
    }
}

场景设置如下:

screenshot 2 screenshot 3 screenshot 4 screenshot 5

2 个答案:

答案 0 :(得分:1)

首先将您的产卵功能与Start功能分开以避免混淆。

void Start()
{
    StartCoroutine(SpawningRoutine());
}

然后你想让你的协程继续永远产卵?你需要在协程中有一个循环。在下面的例子中,我做了一个无限循环但你可以有一个计数器来表示你想要的僵尸数量。

IEnumerator SpawningRoutine()
{
    while(true)
    {
        var obj = Instantiate(zombie, transform.position, transform.rotation) as GameObject;
        yield return new WaitForSeconds(delayTime);
    }
}

最后记得把这个spawn脚本放在一个不是僵尸的对象上。有一个单独的spawn对象,只有这个脚本。你可能已经这样做了。

编辑以响应记录:

将日志记录脚本添加到zombie预制件中,如下所示:

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

答案 1 :(得分:0)

你真的不需要使用协同程序,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;
}