Страница 1 из 1

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

СообщениеДобавлено: 19 окт 2011, 19:36
OlegF
Хочется иметь возможность динамически создать 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 сохраняется, меш остается пустым. Как сделать правильно?

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

СообщениеДобавлено: 19 окт 2011, 21:05
Neyl
Все правильно делаете. Разве что, поскольку при сохранении меша вы используете его имя, надо его задать.
Синтаксис:
Используется csharp
Mesh new_mesh = new Mesh();
new_mesh.name = "MyNewMesh";
// делаем что-то с мешем

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

СообщениеДобавлено: 20 окт 2011, 16:06
forsake
Синтаксис:
Используется csharp
MeshFilter mesh_filter = new_object.GetComponent<MeshFilter>() ;
if (mesh_filter  == null)
{
          mesh_filter = new_object.AddComponent<MeshFilter>();
}                              
mesh_filter.mesh = new_mesh;


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

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

СообщениеДобавлено: 20 окт 2011, 17:59
burlak
Возможно, стоит после сохранения меша загрузить сохраненный и просвоить его в фильтр до сохранения префаба.

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

СообщениеДобавлено: 20 окт 2011, 18:39
OlegF
так наверное будет лучше

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

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

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

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

СообщениеДобавлено: 20 окт 2011, 19:43
Neyl
Должно работать
Синтаксис:
Используется 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));

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

СообщениеДобавлено: 21 окт 2011, 12:01
OlegF
Работает, спасибо!

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

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

Все хорошо, однако если вызывать эту функцию повторно, то будут создаваться папки с именами folder_name_ + номер, что не критично, но не очень красиво. В мануале по AssetDatabase вроде нет никаких функций, которые позволяют проверить, существует ли уже папка с данным именем. Можно ли как-то избежать создания новых папок на каждый вызов?

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

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

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

СообщениеДобавлено: 21 окт 2011, 15:55
OlegF
Ну пока так и приходится проверять, но я думал, может есть какой-то переносимый способ.

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

СообщениеДобавлено: 21 окт 2011, 16:06
gnoblin
а чем метод по ссылке не переносимый?

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

СообщениеДобавлено: 21 окт 2011, 19:53
OlegF
а чем метод по ссылке не переносимый?

Ну так MS вроде как.