UnityからiOSビルドをする時に、「PlayerSettings」-「Other Settings」-「Optimization」-「SDK Version」をデフォルトの「Device SDK」から「Simulator SDK」に変更する事により、iOS Simulator用のXcodeプロジェクトを吐き出し、iOS Simulator上で動作を確認することができます。
ただUnityのiOS Simulator向けビルドはネイティブプラグインの呼び出しをサポートしておらず、ネイティブプラグイン呼び出し時に以下ようなのエラーを吐いて、動作しません。
EntryPointNotFoundException: initAdBanner_ at (wrapper managed-to-native) Binding:initAdBanner_ (string) at Binding.initAdBanner () [0x00000] in <filename unknown>:0
このエラーを回避し、ネイティブプラグインをシミュレータ上で動作させる方法がこちらのサイトで紹介されていました。
「Jason Lu Game Programmer –
Unity4: Test Unity iOS plug-in on iOS simulator」
画像付きですし分かり易いと思いますが、日本語で分かり易く紹介しておきます。
Unityのバージョンは4.5.5f1で試しています。
変更はUnityからiOS Simulatorビルドで吐き出されたXcodeプロジェクトの以下のソース中の2カ所に対して行います。
Librariesフォルダ – RegisterMonoModules.cpp
1.mono_dl_register_symbolの宣言を#ifディレクティブの外に出します。
extern "C" { typedef void* gpointer; typedef int gboolean; #if !(TARGET_IPHONE_SIMULATOR) const char* UnityIPhoneRuntimeVersion = "4.5.5f1"; void mono_dl_register_symbol (const char* name, void *addr); 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_Assembly_CSharp_info; // Assembly-CSharp.dll extern gpointer* mono_aot_module_Assembly_UnityScript_info; // Assembly-UnityScript.dll extern gpointer* mono_aot_module_Boo_Lang_info; // Boo.Lang.dll extern gpointer* mono_aot_module_Mono_Security_info; // Mono.Security.dll extern gpointer* mono_aot_module_PlayMaker_info; // PlayMaker.dll extern gpointer* mono_aot_module_System_Core_info; // System.Core.dll extern gpointer* mono_aot_module_System_info; // System.dll extern gpointer* mono_aot_module_UnityEngine_info; // UnityEngine.dll extern gpointer* mono_aot_module_UnityScript_Lang_info; // UnityScript.Lang.dll extern gpointer* mono_aot_module_mscorlib_info; // mscorlib.dll #endif // !(TARGET_IPHONE_SIMULATOR) void initAdBanner_(); void moveOffBanners_(); void share_(); void shareWithImage_(); void showAppStore_(); void UnityNSObject_RetainObject(); void UnityNSObject_ReleaseObject(); void UnityNSError_Code(); void UnityNSError_Description(); void UnityNSError_Reason(); void UnityNSNotification_Name(); }
extern "C" { typedef void* gpointer; typedef int gboolean; #if !(TARGET_IPHONE_SIMULATOR) const char* UnityIPhoneRuntimeVersion = "4.5.5f1"; 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_Assembly_CSharp_info; // Assembly-CSharp.dll extern gpointer* mono_aot_module_Assembly_UnityScript_info; // Assembly-UnityScript.dll extern gpointer* mono_aot_module_Boo_Lang_info; // Boo.Lang.dll extern gpointer* mono_aot_module_Mono_Security_info; // Mono.Security.dll extern gpointer* mono_aot_module_PlayMaker_info; // PlayMaker.dll extern gpointer* mono_aot_module_System_Core_info; // System.Core.dll extern gpointer* mono_aot_module_System_info; // System.dll extern gpointer* mono_aot_module_UnityEngine_info; // UnityEngine.dll extern gpointer* mono_aot_module_UnityScript_Lang_info; // UnityScript.Lang.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 initAdBanner_(); void moveOffBanners_(); void share_(); void shareWithImage_(); void showAppStore_(); void UnityNSObject_RetainObject(); void UnityNSObject_ReleaseObject(); void UnityNSError_Code(); void UnityNSError_Description(); void UnityNSError_Reason(); void UnityNSNotification_Name(); }
2.RegisterMonoModules()中のネイティブ呼び出しするメソッドの定義を#ifディレクティブから外す
void RegisterMonoModules() { gEnableGyroscope = false; #if !(TARGET_IPHONE_SIMULATOR) mono_aot_only = true; mono_ficall_flag = true; mono_aot_register_module(mono_aot_module_Assembly_CSharp_firstpass_info); mono_aot_register_module(mono_aot_module_Assembly_CSharp_info); mono_aot_register_module(mono_aot_module_Assembly_UnityScript_info); mono_aot_register_module(mono_aot_module_Boo_Lang_info); mono_aot_register_module(mono_aot_module_Mono_Security_info); mono_aot_register_module(mono_aot_module_PlayMaker_info); mono_aot_register_module(mono_aot_module_System_Core_info); mono_aot_register_module(mono_aot_module_System_info); mono_aot_register_module(mono_aot_module_UnityEngine_info); mono_aot_register_module(mono_aot_module_UnityScript_Lang_info); mono_aot_register_module(mono_aot_module_mscorlib_info); mono_dl_register_symbol("initAdBanner_", (void*)&initAdBanner_); mono_dl_register_symbol("moveOffBanners_", (void*)&moveOffBanners_); mono_dl_register_symbol("share_", (void*)&share_); mono_dl_register_symbol("shareWithImage_", (void*)&shareWithImage_); mono_dl_register_symbol("showAppStore_", (void*)&showAppStore_); mono_dl_register_symbol("UnityNSObject_RetainObject", (void*)&UnityNSObject_RetainObject); mono_dl_register_symbol("UnityNSObject_ReleaseObject", (void*)&UnityNSObject_ReleaseObject); mono_dl_register_symbol("UnityNSError_Code", (void*)&UnityNSError_Code); mono_dl_register_symbol("UnityNSError_Description", (void*)&UnityNSError_Description); mono_dl_register_symbol("UnityNSError_Reason", (void*)&UnityNSError_Reason); mono_dl_register_symbol("UnityNSNotification_Name", (void*)&UnityNSNotification_Name); #endif // !(TARGET_IPHONE_SIMULATOR) }
void RegisterMonoModules() { gEnableGyroscope = false; #if !(TARGET_IPHONE_SIMULATOR) mono_aot_only = true; mono_ficall_flag = true; mono_aot_register_module(mono_aot_module_Assembly_CSharp_firstpass_info); mono_aot_register_module(mono_aot_module_Assembly_CSharp_info); mono_aot_register_module(mono_aot_module_Assembly_UnityScript_info); mono_aot_register_module(mono_aot_module_Boo_Lang_info); mono_aot_register_module(mono_aot_module_Mono_Security_info); mono_aot_register_module(mono_aot_module_PlayMaker_info); mono_aot_register_module(mono_aot_module_System_Core_info); mono_aot_register_module(mono_aot_module_System_info); mono_aot_register_module(mono_aot_module_UnityEngine_info); mono_aot_register_module(mono_aot_module_UnityScript_Lang_info); mono_aot_register_module(mono_aot_module_mscorlib_info); #endif // !(TARGET_IPHONE_SIMULATOR) mono_dl_register_symbol("initAdBanner_", (void*)&initAdBanner_); mono_dl_register_symbol("moveOffBanners_", (void*)&moveOffBanners_); mono_dl_register_symbol("share_", (void*)&share_); mono_dl_register_symbol("shareWithImage_", (void*)&shareWithImage_); mono_dl_register_symbol("showAppStore_", (void*)&showAppStore_); mono_dl_register_symbol("UnityNSObject_RetainObject", (void*)&UnityNSObject_RetainObject); mono_dl_register_symbol("UnityNSObject_ReleaseObject", (void*)&UnityNSObject_ReleaseObject); mono_dl_register_symbol("UnityNSError_Code", (void*)&UnityNSError_Code); mono_dl_register_symbol("UnityNSError_Description", (void*)&UnityNSError_Description); mono_dl_register_symbol("UnityNSError_Reason", (void*)&UnityNSError_Reason); mono_dl_register_symbol("UnityNSNotification_Name", (void*)&UnityNSNotification_Name); }
以上の2カ所を修正することにより、ネイティブプラグインがiOSシミュレータ上でも動作するようになります。