Unity 3 DアクセスIOS SDK


Unity 3 D開発ゲームはプラットフォーム側のSDKにアクセスして正式に発表する必要があり,本稿ではIOS SDKアクセスの流れを記録する.
UnityとIOSの相互調整
ゲームSDKへのアクセスを実現するには,まずUnity 3 DとオリジナルIOSコード間の相互呼び出しの問題を解決する.Unityは開発言語としてC#を使用し、IOSは開発言語としてObjective-Cを採用し、どのようにC#にOCコードを呼び出すか、あるいはOCにC#コードを呼び出すか.幸いOCとC#はC/C++コードの直接埋め込みをサポートしており、ここではCを両者の橋渡しとして使用しています.
両者間のインタフェース呼び出しとデータ転送を簡略化するために、UnityとIOS SDK間のインタフェースを設計する際、Unity呼び出しSDKは1つのインタフェースしかなく、SDK呼び出しUnityも1つのインタフェースしかない.プラットフォーム側のSDKの差が大きいため、1つのインタフェースが問題を解決できることをどのように保証しますか?ここでは汎用SDK層を開発し,ゲームは汎用SDK層とのみ対話し,汎用SDK層から具体的なプラットフォームSDKとドッキングする.
UnityでSDKレイヤを呼び出す機能:
using System.Runtime.InteropServices;
using Cross;
using UnityEngine;

namespace MuGame
{
    public class IOSPlatformSDK : IPlotformSDK
    {
        //!--IOS    ,  unity  ios SDK     
        [DllImport("__Internal")]
        public static extern void CallSDKFunc(string type, string jsonpara);

unityのすべての呼び出しはCallSDKFuncに変換され、この関数は汎用SDKによって提供され、パラメータtypeは機能分類を表し、jsonparaはjson文字列で表される一連のパラメータである.
汎用SDK呼び出し結果をUnityに返す
//!---------------------------      --------------------------------------------
#if defined(__cplusplus)
extern "C"{
#endif
    extern void UnitySendMessage(const char*, const char*, const char*);
#if defined(__cplusplus)
}
#endif

ここではunityengineを使用します.dllが提供するCインタフェースUnitySendMessageは、ここで1番目のchar*はメッセージを受信するGameObjectのnameを表し、2番目はGameObjectのスクリプトでメッセージを受信する関数名を表し、3番目はメッセージを受信するデータを表し、ここではjsonを使用して転送し、メッセージタイプを添付します.
SDK暴露のCインタフェースの宣言と定義
#if defined(__cplusplus)
extern "C" {
#endif    
    //     SDK   
    void CallSDKFunc(char *type, char * jsonpara)
    {
        if(connector == NULL)
        {
            connector = [SDKConnector sharedInstance];
        }
        [connector _CallSDKFunc :CreateNSString(type) :CreateNSString(jsonpara)];
    }
    
#if defined(__cplusplus)
}
#endif

ここでCallSDKFuncは、上述したUnityがSDKを呼び出すインタフェースであり、OC層ではSDKconnectorクラスが直接受信し、処理を配信する.
汎用SDK
SDKconnectorはメッセージの配布を担当しています
- (void)_CallSDKFunc :(NSString*)type :(NSString*)jsonpara
{
    NSLog(@"[SDK] Recevie cmd = %@   jsonpara = %@
",type,jsonpara);     if ([type isEqualToString:@"login"])     {//         [LanPlatform login:[SDKListener sharedInstance]];     }     else if ([type isEqualToString:@"loginout"])     {//         [LanPlatform logout:[SDKListener sharedInstance]];     }     else if ([type isEqualToString:@"switchAccount"])     {//         [LanPlatform switchAccount:[SDKListener sharedInstance]];     }     else if ([type isEqualToString:@"pay"])     {//         [LanPlatform pay:[SDKListener sharedInstance]];     }

ここではtypeタイプに応じて汎用SDK層に対応する処理モジュールにメッセージを配信し、さらに汎用SDK層からプラットフォームSDKのAPIを呼び出して具体的な処理を行う.ここでは、プラットフォームSDKの送迎応答を担当するSDKListenerのインスタンスが送られ、Unity側にデータが送信されることに注意する.
汎用SDK層の機能
現在、以下の一般的なモジュールが含まれています:ログイン、ログイン、アカウントの切り替え、チャージ、ユーザーセンター、ユーザーフォーラム、ユーザーフィードバック、夢中にならないように、実名認証.および各ゲームデータのレポート:選択、ゲームへのアクセス、ロールの作成、アップグレードなど.
ライフサイクルSDKの適用
SDKでは比較的特殊なクラスであり、基本的にすべてのSDKがアクセスする必要があるAPIはライフサイクルAPIであり、本明細書の処理項目は比較的特殊な点である.
@protocol SDKLifeCycleListener 
@optional
- (void)didFinishLaunching:(NSNotification*)notification;
- (void)didBecomeActive:(NSNotification*)notification;
- (void)willResignActive:(NSNotification*)notification;
- (void)didEnterBackground:(NSNotification*)notification;
- (void)willEnterForeground:(NSNotification*)notification;
- (void)willTerminate:(NSNotification*)notification;
@end

//          
void SDKRegisterLifeCycleListener(id obj)
{
#define REGISTER_SELECTOR(sel, notif_name)					\
        if([obj respondsToSelector:sel])							\
            [[NSNotificationCenter defaultCenter] 	addObserver:obj	\
                                                    selector:sel	\
                                                    name:notif_name	\
                                                    object:nil		\
            ];														\

    REGISTER_SELECTOR(@selector(didFinishLaunching:), UIApplicationDidFinishLaunchingNotification);
    REGISTER_SELECTOR(@selector(didBecomeActive:), UIApplicationDidBecomeActiveNotification);
    REGISTER_SELECTOR(@selector(willResignActive:), UIApplicationWillResignActiveNotification);
    REGISTER_SELECTOR(@selector(didEnterBackground:), UIApplicationDidEnterBackgroundNotification);
    REGISTER_SELECTOR(@selector(willEnterForeground:), UIApplicationWillEnterForegroundNotification);
    REGISTER_SELECTOR(@selector(willTerminate:), UIApplicationWillTerminateNotification);
    
#undef REGISTER_SELECTOR
}

ここでは、SDKライフサイクルリスニングプロトコルSDKLifeCycleListenerと、このプロトコルを登録するインタフェースSDKRegisterLifeCycleListenerを定義します.Appがロードされたときにその傍受を登録し,そのプロトコルを実現したのもSDKListenerである.
@implementation SDKListener

//    ,        ,          
+(void)load
{
    NSLog(@"[SDK] load
");     SDKRegisterLifeCycleListener([SDKListener sharedInstance]); }

小結
そこで,実現したIOS SDKの方法を概説した.簡単に言えば、unityはCallSDKFuncを通じて汎用SDK機能を呼び出し、汎用SDKはSDKconnectorを通じて具体的な汎用SDKモジュールにメッセージを配布し、プラットフォームSDKで処理する.SDKListenerは、プラットフォームが処理した結果とライフサイクルイベントを受信し、必要な結果をUnityに返します.
現在の実装では,プラットフォームの違いによってゲームコードの頻繁な変更を招くことなく,比較的デカップリングゲームとSDKとのつながりが良好である.もちろん、現在アクセスされているSDKはまだ比較的少ないので、テストが必要です.