Unity Collision Удалить затем Добавить назад - PullRequest
0 голосов
/ 03 июля 2018

У меня есть объекты, которые прокручиваются по экрану и делают это бесконечно. Я хочу удалить объект при касании (я получил эту часть) SetActive / Destroy.
Я пытаюсь добавить объекты обратно на сцену, чтобы их можно было использовать повторно.

Как бы я поступил об этом?

if (col.gameObject.tag == "Coin"){
        coinCount++;
        coins.text = coinCount.ToString();

        // Save Coins
        PlayerPrefs.SetInt("Coins", coinCount);
        col.gameObject.SetActive(false);
    }

Код выше находится в -> OnTriggerEnter2D(Collider2D){}

// Waits Seconds to put coins in correct spot
IEnumerator afterSeconds(GameObject x)
{
    //x.SetActive(false);

    yield return new WaitForSeconds(5f);//5f

    //x.SetActive(true);
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

То, что вы можете искать, это объединение объектов. Это система, которая управляет созданием динамических количеств GameObjects, не уничтожая и создавая их экземпляры, но вместо этого делая их невидимыми и пригодными для повторного использования. Если в пуле заканчиваются необходимые объекты (поскольку одновременно используется слишком много), он может создавать дополнительные объекты по мере необходимости. Обычно есть активы, которые делают это, но я думаю, что это может быть закодировано и самостоятельно. Даже в официальных руководствах по Unity это упоминается и классифицируется как начальный уровень: Объединение объектов . Затем происходит просто замена всех методов Instantiate на методы InstantiatePool.

Так что, если вы не хотите явно вызывать возрождение GameObjects с фиксированными задержками, но разрешите сценарию менеджера обрабатывать порождение так, как вам нужно, это может быть то, что вы ищете.

0 голосов
/ 03 июля 2018

Вы могли бы использовать MonoBehavior.Invoke() и установить переменную класса для коллайдера, но это было бы грязно, если у вас есть столкновения, происходящие до шага повторного включения. Вместо этого я бы использовал Coroutine.

if (col.gameObject.tag == "Coin"){
        coinCount++;
        coins.text = coinCount.ToString();

        // Save Coins
        PlayerPrefs.SetInt("Coins", coinCount);
        StartCoroutine(afterSeconds(col.gameObject)); //hide, delay, show  
    }

и затем:

// Waits Seconds to put coins in correct spot
IEnumerator afterSeconds(GameObject x)
{
    x.SetActive(false);
    yield return new WaitForSeconds(5f);
    x.SetActive(true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...