Как создать экземпляр GameObject из префаба с помощью Resources.Load? - PullRequest
0 голосов
/ 12 января 2019

Я получаю ошибку NullReferenceException при попытке создать экземпляр GameObject следующим образом:

Side1_Slots.sGameObject[i] = Instantiate(Resources.Load<GameObject>(Side1_Slots.SlotAlliedPrefab), 
            Side1_Slots.SlotPosition[i], Quaternion.identity, UIContainer.transform);

Использование этого перегруженного метода для Instantiate:

Instantiate(GameObject Original, Vector3 position, Quaternion rotation, Transform parent);

Где:

Side1_Slots.SlotAlliedPrefab = "Prefabs/Battle/SlotAlliedPrefab";

Я пробовал следующие структуры папок проекта:

// Leads to NullReferenceException error
Resources/Prefabs/Battle/SlotAlliedPrefab

и

//Leads to "Object you want to instantiate is null"
Prefabs/Battle/SlotAlliedPrefab

Какой из них, кстати, правильный? Google показывает оба пути, поэтому я не уверен ...

1 Ответ

0 голосов
/ 12 января 2019

Вам не нужно Resources в путях к ресурсам. Prefabs/Battle/SlotAlliedPrefab должен выполнить работу при условии, что это правильный путь к активу. Во-первых, дважды проверьте ваши пути. Затем используйте нестандартный Resources.Load() для загрузки ресурса, затем проверьте его тип (желательно с отладчиком, используйте VSTS, если вы этого еще не сделали). Вы можете не иметь правильный тип актива по этому пути. Если Resources.Load() возвращает ноль, возможно, вы выбрали неверный путь, возможно, опечатка.


РЕДАКТИРОВАТЬ: Вы должны хранить свои активы в папке ресурсов. Но путь, который вы передадите к Resources.Load, будет относительно корня ближайшей папки Resources. Например, если у вас есть актив по адресу:

Assets\MyGame\Models\Resources\Category1\SomeModel

Вы загрузите его так:

Resources.Load("Category1\SomeModel")

Это означает, что вы можете получить неопределенное поведение, если у вас есть разные ресурсы с одинаковым именем в разных папках ресурсов. Это работает только для ресурсов внутри папок ресурсов, так как они обрабатываются по-разному во время сборки и упаковки.

Насчет неуниверсального Load, я имею в виду, вы должны сделать это так:

var myResource = Resources.Load("SomePath");
var myGameObject = myResource as GameObject;

Таким образом, вы можете пройтись по своему коду и посмотреть, что внутри myResource. Это делается для того, чтобы убедиться, что вы проходите правильный путь. Если myResource не равно нулю, вы можете увидеть, что это за актив. Возможно, вы загружаете аудиоклип вместо префаба, который вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...