如何在一段时间后销毁GameObject并实例化新对象

时间:2018-10-28 22:13:34

标签: c# unity3d gameobject

我正在创建一个游戏,游戏中有7个GameObject Prefab,每个实例都在一个实例上进行实例化,我现在正在创建将每个GameObject Prefab实例化的主脚本,现在我要这样做每80f“秒”实例化一个新的GameObject Prefab,并销毁最后一个实例,例如,自关卡启动后的0f秒内实例化(随机)GameObject Prefab,并在80f秒内销毁我在0f秒内创建的对象,然后实例化一个新的,依此类推。

这是我现在拥有的脚本,它不起作用,它会实例化新的游戏对象,但不会破坏我创建的最后一个游戏对象。 希望您能帮助我/给我一个解决问题的方法 注意我尝试使用Stack,但是当我从堆栈中销毁Prefab时,它会自行销毁预制件,并且无法恢复。我的脚本:

    TimeSinceLevelStarted = Time.timeSinceLevelLoad;
    if (Mathf.Clamp(TimeSinceLevelStarted - TimeToLoadNext, -2f, 2f) == TimeSinceLevelStarted - TimeToLoadNext
        && LoadedFirstLevel == false)
    {
        GameObject go = LevelsPrefabs[Random.Range(0, LevelsPrefabs.Length)];
        FirstLevel(go);
        LoadedFirstLevel = false;
        Debug.Log("Instantiated Prefab2");
    }
    }

private void FirstLevel(GameObject go)
{
    if (LoadedFirstLevel == false)
    {
        Instantiate(go, new Vector3(0, 0, 0), Quaternion.identity);
        goStack.Push(go);
        Debug.Log("Instantiated Prefab1");
        TimeToLoadNext += 50f;
        LoadedFirstLevel = false;
        if (TimeToLoadNext >= 30f) {
            Destroy(go);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

重复事件最好由协程完成。另外,Unity还告诉我们避免在游戏运行时实例化和销毁GameObject(因为它的“慢速”)-尤其是当它们可能被重用时。

因此,下面是对所需行为的快速而肮脏的实现。如果要确保一个对象不会连续两次激活,则不能采用直接随机方法,但是您需要重新整理数组并以新顺序生成它。有许多可用的示例来对数组进行改组。下面的内容应该很容易适应,并且需要一些修正;)

public class RandomSpawner : MonoBehaviour {

    //i learned there should always be an option to break out of a loop
    public bool exitCoroutine = false;

    public GameObject[] prefabs;
    public float waitTime = 80.0f;

    WaitForSeconds waitObject;
    GameObject[] gameObjects;
    int currentlyActive = 0;

    void Start() {

        waitObject = new WaitForSeconds(waitTime);

        gameObjects = new GameObject[prefabs.Length];

        for (int i = 0; i < prefabs.Length; i++) {
            gameObjects[i] = Instantiate(prefabs[i]);
            gameObjects[i].SetActive(false);
        }

        StartCoroutine(SpawnRandomObject());
    }

    void ActivateRandom() {
        int nextActive = Random.Range(0, gameObjects.Length);
        gameObjects[currentlyActive].SetActive(false);
        gameObjects[nextActive].SetActive(true);
        currentlyActive = nextActive;
    }

    IEnumerator SpawnRandomObject() {

        while (!exitCoroutine) {
            ActivateRandom();

            yield return waitObject;
        }
    }
}
  

https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html   https://docs.unity3d.com/ScriptReference/WaitForSeconds.html

相关问题