Создание объекта из скрипта

Программирование на Юнити.

Создание объекта из скрипта

Сообщение DiZZarK2 25 дек 2021, 22:05

Хочу получить ссылку и установку объекта (в данном случае меш) типа
Синтаксис:
Используется csharp
Instantiate(Object original, Vector3 position, Quaternion rotation)
полностью через скрипт без инспектора
следовательно необходимо указать путь расположения файла
Синтаксис:
Используется csharp
string prefPath = AssetDatabase.GetAssetPath(GO);
Debug.Log("Path1: " + prefPath);

этот самый путь мне возвращает нормально но теперь как его использовать для получения самого файла?

Вроде бы есть встроенный метод Resources.Load но согласно той же самой справки от юньки "Некоторые загруженные ресурсы, в первую очередь текстуры, могут использовать память, даже если в Сцене нет экземпляра." наталкивает на мысль что ресурсы в этой самой папке загружаются по умолчанию и +100500 всяко разного будут грузится независимо от их надобности (https://docs.unity3d.com/ScriptReference/Resources.html). Да к ней завезли чистильщик мусора но эт такое.

Как получить установку объекта без встроенного метода по известному пути (либо с указанием других параметров)?
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

Re: Создание объекта из скрипта

Сообщение waruiyume 25 дек 2021, 22:19

Если вы пишете для игры, а не для редактора, то забудьте всё что находится в пространстве имён UnityEditor, ничего оттуда в билд не попадает.
Помимо Resources есть ещё AssetBundle и Addressables.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Создание объекта из скрипта

Сообщение DiZZarK2 26 дек 2021, 00:56

waruiyume писал(а):Если вы пишете для игры, а не для редактора, то забудьте всё что находится в пространстве имён UnityEditor, ничего оттуда в билд не попадает.
Помимо Resources есть ещё AssetBundle и Addressables.

Оба ваших решения надстройка 20 версии я пробую развить 17 и ниже меньше глюков более шустрые. Уверен должны быть решения осуществить подгрузку силами C# без доп плагинов.
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

Re: Создание объекта из скрипта

Сообщение waruiyume 26 дек 2021, 01:16

Бандлы были в 5.x если не ещё раньше.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Создание объекта из скрипта

Сообщение DiZZarK2 26 дек 2021, 01:46

waruiyume писал(а):Бандлы были в 5.x если не ещё раньше.

Вы правы копнул поглубже повеяло ветром перемен пойду бурить дальше. Наткнулся на фразу типа "появилась новая функция" и не стал углубляться благодарю.
Система как я понял довольно обширная. Надо будет под разобраться но на 5ой она есть)))
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

Re: Создание объекта из скрипта

Сообщение Alkos26Rus 26 дек 2021, 12:16

Вроде бы есть встроенный метод Resources.Load но согласно той же самой справки от юньки "Некоторые загруженные ресурсы, в первую очередь текстуры, могут использовать память, даже если в Сцене нет экземпляра." наталкивает на мысль что ресурсы в этой самой папке загружаются по умолчанию и +100500 всяко разного будут грузится независимо от их надобности (https://docs.unity3d.com/ScriptReference/Resources.html). Да к ней завезли чистильщик мусора но эт такое.

Не будет он использовать ни какую память кроме памяти накопителя устройства. Закинул ты 100 текстур в ресурсы, вот размер сборки и будет включать все эти 100 текстур, но на сцене оперативная память будет чиста, пока ты не подтянешь нужный файл.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Создание объекта из скрипта

Сообщение DiZZarK2 26 дек 2021, 14:14

waruiyume писал(а):Если вы пишете для игры, а не для редактора, то забудьте всё что находится в пространстве имён UnityEditor, ничего оттуда в билд не попадает.
Помимо Resources есть ещё AssetBundle и Addressables.


так кароч покопал я подразобрался но осталась бага которая меня сильно напрягает. Согласно юнька справки по AssetBundle C# скрипты не уходят в бандл (очень хотелось) но при этом упаковка проходит только если я выкину все скрипты содержащие UnityEditor. И я бьюсь уже некоторое время что бы производить сборку с игнорированием скриптов но пока тщетно. Не могли бы подсобить с решением оглядываться на бандл и не использовать то что ему не нра не айс. Юнити мануал ваще не понятно для чего он практически все инфу копать надо на сторонних источниках. тут например https://russianblogs.com/article/3201965130/
AssetBundle решение очень интересное, отлично подходящее для тяжелых файлов, но есть и такой аспект как множество мелких, с малой детализацией к примеру, которые и нужны для скорости, а паковать их - потерять скорость при никаких плюсах по объему.

Alkos26Rus писал(а):Не будет он использовать ни какую память кроме памяти накопителя устройства. Закинул ты 100 текстур в ресурсы, вот размер сборки и будет включать все эти 100 текстур, но на сцене оперативная память будет чиста, пока ты не подтянешь нужный файл.


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

Но неужели нет решения подгрузить файл силами C#?
Последний раз редактировалось DiZZarK2 26 дек 2021, 14:29, всего редактировалось 1 раз.
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

Re: Создание объекта из скрипта

Сообщение Alkos26Rus 26 дек 2021, 14:27

DiZZarK2 писал(а):Логически это должно так работать а вот справка... Конечно надо поэкспериментировать и в любом случае мусорщика придется создать собственного... и если с объектами все довольно просто ушел со сцены полетел в топку то с матами и текстурами посложнее. Они могут использоваться несколькими объектами.


Все там нормально со справкой, если объект удален, то тектуры могут оставаться в памяти, для этого и нужен Resources.UnloadUnusedAssets и прие смене сцены тоже все очищается.
Некоторые загруженные ресурсы, в первую очередь текстуры, могут использовать память, даже если в Сцене нет экземпляра. Чтобы освободить эту память, когда актив больше не нужен, вы можете использовать Resources.UnloadUnusedAssets .


DiZZarK2 писал(а):Еще один момент который странно смотрится это не должно быть одинаковых названий файла (не то что бы я собирался плодить копии по разным папкам) но это намекает на то что независимо от того какую иерархию делать вложенности проекта рассматриваться это будет как единый пак что создает неудобства при использовании различной детализации к примеру. получается нет возможности разбить файлы по типам, сценам логически в общем.

Нет проблем, сделай папку Resources и в ней уже разделяй по типам или же создай папку Resources в каждой папке типа

DiZZarK2 писал(а):Но неужели нет решения подгрузить файл силами C#?

Resources.Load чем не силы C#?
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Создание объекта из скрипта

Сообщение DiZZarK2 26 дек 2021, 14:33

Alkos26Rus писал(а):сделай папку Resources и в ней уже разделяй по типам

этот вариант у меня не сработал т.е. все что находится в Resources вытаскивает без проблем а например Resources/Materials отказывается

Alkos26Rus писал(а):Resources.Load чем не силы C#?
наверно неправильно выразился имелось ввиду по собственной иерархии папок
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

Re: Создание объекта из скрипта

Сообщение Alkos26Rus 26 дек 2021, 14:44

DiZZarK2 писал(а):этот вариант у меня не сработал т.е. все что находится в Resources вытаскивает без проблем а например Resources/Materials отказывается

Не знаю, наверно что то делаешь не правильно, подгружаешь ресурсы по имени этого ресурса? Может есть одинаковые иимена, нпример материала и текстуры? Все что находится в папке Resources все включается в сборку, независимо от иерархии папок.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Создание объекта из скрипта

Сообщение DiZZarK2 26 дек 2021, 15:10

Alkos26Rus писал(а):Не знаю, наверно что то делаешь не правильно, подгружаешь ресурсы по имени этого ресурса? Может есть одинаковые иимена, нпример материала и текстуры? Все что находится в папке Resources все включается в сборку, независимо от иерархии папок.


Есть меш n1.fbx если он в папке Resurses извлекается ок.
вложил в подпапку тот же скрипт возвращает ошибку
ArgumentException: The Object you want to instantiate is null.
UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:239)
UnityEngine.Object.Instantiate (UnityEngine.Object original)
указал путь Resurses/folder извлекается ок
ладно сам виноват в справке читал поиск производится только по имени файла
поэкспериментировал отказывается извлекать при наличии другого файла с тем же именем но другого расширения. при указании расширения отказывается даже если имя уникально
работает ТОЛЬКО с уникальными именами отказывается принимать расширения необходимо указывать путь от папки Resurses.
В общем работать можно с учетом моментов выше но ... как то вечно через одно место
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

Re: Создание объекта из скрипта

Сообщение Alkos26Rus 26 дек 2021, 15:40

DiZZarK2 писал(а):Есть меш n1.fbx если он в папке Resurses извлекается ок.
вложил в подпапку тот же скрипт возвращает ошибку
ArgumentException: The Object you want to instantiate is null.
UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:239)
UnityEngine.Object.Instantiate (UnityEngine.Object original)
указал путь Resurses/folder извлекается ок
ладно сам виноват в справке читал поиск производится только по имени файла
поэкспериментировал отказывается извлекать при наличии другого файла с тем же именем но другого расширения. при указании расширения отказывается даже если имя уникально
работает ТОЛЬКО с уникальными именами отказывается принимать расширения необходимо указывать путь от папки Resurses.
В общем работать можно с учетом моментов выше но ... как то вечно через одно место


Естественно, ему побоку расширения. Если нужно подгрузить n1.fbx то используй имя "n1", без расширения. Естественно одинаковых имен не должно быть, при сборке он группирует содержимое всех папок Resources в одну библиотеку, поэтому происходит конфликт при совпадении имен, уж не знаю алгоритмов, вероятно подгружает первый попавшийся файл по имени, соответственно не факт что тип этого файла будет нужный.

PS ты же создаешь объект? Так подгружай префаб а не n1.fbx
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Создание объекта из скрипта

Сообщение DiZZarK2 26 дек 2021, 16:08

Alkos26Rus писал(а):PS ты же создаешь объект? Так подгружай префаб а не n1.fbx


префабы я пока не создавал. Вообще в планах все процедурно (меш, обертка-текстура, скрипт если понадобится). я знаю что в префабах есть фишка полностью подготовленного объекта с навешанными текстурами, скриптом, дочерними объектами и когда такой замаячит я создам. А вот к примеру если префаб чистый меш есть какой резон?
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

Re: Создание объекта из скрипта

Сообщение Alkos26Rus 26 дек 2021, 16:38

DiZZarK2 писал(а):А вот к примеру если префаб чистый меш есть какой резон?

Если меш создается на сцене, то впринципе без разницы. Я так не пробовал, обычно если и создаю обхекты на сцене то только префабы.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Создание объекта из скрипта

Сообщение DiZZarK2 26 дек 2021, 17:04

я счас глянул в проводнике по весу есть разница в 2,5 раза. 15кБ у fbx и 6кБ префаб. надо будет еще понаблюдать после окончательного утверждения меша. Возможно это просто откинуло материалы экспорта. Логически оригинал должен быть оптимальнее.
Кстати новые версии юньки обзавелись доп информацией по мешу а 20 еще и описанием используемых типов данных. Так если взять обычный кубик можно увидеть что у него 24 вершины при 12 поликов (при ожидаемых 8:6 при квадах или 8:12 трисов). Каждое ребро выходит юнька дублирует для (не помню где читал) оптимизации записи нормалей по каждой вершине. Видимо 3д пакеты эту инфу хранят дополнительно если вершина может принять только один вектор (либо используются матрицы). В общем здесь возможен какой-то оптимизационный подход и если с жесткими гранями это понятно, то почему такой же подход к сглаженным моделям где в принципе рассчитывается общий вектор по всем полигонам на вершине не ясно. ну и те же матрицы намного оптимальнее рассчитываются в общем я не понимаю.
Последний раз редактировалось DiZZarK2 26 дек 2021, 19:05, всего редактировалось 2 раз(а).
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11