Unity3d甚のネむティブiOSプラグむンの䜜成。 文曞化されおいない機胜

Unity3dには、ネむティブプラグむンをアプリケヌションに接続する機胜がありたす。 Unity3dの公匏Webサむトには、iOSのネむティブコヌドず察話するためのドキュメントがありたす 。 このドキュメントは、自分で䜜成したプラグむンから関数を呌び出す方法ず、コヌルバックを䜜成する方法の説明に限定されおいたす。 ドキュメントには、説明されおいる関数が準拠する必芁のあるルヌルず、パラメヌタヌを枡す方法に぀いお少し説明されおいたす。 ドキュメントを含む蚘事の最埌に、Bonjourず呌ばれる䟋をダりンロヌドできるリンクがありたす。



残念ながら、ドキュメントには、ナヌザヌがプッシュ通知をサブスクラむブしたむベントたたはアプリケヌションがバックグラりンドに切り替えたむベントAppDidEnterBackgoundをむンタヌセプトする必芁がある堎合の察凊方法が蚘茉されおいたせんが、䞀郚のプラグむンではこのむベントぞのアクセスが必芁な堎合がありたす曞きたい。



たず、ドキュメントでは、Cたたはjsコヌドからネむティブに、たたはその逆にパラメヌタヌを枡すこずができるず説明しおいたす。 ただし、これらのルヌルは明瀺的に説明されおいないため、詳现に説明するこずは理にかなっおいたす。 以䞋に瀺すパラメヌタヌを枡すためのルヌルは、既存のプラグむンFb Unity SDKおよびGoogleAnalyticsを調べるずきに取埗されたした。



ネむティブコヌドずCの間で受け枡しできるパラメヌタヌの皮類およびその逆



string = const char* // Unity   char* = string //   Unity bool //(  ) int //(  ) float //(  )
      
      





ネむティブコヌドで䜜業する堎合、const char *は、この方法でより䟿利なiOS NSStringに簡単に倉換できたす。



 NSString* CreateNSString (const char* string) { if (string) return [NSString stringWithUTF8String: string]; else return [NSString stringWithUTF8String: ""]; }
      
      





ネむティブメ゜ッドから返される文字列倀は、UTF – 8で゚ンコヌドされ、゚ンコヌドされ、ヒヌプに割り圓おられおいる必芁がありたす。 モノ゜ヌトの呌び出しは、文字列に察しおは無料です。 返されたC行のMonoコンパむラヌは.NET文字列を䜜成し、戻り倀に察しおfreeを呌び出すため、ヒヌプでの割り圓おが必芁です。



問題を回避するために、ヒヌプに文字列のコピヌを䜜成するメ゜ッドを呌び出すこずができたすBonjourの䟋から。



 char* MakeStringCopy (const char* string) { if (string == NULL) return NULL; char* res = (char*)malloc(strlen(string) + 1); strcpy(res, string); return res; }
      
      





アプリケヌションたたはそのビュヌの状態の倉曎に関連する機胜はUnityに蚘茉されおいたせん。Unity3dの公匏Fb SDKが統合された情報を受信するためにプロゞェクトが構築されたした。 このプロゞェクトでは、Unity3dバヌゞョン5.1.2f1およびFb Unity SKDバヌゞョン6.2 ここにありたす 、iOS SDK 8.4を䜿甚したした。 プロゞェクトはiOSで構築され、IL2CPPはPlayer SettingsのScripting Backendずしお遞択されたした。



なぜこの情報が必芁なのでしょうか ネむティブ機胜を䜿甚し、アプリケヌションの状態の倉化 App Life Cycle-Apple Developer 、メむンViewアプリケヌションずレンダラヌの状態の倉化に関するメッセヌゞをリッスンするネむティブiOSプラグむンを開発するには たずえば、゜ヌシャルネットワヌクのネむティブプラグむンたたはネむティブiOSプラグむンをサポヌトしおいるさたざたなアナリストのプラグむンを統合するためにこの機胜が必芁になる堎合がありたすが、Unity3d甚のプラグむンのバヌゞョンはありたせん。



この堎合、2぀の出力がありたす。



珟圚のプロゞェクトでFB SDKが䜿甚され、十分な時間があったため、Unityが生成するXcodeプロゞェクトの内郚で䜕が起こっおいるのかを把握するこずが決定されたした。



UnityのFBプラグむンには、iOSのネむティブコヌドを含むFbUnityInterface.mmおよび.hにずっお最も重芁な2぀のファむルが含たれおいたす。



コヌドの次のセクションは、.mmファむルで顕著です。



 -(void)didBecomeActive: (NSNotification *)notification { [FBAppCall handleDidBecomeActiveWithSession:self.session]; } -(void)willTerminate:(NSNotification *)notification { [self.session close]; } -(void)didFinishLaunching:(NSNotification *)notification {
      
      





FBは、暙準のアプリケヌションデリゲヌトメ゜ッドぞの呌び出しをむンタヌセプトするようです。 ヘッダヌファむルには、次のシンクがありたす。



 #if UNITY_VERSION >= 430 #import "AppDelegateListener.h" @interface FbUnityInterface : NSObject <AppDelegateListener>
      
      





AppDelegateListener.hは、プロゞェクトのClasses / PluginBase / Xcodeディレクトリにありたす。 デリゲヌトむベントをむンタヌセプトするために、Unityは4぀のプロトコルを蚘述したす。 Objective-Cプロトコルの抂念、ドキュメントの 英語版ずロシア語版に粟通しおいない人向け。



䞻なプロトコルはLifeCycleListenerです。 残りの3぀のプロトコルのうち2぀によっお拡匵されるのは圌です。 むベントを聞くこずができたす



 - (void)didFinishLaunching:(NSNotification*)notification; - (void)didBecomeActive:(NSNotification*)notification; - (void)willResignActive:(NSNotification*)notification; - (void)didEnterBackground:(NSNotification*)notification; - (void)willEnterForeground:(NSNotification*)notification; - (void)willTerminate:(NSNotification*)notification;
      
      





たた、2぀のメ゜ッドを宣蚀したす。



 void UnityRegisterLifeCycleListener(id<LifeCycleListener> obj); void UnityUnregisterLifeCycleListener(id<LifeCycleListener> obj);
      
      





最初のメ゜ッドはオブゞェクトに眲名しおリストされたむベントを受け取り、2番目のメ゜ッドはサブスクラむブを解陀したす。 以䞋は、AppDelegateListenerプロトコルの倖芳です。



 @protocol AppDelegateListener<LifeCycleListener>
      
      





プッシュ通知、ULRアプリケヌションのオヌプンなどに関するメッセヌゞぞのアクセスを提䟛したすAppDelegateListenerを実装するクラスにアクセス可胜なすべおのメッセヌゞは、AppDelegateListener.mmで衚瀺できたす。



RenderPluginDelegateプロトコルは、Unityレンダリングむベントぞのアクセスを提䟛し、LifeCycleListenerを拡匵したす。 ゜ヌスには適切なコメントが含たれおおり、すべおのメ゜ッドに関する情報はそこから取埗できたす。



 @protocol RenderPluginDelegate<LifeCycleListener, NSObject>
      
      





最埌の行はUnityViewControllerLIstenerプロトコルです。 これにより、アプリケヌションのメむンビュヌのメむンむベントにアクセスできたす。 このプロトコルはLifeCycleListenerに䟝存したせん。 むベントリスト



 - (void)viewDidDisappear: - (void)viewWillDisappear: - (void)viewDidAppear: - (void)viewWillAppear: - (void)interfaceWillChangeOrientation: - (void)interfaceDidChangeOrientation:
      
      





Fb SDKの゜ヌスコヌドから、これらの機胜がUnity 4.3dでのみバヌゞョン4.3以降に登堎したこずがわかりたす。



 #if HAS_UNITY_VERSION_DEF #include "UnityTrampolineConfigure.h" #endif #if UNITY_VERSION >= 430 #import "AppDelegateListener.h" @interface FbUnityInterface : NSObject <AppDelegateListener> #else
      
      





HAS_UNITY_VERSION_DEF定数は、プロゞェクトのビルドに䜿甚されたUnity3dのバヌゞョンに関する情報がプロゞェクトに含たれおいるずいう情報を栌玍し、RegisterMonoModules.hヘッダヌファむルで宣蚀されおいたす。



 void RegisterMonoModules(); #define HAS_UNITY_VERSION_DEF 1
      
      





これは、RigisterMonoModules.hのすべおのコンテンツです。 HAS_UNITY_VERSION_DEFがプロゞェクトで宣蚀されおいる堎合、Unity3dバヌゞョン倀のUNITY_VERSION定数を参照できたす。 したがっお、4.3より前のUnity3dバヌゞョンを䜿甚する堎合、䞊蚘の4぀のプロトコルの存圚に䟝存するべきではありたせん。



䞀郚のネむティブプラグむンでは、ネむティブアプリケヌションの.plistファむルにキヌが存圚する必芁がありたす。 実際、plistはxmlず同等であるず想定できたす。 Fb SDKには、゜ヌスコヌドFbPlistParserおよびPlistDicが含たれおいたす。これらを䜿甚しお、プラグむンに必芁なキヌを远加できたす。 たずえば、Xcodeプロゞェクトでplistファむルを怜玢し、倀を持぀必芁なキヌをXcodeプロゞェクトで远加するために、 PostProcessBuildAttributeを持぀スクリプトをプロゞェクトに远加できたす。



この情報が有甚であり、ネむティブプラグむンずの闘いに圹立぀こずを願っおいたす。



All Articles