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レイヤを呼び出す機能:
unityのすべての呼び出しはCallSDKFuncに変換され、この関数は汎用SDKによって提供され、パラメータtypeは機能分類を表し、jsonparaはjson文字列で表される一連のパラメータである.
汎用SDK呼び出し結果をUnityに返す
ここではunityengineを使用します.dllが提供するCインタフェースUnitySendMessageは、ここで1番目のchar*はメッセージを受信するGameObjectのnameを表し、2番目はGameObjectのスクリプトでメッセージを受信する関数名を表し、3番目はメッセージを受信するデータを表し、ここではjsonを使用して転送し、メッセージタイプを添付します.
SDK暴露のCインタフェースの宣言と定義
ここでCallSDKFuncは、上述したUnityがSDKを呼び出すインタフェースであり、OC層ではSDKconnectorクラスが直接受信し、処理を配信する.
汎用SDK
SDKconnectorはメッセージの配布を担当しています
ここではtypeタイプに応じて汎用SDK層に対応する処理モジュールにメッセージを配信し、さらに汎用SDK層からプラットフォームSDKのAPIを呼び出して具体的な処理を行う.ここでは、プラットフォームSDKの送迎応答を担当するSDKListenerのインスタンスが送られ、Unity側にデータが送信されることに注意する.
汎用SDK層の機能
現在、以下の一般的なモジュールが含まれています:ログイン、ログイン、アカウントの切り替え、チャージ、ユーザーセンター、ユーザーフォーラム、ユーザーフィードバック、夢中にならないように、実名認証.および各ゲームデータのレポート:選択、ゲームへのアクセス、ロールの作成、アップグレードなど.
ライフサイクルSDKの適用
SDKでは比較的特殊なクラスであり、基本的にすべてのSDKがアクセスする必要があるAPIはライフサイクルAPIであり、本明細書の処理項目は比較的特殊な点である.
ここでは、SDKライフサイクルリスニングプロトコルSDKLifeCycleListenerと、このプロトコルを登録するインタフェースSDKRegisterLifeCycleListenerを定義します.Appがロードされたときにその傍受を登録し,そのプロトコルを実現したのもSDKListenerである.
小結
そこで,実現したIOS SDKの方法を概説した.簡単に言えば、unityはCallSDKFuncを通じて汎用SDK機能を呼び出し、汎用SDKはSDKconnectorを通じて具体的な汎用SDKモジュールにメッセージを配布し、プラットフォームSDKで処理する.SDKListenerは、プラットフォームが処理した結果とライフサイクルイベントを受信し、必要な結果をUnityに返します.
現在の実装では,プラットフォームの違いによってゲームコードの頻繁な変更を招くことなく,比較的デカップリングゲームとSDKとのつながりが良好である.もちろん、現在アクセスされている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はまだ比較的少ないので、テストが必要です.