Unity и публикация для Flash-плеера

Экспорт из Unity во FlashЯ не спешу переходить на Unity 4. Причиной тому служит полученная по акции прошлой весной лицензия на Unity 3.5 с возможностью публикации под Android и iOS, а также превью-версия экспорта во Flash. Думаю, нет необходимости рассказывать, зачем нужно игру на Unity публиковать под Flash-плеер. Все мы знаем о существовании просто немыслимого количества порталов с бесплатными Flash-играми. Грех не воспользоваться такой широкой сетью для дистрибуции своей игры.

Но, к сожалению, при попытке публикации во Flash из Unity часто вылезают совершенно неожиданные ошибки. Здесь я опишу некоторые из них, а также способы их устранения.

Хочу обратить ваше внимание, что разработку я веду на C#, поэтому все примеры будут именно на нем.

Ошибка №1

При экспорте из Unity во Flash не работает упрощенный синтаксис доступа к объекту следующего вида:

// Не экспортируется во Flash следующая строка кода
// gameObject.GetComponent<BoxCollider>().enabled = false;

// Вместо нее нужно использовать следующую конструкцию:
BoxCollider BC = gameObject.GetComponent<BoxCollider>();
BC.enabled = false;


Это относится к любым компонентам. Просто в примере я использовал BoxCollider. Сначала нужно присвоить ссылку на компонент какой-либо переменной, а потом уже обращаться к свойствам и методам полученного объекта через эту переменную.

Ошибка №2

При экспорте из Unity во Flash не работают делегаты C#. Иными словами, нельзя передавать ссылки на методы. Об этом, в принципе, написано в FAQ на официальном сайте Unity3D, но до этого FAQа еще нужно докопаться :)

// NOTE: Это не работает при экспорте во Flash!
//delegate void ProcessObject(GameObject GO);

public void UseDelegate(bool visibility)
{
    // NOTE: Это не работает при экспорте во Flash!
    //ProcessObject objHide = ObjectHideMethod;
    //ProcessObject objShow = ObjectShowMethod;

    //SomeProcess( !visibility ? objHide : objShow );
    SomeProcess( visibility );
}

//private void SomeProcess(ProcessObject objectHandler)
private void SomeProcess(bool visibility)
{
    // Чтобы исправить использование делегата, комментируем строку ниже...
    //objectHandler(gameObject);

    // ...и заменяем на проверку условия и вызов соответствующего метода
    // по результатам проверки
    if(!visibility)
        ObjectHideMethod(gameObject);
    else
        ObjectShowMethod(gameObject);

}


В общем, при создании игры на Unity с возможностью публикации под Flash-плеер нужно расстаться с таким удобным инструментом языка C#, как делегаты. Но, благо, можно как-то обойтись и без них.

Ошибка №3

Не конвертируется из Unity во Flash конструкция, предназначенная для получения значения текущего выбранного элемента перечисления Enum. Пример ниже:

public enum SlotEnterSide {
    LEFT=0, TOP=1, RIGHT=2, BOTTOM=3
};

public class MyBlockSlot:ScriptableObject {

    public SlotEnterSide side;

    public string Serialize()
    {
        // NOTE: Строка ниже не конвертируется из Unity во Flash!
        string data = Convert.ChangeType(side, side.GetTypeCode()).ToString();
        return data;
    }
}


Как видно из примера, я получаю строковое значение текущего выбранного элемента списка Enum SlotEnterSide. Использовать списки очень удобно, ведь в редакторе свойств объекта Unity так приятно выбирать понятные значения из списка, вместо ввода непонятных циферок вручную. Но, видимо, если вы планируете публиковать игру во Flash, то с этой возможностью придется распрощаться :(

Но пока я не пробовал обойти эту проблему. Возможно, есть какое-то решение. Если я его найду, то исправлю пост, так что следите за обновлениями!

Ошибка №4

При экспорте из Unity во Flash нельзя использовать тип uint. Конвертер превращает uint в какую-то жуткую конструкцию на ActionScript с использованием неизвестного типа, который, видимо, разработчики Unity просто забыли добавить (что-то вроде UInt32). Просто заменяем все uint на обычный int. Даже не знаю, зачем мне понадобился этот uint?

Ошибка №5

У меня при экспорте из Unity во Flash не заработал стандартный метод C# по копированию массивов:

int[] AllChildren = new int[parent.Children.Count];
parent.Children.CopyTo(AllChildren);

Здесь я просто создаю копию массива parent.Children. При билдинге под Flash-платформу компилятор на этом месте выдал ошибку. Попробую заменить метод CopyTo на ручное поэлементное копирование в цикле. Должно сработать.

Ошибка №6

Нельзя использовать вызов исключений Unity:

throw new UnityException("ERROR - Some exception!");


Также хочу отметить, что неудобство заключается в том, что компилятор выдает ошибки с указанием на файлы ActionScript. Приходится открывать их в сторонней среде разработки (я использую FlashDevelop) и вручную искать строку с ошибкой. После этого найденную строку в ActionScript нужно сопоставить со своим C# кодом, чтобы понять, где же в исходниках кроется ошибка.

PS.: По мере написания игры могут всплыть еще какие-то ошибки. Тогда я дополню этот пост. Надеюсь, кому-то это пригодится!
  • 0
  • 02 января 2013, 13:47
  • dimanjy

Комментарии (1)

RSS свернуть / развернуть
+
0
Делегаты во флеше работают, но нельзя получить список, чтобы пройтись по каждому… только-что проверили… переделываем механизм подписки-отписки просто…

Создайте пустой проект в Юнити и постепенно начните внедрять делегаты. Почти полностью функционал делегатов нормально флешом, за исключением например мультикастов.
avatar

iLyxa

  • 29 апреля 2013, 19:05

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.