Войти
UnityФорумПрограммирование

Помогите со спавном объекта (C#)

#0
11:52, 24 фев. 2021

Доброго времени суток.
Я совсем новичок в программировании, поэтому нужна помощь...
C#
Unity 3D
Мне нужно сделать спавн одного объекта в заранее подготовленных точках. Это должно происходить при триггере OnTriggerEnter().
Нужно, чтобы объект не спавнился на новом месте, пока не будет уничтожена его копия.
То-есть на сцене не более одной копии этого объекта одновременно.

Я пыталась написать скрипт, который успехом не увенчался и спавнил объект в рандомной точке, чаще за игровым полем или вообще в коллайдерах других объектов на сцене.

Объясните, пожалуйста, как это можно сделать: Только прошу, не "Ну, ты можешь сделать через вот это, используя вот это"
А максимально подробно, как и что должно быть...
Можете не писать весь скрипт, главное объясните, напишите даже, возможно, ту часть кода, которая отвечает за проверку (если ли объект на сцене) и если объекта нет, то рандомно выбирает точку спавна из списка и отправляет объект туда. И так до тех пор, пора игра не закончится.

Я могу объяснить на словах, то что мне нужно от кода, но вот написать это в скрипте та ещё проблема...

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

Спасибо всем, кто откликнется в комментариях или в личных сообщениях :З


#1
(Правка: 13:14) 13:14, 24 фев. 2021

https://docs.unity3d.com/Manual/InstantiatingPrefabs.html
смотри пример там Vecto3(0,0,0) это координата его респавна
ну а насчет того что бы 1 копия была
ну есть у тя главный скрипт вот там и держи указатель на обьект
если указательь null создаешь (при старте он должен null )

#2
(Правка: 17:09) 13:55, 24 фев. 2021

Привет, самое просто что с ходу приходит в голову, это сделать метод, который будет спавнить первый объект по триггеру и хранить его ссылку, а в последствие этот метод будет выполняться подписываться на ивент, который вызывается при смерти. Что касается точек спавна, то создай массив, который будет хранить эти точки, а из него будешь брать случайную.

Вот как это может выглядеть:

[SerializeField] private GameObject _objectPrefab; // Префаб объекта, который нужно заспавнить.
[SerializeField] private Vector3[] _spawnPointObject; // Значения укажешь в инспекторе, столько сколько нужно.

private GameObject _objectClon = null;

public void SpawnObject() //Спавн объекта
{
  _objectClon = Instantiate(_objectPrefab, _spawnPointObject[Random.Range(0, _spawnPointObject.Length)], Quaternion.identity)
}

private void OnTriggerEnter(Collider collision) // Этот метод сработает на триггер и заспавнит объект если его нет.
{
  if (_objectClon != null)
    return;
  SpawnObject();
}

Класс даже сейчас выглядит перегруженным, я бы разделил его, и спавнил объекты в другом классе.
В теории это должно работать, и написал максимально просто, может только что не очень подробно... Будут вопросы пиши, тут я не часто бываю, так что можешь писать в телеграмме. @Astar0th9

#3
4:47, 25 фев. 2021

Astar0th
Огромное спасибо, о, мой великий спаситель!

UnityФорумПрограммирование