Можно ли спавнить разные объекты через Instantiate?

Есть два префаба, можно ли сделать так, чтобы они создавались с помощью одной функции?


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

Автор решения: Максим Фисман

Не совсем понятна цель: почему так важно создавать два объекта в одной функции? Вообще, функция Instantiate имеет всего 5 перегрузок (подробнее почитайте по ссылке):

  1. Создание объекта
  2. Создание объекта с родителем
  3. Создание объекта с родителем и булевским параметром instantiateInWorldSpace
  4. Создание компонента в указанной позиции и с указанным вращением
  5. Создание объекта с родителем в указанной позиции и с указанным вращением.

Как видите, ни одна из перегрузок метода Instantiate() не принимает двух параметров типа GameObject, что говорит о том, что вы не можете создать одной командой сразу 2 объекта. Поэтому все, что я могу вам предложить это вызвать функцию Instantiate дважды одна за одной. Это лучший вариант и ничего проще нет

→ Ссылка
Автор решения: Арман

Нет, нельзя.

Собственно вот все перегрузки функции Instantiate:

  • public static Object Instantiate(Object original);
    
  • public static Object Instantiate(Object original, Transform parent);
    
  • public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace);
    
  • public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
    
  • public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);
    

Как видите тут все перегрузки принимают и возвращают одно значение. Соответственно просто так это не делать.


Тогда какие варианты есть?

Можете сделать собственную перегрузку Instantiate, поскольку уже в Unity 2019.-.- можно изменить заводские скрипты. Но этот вариант имеет свои минусы: при обновлении Unity с огромной вероятностью восстановится изначальный скрипт (то есть ваша перегрузка исчезнет).


Самый надёжный способ

Почему не использовать эту функцию дважды? Или же если объектов много, почему не использовать цикличное создание:

[SerializedField] private GameObject[] _JustAnObjectsArray;

private void Start()
{
    foreach(GameObject _Object in _JustAnObjectsArray)
    {
        Instantiate(_Object);
    }
}
→ Ссылка
Автор решения: Роман Копылов

Можно сделать свой метод, принимающий список объектов. В цикле метода инстанциируем все объекты из списка

→ Ссылка