Как сделать respawn в Unity конкретного объекта в его изначальной точке спустя время?

Мой проект похож на популярную игру hole.io, локация заполнена разными объектами, которые я Изначально расставляю на сцене (в будущем это будет, допустим, город). И мой персонаж, подобно черной дыре, эти объекты съедает: под землей стоит плоскость, при столкновении с которой объект деактивируется и игроку засчитываются очки, после чего он растет. Это я реализовал, но теперь встала, казалось бы, простая, но крайне непонятная задача: как сделать так, чтобы после съедения, объект появился на изначальной точке спустя время? Я сделал это так: в момент уничтожения (или деактивации) объект клонируется (под землей) и далее сверху появляется его копия. Код:

if (collision.gameObject.tag == "Plants")
{
    Yrot = Instantiate(collision.gameObject, collision.gameObject.transform.position, Quaternion.identity) as GameObject; //копируем объект
    Yrot.transform.position = new Vector3(collision.gameObject.transform.position.x, 1.25f, collision.gameObject.transform.position.z); //заставляем его появиться по Y выше, на земле
    // collision.gameObject.SetActive(false);  // деактивируем объект и его копию, чтобы потом активировать через время
}

Это фрагмент от проверки по тэгу. В результате этого кода: после уничтожения оригинального объекта, моментально появляется его копия НО(!!!) по тем координатам, где был уничтожен оригинал. Т.е. , пока, допустим, дерево падало сквозь черную дыру, оно могло изменить свои координаты от Начальных и далее копия дерева также заспавнится по ним же (новым). Мне нужна какая-то конкретная привязка, но привязывать каждый объект (коих более 200 на карте) не рационально. Была мысль по поводу того, чтобы спавнить объекты сразу же после уничтожения в состоянии деактивации, а спустя время их активировать, будто бы они только сейчас появились. Но не разобрался со счетчиками, пробовал через карутины. Как решается моя задача? По возможности подскажите кодом, ибо я только учусь, это моя первая игра. Спасибо!


Ответы (1 шт):

Автор решения: MASLOvFANTOM

Как я понял тебе надо заново респавнить объект в его точке, когда он первый раз загрузился. Но, ты дал мало данных, скажи как ты взаимодействуешь с деревом или домом например. И как ты их собрался респавнить.

У меня есть идея по этому поводу. В моём варианте, тебе надо не уничтожать съеденный игроком объект, а например, скрывать его (для новичка пойдёт думаю). Затем тебе стоит на каждый объект повесить скрипт(с классом конечно), где будет переменная Vector3 startPos и float timeDead. При старте, например в Awake или Start, ты в переменную startPos записываешь координаты объекта.

startPos = new Vector3(transform.position.x, transform.position.y, transform.position.z);

Затем тебе нужна функция Dead, она вызывается когда объект съеден. В ней, в переменную timeDead ты записываешь время со старта игры плюс время которое не будет появляться объект(для этого может быть отдельная переменная для удобства), то есть:

timeDead = Time.time + 5;

Где 5 это то самое время которое не будет появляться объект. И далее ты должен проверить, Time.time >= timeDead, если да(болше), то объект можно заново показать.

Вот пример функции смерти и проверки на разрешение на спавн(я пишу без IDE, так что сори если есть синтаксические ошибки):

public void Awake()
{
    // старт игры 
    startPos = new Vector3(transform.position.x, transform.position.y, transform.position.z);
}
public void Dead()
{
    // смерть
    timeDead = Time.time + 5f;
    gameObject.SetActive(false);
}
public void Update()
{
    if(Time.time >= timeDead)
    {
        // показать объект и переместить его в координаты startPos.
        gameObject.SetActive(true);
        transform.position = startPos;
    }
}

ну вроде всё сказал. Покавыряйся немного и получится шикарно. Если есть какие то вопросы - пожалуйста, спрашивай - я не мастер объяснять.

→ Ссылка