C#

Появление префаба через некоторое время

У меня есть префаб травы, и после того как я его удаляю со сцены он должен появится заново в промежутке от 10 до 30 секунд. Проблема в том что мой костыльный код спавнит кучу префобов травы в предназначенных для этого позициях



using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class GrassRegeneration : MonoBehaviour

{

public Transform grassPos;

public GameObject grassPrefab;

public static bool hasGrass = true;

public static bool carutineLaunched = true;

public int idPos;


float x;

float y;

public void Respawn()



{

Vector3 pos = new Vector3(grassPos.position.x,grassPos.position.y);

grassPrefab = Instantiate(grassPrefab, pos, Quaternion.identity)as GameObject;




}


private void FixedUpdate()

{

if (GrassRegeneration.carutineLaunched == false)

{

GrassRegeneration.hasGrass = false;

}






if (GrassRegeneration.hasGrass == false && GrassTake.spriteNot == false)

{

StartCoroutine("regenerationTime");

GrassRegeneration.carutineLaunched = true;

}

}


IEnumerator regenerationTime()

{

while (true)

{

yield return new WaitForSeconds(10);

Respawn();

GrassTake.spriteNot = true;

StopAllCoroutines();





}



}


}
Я не самый большой специалист в диезе, но разве можно останавливать короутин из короутина? Это как-то... неэтично.

убери while (true), просто подожди N секунд и высади новую траву
АМ
Анатолий Мустафаев
38 458
Лучший ответ
вообще есть метод https://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html
в котором можно сделать задержку выполнения.

но в твоем случае ты можешь не удалять объект травы, а допустим просто скрывать его mesh (если 3Д) или sprite если 2Д, а затем снова показывать спустя n-секунд. Для производительности это намного лучше, чем спавнить новый объект. А чтобы с ним не было никаких взаимодействий, то ввести bool переменную isAlive допустим и проверять ее при контакте с объектом. Типа if (!isAlive) return;
ЛК
Лев Крупник
9 703
Не надо мудрить. Не удаляй объект, а делай его неактивным. Я не стал разбираться в твоём коде, поэтому сделал свой пример, надеюсь, по нему ты разберёшься:
public GameObject Player;
Public int isfalse = 0

Public void FirstFalse()
{
Player.SetActive(false)
isfalse = 1;
} // здесь мы делаем игрока(или любой объект, который захочешь) неактивным (фактически убираем со сцены) а так же с помощью переменной isfalse запоминаем, что объект неактивен.

public void Update()
{
if(isfalse == 1)
{
startcoroutine(SetFalse());
}
} //здесь и пригодилась наша переменная, просто по твоим объяснениям, если я правильно понял, нужно сделать объект активным СРАЗУ же через какое-то время после того, как он стал неактивным. Мы проверяем, является ли переменная равна 1,что показывает нам, что объект не активен и запускаем коуротину.

IEnumerator SetFalse()
{
yield return new WaitForSeconds(20);
Player.SetActive(true);
isfalse = 0;
} // та самая коуротина, которая делает объект снова активным, а так же возвращает isfalse в старую позицию.

Похожие вопросы