У меня есть префаб травы, и после того как я его удаляю со сцены он должен появится заново в промежутке от 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();
}
}
}
C#
Появление префаба через некоторое время
Я не самый большой специалист в диезе, но разве можно останавливать короутин из короутина? Это как-то... неэтично.
убери while (true), просто подожди N секунд и высади новую траву
убери while (true), просто подожди N секунд и высади новую траву
вообще есть метод https://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html
в котором можно сделать задержку выполнения.
но в твоем случае ты можешь не удалять объект травы, а допустим просто скрывать его mesh (если 3Д) или sprite если 2Д, а затем снова показывать спустя n-секунд. Для производительности это намного лучше, чем спавнить новый объект. А чтобы с ним не было никаких взаимодействий, то ввести bool переменную isAlive допустим и проверять ее при контакте с объектом. Типа if (!isAlive) return;
в котором можно сделать задержку выполнения.
но в твоем случае ты можешь не удалять объект травы, а допустим просто скрывать его mesh (если 3Д) или sprite если 2Д, а затем снова показывать спустя n-секунд. Для производительности это намного лучше, чем спавнить новый объект. А чтобы с ним не было никаких взаимодействий, то ввести bool переменную isAlive допустим и проверять ее при контакте с объектом. Типа if (!isAlive) return;
Не надо мудрить. Не удаляй объект, а делай его неактивным. Я не стал разбираться в твоём коде, поэтому сделал свой пример, надеюсь, по нему ты разберёшься:
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 в старую позицию.
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 в старую позицию.
Похожие вопросы
- За сколько времени можно выучить язык программирования? (JavaScript)
- Сколько времени займет на С# выполнение этого алгоритма сортировки массива?
- Профессионалы в IT, сколько примерно по времени и денегам вы учились прежде чем стать профи?
- За сколько времени можно выучить язык С# для создания игр ?
- Сколько в среднем времени понадобится, что бы стать джуном?
- Стоит ли учить c# 4.0 в наше время?или что то другое(предложите в коментарии)
- Как Вы думаете, какое или какие из представленных растений через некоторое время окажутся выброшенными и почему?
- Почему после восстановления обрыва связи скорость инета резко возрастает на некоторое время, больше чем установлена ?
- Чем объяснить, что печорин на некоторое время поверил в предопределение, как он испытывал судьбу (Герой нашего времени)
- Доброго времени суток. Вообщем такая ситуация. Познакомился с девушкой, полюбил ее. Через некоторое время узнал что она