Wrapper MeshSerializer2 для редактора и проблема с yield

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

Wrapper MeshSerializer2 для редактора и проблема с yield

Сообщение JediPafka 18 окт 2010, 04:01

Написал тут обёртку для скрипта MeshSerializer2, чтобы можно было экспортировать/импортировать меши прямо в Редакторе. Собственно экспорт работает нормально как и ожидалось. А вот с импортом я что-то не подружился. Функция импорта меша на сцену должна открывать окно выбора файла, но при наличии yield внутри этого не делает и, по всей видимости, вообще не запускается. Проверял вставленным Debug.Log() в начало проблемной функции - вообще не выводится. Без yield имортируется иногда. Это уж если www успеет полностью загрузиться.

Собственно вопрос. Где напортачил в фунции импорта? Потомучто yield там должен быть по смыслу, а без него вроде никак. Или это какое-то ограничение есть на такие примочки к редактору Unity?

Использую Unity 3.0.0f5 (51258) бесплатную

Синтаксис:
Используется javascript
#pragma strict
#pragma implicit
#pragma downcast

/**
 * Класс описывает методы для экспорта и импорта объектов.
 * Экспорт объектов (мешей) в специальный формат с сохранением файла на носитель.
 * TODO Импорт меша из файла на носителе и преобразование в объект на сцене.
 *
 * Для работы скрипта требуется наличие MeshSerializer2 в проекте
 * @see http://www.unifycommunity.com/wiki/inde ... erializer2
*
 * @version 1.0
 */


class SerializeObject extends ScriptableObject {

    /**
     * Валидатор. Если возвращает false, то меню скрипта будет неактивным
     */

    @MenuItem("GameObject/Export/Serialized Mesh (.sm)", true)
    static function ValidateDoExport() : boolean {
        var t : Transform = Selection.activeTransform;
        if ( t && t.GetComponent(MeshFilter) )
            return true;
        else
            return false;
    }


    /**
     * Экспортирует выбранный в Редакторе объект в файл с сериализованными данными.
     * Необходимо чтобы у объекта был компонент MeshFilter
     */

    @MenuItem("GameObject/Export/Serialized Mesh (.sm) %e")
    static function DoExport() {
        var saveTangents = false;
        //var t : Transform = Selection.gameObjects[0];
        var t : Transform = Selection.activeTransform;
        var meshName : String = t.name;
        var mesh : Mesh = (t.GetComponent(MeshFilter) as MeshFilter).sharedMesh;
        var path : String = EditorUtility.SaveFilePanel("Export .sm file", "", meshName, "sm");
        if (path.Length == 0) {
            print("Mesh saving canceled");
            return;
        }
        MeshSerializer.WriteMeshToFileForWeb (mesh, path, saveTangents);
        print("Saved " + meshName + " mesh to " + path );
    }


    /**
     * TODO Need help!
     */

    @MenuItem("GameObject/Import/Serialized Mesh (.sm) %i")
    static function DoImport() {
        var path : String = EditorUtility.OpenFilePanel("Import .sm file to scene", "", "sm");
        if (path.Length == 0) {
            Debug.Log("Open file canceled");
            return;
        }  
        Debug.Log("Loading mesh from " + path);

        var www : WWW = new WWW("file:///" + path);

        //Без yield загружает меши через раз, успел/не успел
        //yield www; //Если раскомментить то скрипт вообще не запускается

        var mesh : Mesh = MeshSerializer.ReadMeshFromWWW( www );
        if (!mesh ) {
            Debug.Log("Failed to load mesh");
            return;
        }
        Debug.Log("Mesh loaded");
        var go : GameObject = new GameObject( "Imported Object" );
        go.AddComponent(MeshFilter);
        go.AddComponent(MeshRenderer);
        (go.GetComponent(MeshFilter) as MeshFilter).mesh = mesh;
    }
}
 
Аватара пользователя
JediPafka
UNец
 
Сообщения: 19
Зарегистрирован: 01 окт 2010, 05:12
Откуда: Владивосток, Россия
  • Сайт

Re: Wrapper MeshSerializer2 для редактора и проблема с yield

Сообщение Neodrop 18 окт 2010, 11:35

Всё просто : yield внутри Editor - кода не работает.
Нужно придумывать обходной вариант.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Wrapper MeshSerializer2 для редактора и проблема с yield

Сообщение mp3 18 окт 2010, 16:09

К примеру старьім, добрьім, способом.

Код: Выделить всё
var www : WWW = new WWW("file:///" + path);
      
      var loopCount = 100;
      for (var i = 1; i <= loopCount; i++)
      
        var mesh : Mesh = MeshSerializer.ReadMeshFromWWW( www );
        if (!mesh ) {
            Debug.Log("Failed to load mesh");
            return;
        }
Be straight, or go forward.
Аватара пользователя
mp3
Адепт
 
Сообщения: 1071
Зарегистрирован: 21 окт 2009, 23:50

Re: Wrapper MeshSerializer2 для редактора и проблема с yield

Сообщение Neodrop 18 окт 2010, 19:04

Не, это не изящное решение. Которое, к тому же, зафризит весь Редактор. И, сотни итераций, вполне может не хватить.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Wrapper MeshSerializer2 для редактора и проблема с yield

Сообщение mp3 18 окт 2010, 19:49

Согласен. Это не решения. Но если лень искать что нибудь сложнее, может сгодится. К тому же количество итераций, можно вывести в переменную в том-же едиторе. С теперешними вычислительными способностями данное действие будет выполнятся не более 5 мс.
Be straight, or go forward.
Аватара пользователя
mp3
Адепт
 
Сообщения: 1071
Зарегистрирован: 21 окт 2009, 23:50

Re: Wrapper MeshSerializer2 для редактора и проблема с yield

Сообщение Neodrop 18 окт 2010, 20:28

Если уж выводить "куда нибудь в Editor" то проще загрузку вынести в OnInspectorGUI или в аналогичный GUI метод.
В некоторых Editor скриптах это можно сделать в Update.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Wrapper MeshSerializer2 для редактора и проблема с yield

Сообщение JediPafka 19 окт 2010, 04:51

Поставил вместо инструкции yield:
Код: Выделить всё
while (!www.isDone) {
    //Не идеальная пауза, однако пока работает.
}

:ymsmug: Есть вероятность, что зациклится, но думаю она почти нулевая.
Аватара пользователя
JediPafka
UNец
 
Сообщения: 19
Зарегистрирован: 01 окт 2010, 05:12
Откуда: Владивосток, Россия
  • Сайт


Вернуться в Editor

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

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