динамическое создание префаба

Общие вопросы о Unity3D

динамическое создание префаба

Сообщение OlegF 19 окт 2011, 19:36

Хочется иметь возможность динамически создать GameObject, меш, материалы, повесить меш и материалы на GameObject и сохранить все это в префаб. Можно ли так сделать? Я делаю примерно вот так:
Синтаксис:
Используется csharp
                        Mesh new_mesh = new Mesh();
                         // делаем что-то с мешем
                         // так же создаем материалы
                               
                        GameObject new_object = new GameObject("go_name");
                        if ((MeshFilter)new_object.GetComponent("MeshFilter") == null)
                        {
                                new_object.AddComponent("MeshFilter");
                        }                              
                        MeshFilter mesh_filter;
                        mesh_filter = (MeshFilter)new_object.GetComponent("MeshFilter");
                        mesh_filter.mesh = new_mesh;
                       
                        AssetDatabase.CreateAsset(new_mesh, "Assets/_test/" + new_mesh.name + ".asset");
                               
                        Object prefab = EditorUtility.CreateEmptyPrefab("Assets/_test/" + new_object.name + ".prefab");
                        EditorUtility.ReplacePrefab(new_object, prefab, ReplacePrefabOptions.ConnectToPrefab);
 

GameObject сохраняется, меш остается пустым. Как сделать правильно?
OlegF
UNец
 
Сообщения: 34
Зарегистрирован: 19 фев 2011, 17:23

Re: динамическое создание префаба

Сообщение Neyl 19 окт 2011, 21:05

Все правильно делаете. Разве что, поскольку при сохранении меша вы используете его имя, надо его задать.
Синтаксис:
Используется csharp
Mesh new_mesh = new Mesh();
new_mesh.name = "MyNewMesh";
// делаем что-то с мешем
Аватара пользователя
Neyl
UNIверсал
 
Сообщения: 404
Зарегистрирован: 20 июн 2010, 10:17

Re: динамическое создание префаба

Сообщение forsake 20 окт 2011, 16:06

Синтаксис:
Используется csharp
MeshFilter mesh_filter = new_object.GetComponent<MeshFilter>() ;
if (mesh_filter  == null)
{
          mesh_filter = new_object.AddComponent<MeshFilter>();
}                              
mesh_filter.mesh = new_mesh;


так наверное будет лучше
forsake
UNец
 
Сообщения: 8
Зарегистрирован: 10 фев 2011, 13:31

Re: динамическое создание префаба

Сообщение burlak 20 окт 2011, 17:59

Возможно, стоит после сохранения меша загрузить сохраненный и просвоить его в фильтр до сохранения префаба.
С уважением, Дмитрий Бурлаков.
skype: dmitry.burlakov
email: _dmitry.burlakov@gmail.com
Аватара пользователя
burlak
UNITрон
 
Сообщения: 326
Зарегистрирован: 28 янв 2010, 10:21
Откуда: Санкт-Петербург

Re: динамическое создание префаба

Сообщение OlegF 20 окт 2011, 18:39

так наверное будет лучше

Так конечно лучше, я просто код из какого-то примера скопипастил )

Все правильно делаете

Все вроде и правда получилось, я там с материалами слегка напутал, поэтому меш не рисовался.
Однако теперь еще хотелось бы сделать это чуть покрасивее. Сейчас меш создается отдельно как .asset и лежит в папке Assets/_test вместе с материалами и файлом префаба (.prefab). Можно ли этот меш как-то засунуть внутрь файла префаба? Я посмотрел несколько пакаджей в ассет сторе, там вроде везде именно так сделано.
OlegF
UNец
 
Сообщения: 34
Зарегистрирован: 19 фев 2011, 17:23

Re: динамическое создание префаба

Сообщение Neyl 20 окт 2011, 19:43

Должно работать
Синтаксис:
Используется csharp
//AssetDatabase.CreateAsset(new_mesh, "Assets/_test/" + new_mesh.name + ".asset");

        Object prefab = EditorUtility.CreateEmptyPrefab("Assets/_test/" + new_object.name + ".prefab");
        EditorUtility.ReplacePrefab(new_object, prefab, ReplacePrefabOptions.ConnectToPrefab);
        //Так к префабу добавляется меш
        AssetDatabase.AddObjectToAsset(new_mesh, prefab );
        AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(prefab));
Аватара пользователя
Neyl
UNIверсал
 
Сообщения: 404
Зарегистрирован: 20 июн 2010, 10:17

Re: динамическое создание префаба

Сообщение OlegF 21 окт 2011, 12:01

Работает, спасибо!
OlegF
UNец
 
Сообщения: 34
Зарегистрирован: 19 фев 2011, 17:23

Re: динамическое создание префаба

Сообщение OlegF 21 окт 2011, 14:57

Еще один маленький вопрос по теме. При экспорте я создаю папку вот так:
Синтаксис:
Используется csharp
string folder_guid = AssetDatabase.CreateFolder("Assets", folder_name_);

Все хорошо, однако если вызывать эту функцию повторно, то будут создаваться папки с именами folder_name_ + номер, что не критично, но не очень красиво. В мануале по AssetDatabase вроде нет никаких функций, которые позволяют проверить, существует ли уже папка с данным именем. Можно ли как-то избежать создания новых папок на каждый вызов?
OlegF
UNец
 
Сообщения: 34
Зарегистрирован: 19 фев 2011, 17:23

Re: динамическое создание префаба

Сообщение DbIMok 21 окт 2011, 15:11

правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: динамическое создание префаба

Сообщение OlegF 21 окт 2011, 15:55

Ну пока так и приходится проверять, но я думал, может есть какой-то переносимый способ.
OlegF
UNец
 
Сообщения: 34
Зарегистрирован: 19 фев 2011, 17:23

Re: динамическое создание префаба

Сообщение gnoblin 21 окт 2011, 16:06

а чем метод по ссылке не переносимый?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: динамическое создание префаба

Сообщение OlegF 21 окт 2011, 19:53

а чем метод по ссылке не переносимый?

Ну так MS вроде как.
OlegF
UNец
 
Сообщения: 34
Зарегистрирован: 19 фев 2011, 17:23


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 13