Как уничтожить GameObject и создать новый через некоторое время - PullRequest
0 голосов
/ 29 октября 2018

Я создаю игру, в которой есть 7 префабов GameObject, каждый из которых создает свой уровень, сейчас я создаю основной скрипт, который будет создавать экземпляр каждого префаба GameObject, теперь я хочу создатькаждые 80f «секунд» для создания нового префаба GameObject и уничтожения последнего, например, через 0f секунд с момента запуска уровня, Instantiate (Random) префаба GameObject и через 80f секунд уничтожение созданного мною за 0f секунд и Instantiateновый и т. д.

Это скрипт, который у меня есть сейчас, он не работает, он создает новый игровой объект, но не уничтожает последний, который я создал.Я надеюсь, что вы можете помочь мне / дать мне представление о том, как решить эту проблему ПРИМЕЧАНИЕ Я пытался использовать Stack, но когда я уничтожаю Prefab из стека, он сам разрушает 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 голосов
/ 29 октября 2018

Повторяющиеся события лучше всего делать с сопрограммами. Также 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

...