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シミュレータ上でも動作するようになります。