Добавьте общедоступное поле public GameObject myPrefab;
к своему монобихевому поведению.
Установите его в редакторе, выбрав игровой объект и используя инспектор.
Создайте его как Instantiate(myPrefab, transform.position, Quaternion.identity);
. Вам нужны только ресурсы. Загрузка, если ваш ресурс не существует во время компиляции. И, как сказано в документации, ресурсу.Load нужно, чтобы ресурс был в папке Resources
.
https://docs.unity3d.com/ScriptReference/Resources.Load.html
На самом деле это не относится к универсальным шаблонам, а относится к типам.
Легко представить себе, что ArrayList
представляет собой List
], но List
не обязательно является ArrayList
.
ArrayList
реализует интерфейс List
, поэтому его можно рассматривать как ] Список
. Однако только потому, что что-то реализует List
, это не ArrayList
. Например, LinkedList
реализует List
, но не является ArrayList
.
Например, разрешено следующее:
List arrayList = new ArrayList();
List linkedList = new LinkedList();
Это потому, что оба ArrayList
и LinkedList
реализуют интерфейс List
, поэтому оба они могут обрабатываться как List
s.
Однако следующее не допускается:
ArrayList arrayList = new LinkedList();
Хотя оба ArrayList
и LinkedList
реализуют List
, они не являются одним и тем же классом. Они могут иметь сходство, реализуя методы из List
, но это полностью отдельные классы.
Тип возврата может быть ArrayList, но также не может быть ArrayList , это может быть LinkedList, оболочка списка коллекций или что-то еще. Чтобы присвоить его переменной, вы должны либо использовать тип самого высокого уровня, которым он может быть (в данном случае List), либо понижающий, если вы знаете, что должен быть ArrayList.
На практике переменные почти всегда следует вводить как Список (если не Коллекция). Практически никогда не бывает веских причин для ссылки на конкретный тип для этих классов.
Когда вы указываете возвращаемый тип List, вы говорите, что возвращение может быть любым типом List, будь то ArrayList, LinkedList или другой тип. списка. Если вы пытаетесь вернуть ArrayList, вы слишком конкретны - это уже не общий список.
Поскольку ArrayList является подклассом List, поэтому не гарантируется, что список, возвращаемый процессом, будет ArrayList. Например, это может быть LinkedList.
Вы можете объявить возвращаемый тип ArrayList
, но для этого потребуется явное приведение, например:
ArrayList output = null;
output = (ArrayList)process(input);
... что противоречит тому, что позволяют генерики.
Метод process
не сможет решить, какую конкретную реализацию List выбрать. Его подпись дает вам обещание, что он сможет работать с ЛЮБЫМ списком (ArrayList, LinkedList и т.д.) и может только указать, что возвращаемое значение будет НЕКОТОРЫМ списком.
Например, если возвращенный объект является LinkedList, вы не можете назначить его напрямую переменной, объявленной как ArrayList, но вы можете рассматривать его как List. Следовательно, А. и Д. неверны. Вы не можете объявить свою переменную как ArrayList.
Это потому, что вопрос явно говорит, что метод возвращает List
Другой способ взглянуть на это - «совместимость назначений». Семантически вызов метода
output = process(input)
эквивалентен
nums = input;
/* body of process... */
output = returnVal; /* where process exits with "return returnVal" */
. Мы знаем, что nums
имеет тип List
, поэтому тип input
должен быть "назначаемый" в Список
. Аналогичным образом, мы знаем, что returnVal
(т.е. возвращаемое значение процесса
) типа List
, поэтому List
должен быть «назначен» типу выхода
.
В общем, тип T
«присваивается» типу U
, если T
является подтипом U
(включая случай, когда T
и U
одинаковы).
Следовательно, тип входа
должен быть Список
или подтип List
(например, ArrayList
или LinkedList
). Точно так же тип вывода
должен быть List
или супертип из List
(например, Коллекция
или даже Объект
).