spiiin: (2D)
Если Unity использовать для игр под мобильные платформы - писать плагины нужно. Потому что есть много полезных 3rd-party библиотек (для кросс-промо, виртуальной экономики, ачивментов/лидербордов, систем покупок, показа рекламы и т.д. и т.п., без чего современных мобильных игр уже почти не бывает), и фич самих платформ, которые не реализованы в движке. А официальная документация какая-то слишком скудная.

на примере плагинов под iphone:
http://docs.unity3d.com/Documentation/Manual/PluginsForIOS.html
Всё что есть - можно положить исходные файлы и статические библиотеки в папку Plugins/iOS, и они скопируются в проект. И всё! :(
- Не поддерживается копирование папок, так что нужно сваливать всё возможное в корневую папку. Если внутри фреймворка есть подпапки - работать он уже не будет.
- Невозможно встроиться в генерируемые стандартные файлы-обертки для ios приложения, если требуется реакция на какие-нибудь стандартные системные сообщения (это пофиксилось - если в Plugins/iOS положить файл с тем же именем, что и генерируемый автоматически в Classes, то он заменит стандартный).
- Невозможно изменить настройки проекта, чтобы добавить флаги компилятору или линкеру. А часто бывает нужно что-то подправить, добавить -all_load, например, чтобы обойти баг при загрузке .a файла, внутри которого есть смешанный сишно-объектносишный код.

Так что этот способ практически бесполезен - надо или хранить отдельно доправленный после генерации проект или запускать отдельно после генерации свою систему обработки напильником. Но запускать её каждый раз руками не труъ, можно врубиться в пайплайн построения игры. Если в папке Assets/Editor лежит файл PostprocessBuildPlayer, то он будет выполнен. В примере пустой перловский скрипт. В него надо вписать свой код модификации проекта.
Получить путь к проекту из скрипта можно так (на python'е):
projectPath = sys.argv[1]
projectFile = projectPath + '/Unity-iPhone.xcodeproj/project.pbxproj'



Небольшой хинт -  если есть купленные плагины от плагинописателей из prime31, можно найти их скомпиленный скрипт (тоже на python'е), и с помощью декомпилятора uncompile немного подсмотреть реализацию полезного для работы с проектом класса XcodeProject.
Tags:
spiiin: (Default)
1. Смешивание языков.
Objective-C код совместим с сишным кодом, но не всегда совместим с С++. Также существует язык Objective-C++, который позволяет более-менее свободно смешивать C++/Objective-C код. Компилятор gcc по умолчанию считает файлы с расширением .m содержащими код на Objective-C, а файлы с расширением .mm - код на языка Objictive-C++, но ему можно явно указать язык с помощью ключа -x

В универсальных заголовочных файлах определить, в какой язык включается файл, можно, проверяя наличие макросимволов __OBJC__ или __cplusplus.

Чтобы вызывать Objective-C код из языка С++, удобнее всего сделать обычный С++-класс-обертку, содержащий членом указатель на класс Objective-C, так как наследование от него невозможно. Если возможности создать класс нет (Objective-C, в отличие от Objective-C++, не дает возможности создавать C++-классы), то проще всего заворачивать вызовы в глобальные функции, и звать их из С++. При этом такие функции, как и обычные сишные, в С++ коде надо объявлять в блоке extern "C", так как компилятор манглит их имена по правилам языка си.

Проще это всё показать примером:
 //h-файл (общий заголовок)
 class ObjClassWrapper
 {
   ObjClass * objClass1;
   ObjClassWrapper(); { [[objClass1 alloc] init]; }
   ~ObjClassWrapper(); { [objClass1 dealloc]; }
   void method1(); { [objClass1 method1]; }
 };
 
 //mm-файл (язык Objective-C++)
 @interface ObjClass
 @end
 
 @implementation ObjClass
 -(void) method1
 {
   NSLog("Method1");
 }
 @end
 
 ObjClassWrapper::ObjClassWrapper() { [[objClass1 alloc] init]; }
 ObjClassWrapper::~ObjClassWrapper() { [objClass1 dealloc]; }
 void ObjClassWrapper::method1(); { [objClass1 method1]; }
 
 //m-файл (язык Objective-C)
 @implementation StaticObjClass
 +(void) method2
 {
   NSLog("Method2");
 }
 @end
 
 void method2() { [StaticObjClassObjClass method2]; }
 
 //c++-файл
 #include <universalHeader.h>   //объявляем класс-обертку
 extern "C" { void method2(); } //объявляем метод-обертку
 
 ObjClassWrapper w; w.method1();  //зовем код на Objective-C
 method2();
 

Про смешивание языков и вызов кода на С++ из языка Objective-C есть статья http://touchdev.ru/documents/963

2. True/Yes
Всегда интересно (раз два три), нафига разные ключевые слова? Главное, чтобы помещалось


3. Динамический Objective-C

3.1 Так как Objective-C является динамической веткой развития языка С++, то проверка наличия методов у экземляров выполняется только во время запуска приложения. Методы среды выполнения, позволяющие динамически оперировать классами и методами классов, находятся в библиотеке libobjc.A.dylib, которая подключается к любой программе. С помощью них можно, например, сделать подмену одного класса другим во всех местах, в которых будет обращения к оригинальному классу:
[[MyBundle class] poseAsClass:[NSBundle class]];  //заменяем класс бандла своим, переопределяя его стандартное поведение.
 
3.2 Однако такой метод уже признан apple устаревшим и вместо него можно подменять отдельные методы класса при помощи class_getInstanceMethod и свойства method_imp у селекторов класса. Описание интересного трика с подменой метода :
http://www.cocoadev.com/index.pl?MethodSwizzling

3.3 Помимо этого в самих классах также можно перегрузить служебные методы, используемые средой выполнения, например, присвоив новый класс свойству isa, проверяющему, какому классу принадлежит объект. Члены класса таким способом поменять нельзя, зато можно полностью сменить интерфейс.
obj->isa = [MyClass class]; 
3.4 Или можно перегрузить методы forwardInvocation: и methodSignatureForSelector: проверяющие само наличие метода у объекта
http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/forwardInvocation:

3.5 Ну и в самом языке есть возможность расширения существующих классов, вплоть до базового NSObject'а, используя категории http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1
Tags:
spiiin: (Default)
Cижу, изучаю маковских юных дев , курю маны.

Небольшая памятка:

1. Компилятор и binutils

gcc + cc + g++ - набор компиляторов, gcc вроде вызывает нужный, но иногда удобнее вызвать необходимый, чем подбирать командную строку, перекрывающую его умолчания.
Важные параметры:
-x передать параметр линкеру
-Ox - уровень оптимизации с номером x, x больше -> оптимизации сильнее. Включают в себя сразу наборы из разных опций оптимизации и генерации отладочной информации.
Стадии:
-E препроцессинг
-S ассемблерный листинг
-c только компиляция, не генерировать объектный код
-Dсимвол - передать дефайн препроцессору
-Wтекст - включение предупреждений
-Werror - считать предупреждения ошибками. Для фанатиков чистоты.
-iпуть - искать заголовочные файлы в заданной папке. Может встречаться в командной строке несколько раз.
-arch тип - архитектура, под которой будет выполняться код. Можно задать сразу несколько.

ld - линкер.
-lлиб - подключить библиотеку с именем либ
-Lпуть - путь к библиотекам
-framework, -weak_framework - подключить фреймворк (являющийся набором заголовочных файлов, ресурсов, библиотек).
ar и ranlib - утилиты для сборки файлов в библиотеку для последующей линковки. В более широком применении - архиватор.
nm - просмотр информации о библиотеках и исполнимых файлах.
strip - вырезалка имен символов.
arch и lipo - позволяют управлять исполнимыми файлами, содержащими несколько архитектур (создавать и запускать разные версии). Мак под рукой поддерживает i386, x64_86 и ppc.
sign - подписать файл сертификатом разработчика.

Еще бы gdc и shark упомянуть, но я ими не пользуюсь.


2. Cocoa
- Cocoa Event-Handling Guide
- View programming guide (часть)
- Opengl programming guide
- На http://developer.apple.com/ - доки по NSObject, NSResponder, NSBundle, NSApplication, NSRunLoop, NSWindow, NSView, NSOpenGLView, NSTimer, NSApplicationDelegate, NSViewController
- Как создать приложение без главного nib-файла : http://lapcatsoftware.com/blog/2007/06/10/working-without-a-nib-part-5-no-3
(правка info.plist + перегрузка NSApplication + подстановка своего класса вместо NSBundle + настройки стилей NSWindow для приема событий мыши и клавиатуры и внешнего вида)


3. Render
- Нативными для GUI являются Cocoa или Carbon. Cocoa лежит во фреймфорке ApplicationKit/UIKit (для macosx / iphone)
- В Cocoa для рисования можно использовать Quartz или OpenGL. OpenGL представлена в виде фреймворка OpenGL, в котором содержатся библиотеки gl, glu, glut, glx.
- Для использования OpenGL можно выбрать надстройки CGL* и NSOpenGL. Вторая состоит готовых классов-наборов установок для первой, а также частично просто дублирует классы CGL.
- A drawable object can be any of the following: a Cocoa view, offscreenmemory, a full-screen graphics device,
or a pixel buffer.
- Смешивать отрисовку контролов из Cocoa и отрисовку OpenGL надо также аккуратно, как и в любой другой ОС. А лучше вообще не смешивать.
- Полезная схема :
opengl on mac
Tags:
spiiin: (Default)
Писать на Objective C пришлось намного быстрее, чем хотелось :)
Сегодня занимался налаживанием отношений между OpenKODE и Crystal SDK. В мануале по интеграции Crystal очень доступно, с иллюстрациями описывается, как добавить библиотеку в стандартный XCode проект. Только после проведения описанных действий не работает часть кнопок и залогиниться невозможно.

Наводку на решение нашел тут - http://permalink.gmane.org/gmane.comp.lib.sdl/46505. Там на первый взгляд другая проблема - интеграция OpenFeint и SDL, а решение такое же.
Надо сделать в главном цикле приложения OpenKODE (скорее всего в kdMain) дополнительную проверку, активно ли окно Crystal и если нужно, вызвать дополнительную обработку сообщений, чтобы дать возможность библиотеке отреагировать на тапы по экрану.
Как-то так:
void kdAdditionalUpdate()
{   
    if( achivLib->IsActive() )
    {
        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1, TRUE);
    };
}


А для отрисовки сообщений внутри игры надо еще сказать Crystal'у, что в приложении используется OpenGL (точнее ему надо сказать, что Cocos, он поймет). Как это сделать, сказано тут - http://devsupport.crystalsdk.com/default.asp?W24 (доступно только при регистрации).

Тогда взлетит.

<upd> Взлетит, но упадет. Чтобы полет шел без осложнений, надо еще установать свойство CrystalSession activateCrystalSetting в @"YES", чтобы Crystal не пытался поворачивать свой интерфейс при повороте устройства, потому что иначе приложение может упасть, если начать танцевать с айфоном (см. http://spiiin.livejournal.com/14190.html).
Tags:

Profile

spiiin: (Default)
spiiin

July 2017

S M T W T F S
      1
2345 678
9101112131415
16171819202122
23242526272829
3031     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 24th, 2017 06:43 am
Powered by Dreamwidth Studios