Usar el Simulador de Xcode con un plug-in para iOS en Unity 3

Como ya se vio en “Crear una applicación Unity 3 con Plugin de código nativo para iOS” podemos crear un plug in the código nativo para iOS en Unity 3. El problema es que por defecto no se pueden probar las llamadas a código nativo en el Simulador de Xcode. Probablemente no tenga mucho sentido probar una aplicación Unity 3 en el simulador ya que el rendimiento 3D puede variar mucho con el del dispositivo real, pero si todavía no tienes un dispositivo iOS puede servirte.

Dentro del proyecto Xcode en el fichero “Libraries/RegisterMonoModules.cpp” se puede ver como las funciones definidas dentro del “extern” están dentro de un bloque que solo se procesa cuando el target NO ES el Simulator (#if !(TARGET_IPHONE_SIMULATOR)). Tenemos que sacar de esos bloques tanto la definición de la función que registra las funciones (mono_dl_register_symbol) como nuestras funciones propiamente dichas. Fijarse en las líneas marcadas en negrita a continuación:

#include "RegisterMonoModules.h"

extern bool gEnableGyroscope;

extern "C"
{
        typedef void* gpointer;
        typedef int gboolean;
#if !(TARGET_IPHONE_SIMULATOR)
        const char*                     UnityIPhoneRuntimeVersion = "3.5.0f5";

        extern int                      mono_ficall_flag;
        void                            mono_aot_register_module(gpointer *aot_info);
        extern gboolean         mono_aot_only;
        extern gpointer*        mono_aot_module_Assembly_CSharp_firstpass_info; // Assembly-CSharp-firstpass.dll
        extern gpointer*        mono_aot_module_UnityEngine_info; // UnityEngine.dll
        extern gpointer*        mono_aot_module_mscorlib_info; // mscorlib.dll
#endif // !(TARGET_IPHONE_SIMULATOR)
        void                         mono_dl_register_symbol (const char* name, void *addr);
        void    _PassStructFromObjCToUnity();
        void    _Test();
}
void RegisterMonoModules()
{
    gEnableGyroscope = false;
#if !(TARGET_IPHONE_SIMULATOR)
        mono_aot_only = true;
        mono_ficall_flag = false;
        mono_aot_register_module(mono_aot_module_Assembly_CSharp_firstpass_info);
        mono_aot_register_module(mono_aot_module_UnityEngine_info);
        mono_aot_register_module(mono_aot_module_mscorlib_info);


#endif // !(TARGET_IPHONE_SIMULATOR)
        mono_dl_register_symbol("_PassStructFromObjCToUnity", (void*)&_PassStructFromObjCToUnity);
        mono_dl_register_symbol("_HaveObjCDoSomething", (void*)&_HaveObjCDoSomething);
}

Podemos modificar el scriptPostprocessBuildPlayer” para no tener que hacer estos cambios a mano cada vez que generemos el proyecto Xcode. Un poco de awk hace la magia (no es muy bonito el código pero funciona…):

#!/bin/bash
cp -fR ./iOS\ Build/Libraries ~/Documents/Xcode/my-project/
cp -fR ./iOS\ Build/Data ~/Documents/Xcode/my-project/
rm file.tmp
awk '
{
  if ($0 == "#if !(TARGET_IPHONE_SIMULATOR)" && NR == 9) {
    getline var1;
    getline var2;
    printf "%s\n%s\n%s\n", var2, $0, var1 >> "file.tmp"
  } else if (NR == 32) {
     printf "#endif // !(TARGET_IPHONE_SIMULATOR)" >> "file.tmp"
     printf "\n%s\n", $0 >> "file.tmp"
  } else if ($0 == "#endif // !(TARGET_IPHONE_SIMULATOR)" && NR > 32) {
  } else {
    print $0 >> "file.tmp"
  }
}' ~/Documents/Xcode/my-project/Libraries/RegisterMonoModules.cpp
mv file.tmp ~/Documents/Xcode/my-project/Libraries/RegisterMonoModules.cpp

Probablemente sea una buena idea desactivar la opción “Dead Code Stripping” del proyecto Xcode (dentro de “Linking” en “Build Settings”) ya que Xcode puede pensar que las funciones definidas como externas no serán nunca llamadas desde Xcode ya que son llamadas desde Unity.

Fuente: http://answers.unity3d.com/questions/49945/gamekit-linker-failure.html?sort=oldest

Tal vez también te guste

Crear una aplicación Unity 3 con Plugin de código nativo para iOS
Create a Unity project. Go to “File->Build Settings”, select the iOS platform and then “Player...
Solucionar “macports checking for Tcl configuration… configure: error: Can’t find Tcl configuration definitions” al actualizar Macports en Mac OS X 10.9 Mavericks
I've just upgraded my Mac OS X to Mavericks 10.9. When I tried to update Macports I got an error and...
Usar OpenCV en Xcode 4 para una aplicación orientada a objetos Mac OS X
First of all you have to install OpenCV in Mac OS X. Then in Xcode create a new Mac OS X Application...
No puedo configurar con cmake en Mac OS X 10.8 con Xcode 4.4
I just did a clean install of Mac OS X 10.8 Mountain Lion and Xcode 4.4 so when I was ready to compile...
Dejar un comentario?

2 Comentarios.

  1. Thank you very much!!! You realy help me!

Deje un comentario

Trackbacks y Pingbacks: