Unity3d與iOS交互開發—接入平臺SDK必備技能
前言廢話:開發手機游戲都知道,你要接入各種平臺的SDK。那就需要Unity3d與iOS中Objective-C的函數有交互,所以你就需要用到如下內容:
一、Unity3d To iOS:
1、創建一個C#文件 SdkToIOS.cs 這是調用iOS函數的接口:
public class SdkToIOS: MonoBehaviour { //平臺接入開關 public static bool isOpenPlatform = false; //導入定義到.m文件中的C函數 [DllImport("__Internal")] private static extern void _PlatformInit(); //定義接口函數供游戲邏輯調用 public static void InitSDK() { if (isOpenPlatform) { _PlatformInit(); } } } |
2、編寫與接口對應的Objective-c函數:
// MyIOSSdk.h #import <Foundation/Foundation.h> @interface MyIOSSdk : NSObject @end // MyIOSSdk.m #import "MyIOSSdk.h" //這里引用SDK的頭文件 #import "SDKPlatform.h" #if defined(__cplusplus) extern "C"{ #endif extern void UnitySendMessage(const charchar *, const charchar *, const charchar *); extern NSString* _CreateNSString (const char* string); #if defined(__cplusplus) } #endif |
//***************************************************************************** @implementation MyIOSSdk //********************** //message tools + (void)sendU3dMessage:(NSString *)messageName param:(NSDictionary *)dict { NSString *param = @""; if ( nil != dict ) { for (NSString *key in dict) { if ([param length] == 0) { param = [param stringByAppendingFormat:@"%@=%@", key, [dict valueForKey:key]]; } else { param = [param stringByAppendingFormat:@"&%@=%@", key, [dict valueForKey:key]]; } } } UnitySendMessage("SDK_Object", [messageName UTF8String], [param UTF8String]); } //********************** //SDK fun //初始化SDK -(void)SDKInit { SDKcfg *cfg = [[[SDKcfg alloc] init] autorelease]; cfg.appid =123456; cfg.appKey =@"aoaoaoaoaoaoaoaoaoaoaoaoaaoaoaoaoaoaoao"; cfg.orientation = UIDeviceOrientationLandscapeLeft; //調用SDK的初始化函數 [[SDKPlatform defaultPlatform] SDKInit:cfg]; //添加回調監聽 [[SDKPlatform defaultPlatform] addObserver:self selector:@selector(SNSInitResult:) name:(NSString *)kInitNotification object:nil]; } //獲取用戶ID -(NSString*)SDKGetUserID { [[SDKPlatform defaultPlatform] SDKGetUserID]; } //********************** //call back fun //初始化更新回調 - (void)SNSInitResult:(NSNotification *)notify { [MyIOSSdk sendU3dMessage:@"SDKMsgInit" param:nil]; } @end //***************************************************************************** #if defined(__cplusplus) extern "C"{ #endif //字符串轉化的工具函數 NSString* _CreateNSString (const char* string) { if (string) return [NSString stringWithUTF8String: string]; else return [NSString stringWithUTF8String: ""]; } char* _MakeStringCopy( const char* string) { if (NULL == string) { return NULL; } char* res = (char*)malloc(strlen(string)+1); strcpy(res, string); return res; } static MyIOSSdk *mySDK; //供u3d調用的c函數 void _PlatformInit() { if(mySDK==NULL) { mySDK = [[MyIOSSdk alloc]init]; } [lsSDK SDKInit]; } //注意這個函數是返回字符串 const char* _PlatformGetUin() { if(lsSDK==NULL) { lsSDK = [[MyIOSSdk alloc]init]; } return _MakeStringCopy([[lsSDK SDKGetUserID] UTF8String]); } #if defined(__cplusplus) } #endif |
值得一提的是在上面的代碼中特意寫了一個返回字符串的例子,因為你要獲取用戶ID 、昵稱什么的。對應在cs文件中導入函數如下:
[DllImport ("__Internal")]
private static extern string _PlatformGetUin();
這里的const char* 會被C#自動轉換成string因為在m文件中使用了內存申請,該段內存自然是處在堆內存中,這樣轉成string符合c#的內存管理機制,我們不用擔心它的釋放問題。
3、在你的工程目錄中找個地方保存iOS的文件
打包出XCode工程后導入進去,加入你的SDK就可以了。
有一點需要說明,如果存放目錄為\Assets\Plugins\iOS,那么Unity3d會自動將該目錄下的所有文件(暫不支持子文件夾)當做插件文件打包到Xcode工程下的Libraries目錄下,這樣你就不需要在手動添加了,否則會報錯重復聲明什么的。
這種文件各個平臺會有多個,可以使用同一頭文件且定義的C函數名也都相同,這樣更有利于多版本管理。
二、iOS To Unity3d:
這個在上面的 MyIOSSdk.m 文件中已經有劇透了,就是利用unity3d 的UnitySendMessage函數,其中參數1是場景中接受消息的對象,參數2是要執行的函數名,參數3為傳入參數,只要按照如下步驟就可以實現這個機制:
1、在場景中創建一個對象用于接受iOS消息,或者用現有的也可以;
2、為SDK消息寫一個腳本,里面包含各種消息函數;
3、將腳本掛到之前創建的對象上完事;
需要注意:這個對象在場景切換時候要始終存在,或者你在每個場景中都加個這玩意也可以,總之只要能收到消息就行了;
另外,針對參數的傳遞對應上面的sendU3dMessage函數,我還在消息接受腳本中寫過一個消息參數的解析:
void ParseMsg(string msg, out Dictionary<string, string> dicMsg){ if( null == msg || 0 == msg.Length ){ dicMsg = null; return; } dicMsg = new Dictionary<string, string>(); string[] msgArray = msg.Split('&'); for( int i=0; i<msgArray.Length; i++){ string[] elementArray = msgArray[i].Split('='); dicMsg.Add(elementArray[0],elementArray[1]); } } |
這個我自己都還沒有實際使用過,有錯誤自行解決大致是這樣。
ps:關于SDK的接入還有 android版本的尚未研究網上有很多可以參照;
pps:這種交互方式在iOS的模擬器上貌似不行,測試請使用真機;
posted on 2014-07-31 10:09 順其自然EVO 閱讀(3165) 評論(1) 編輯 收藏 所屬分類: 測試學習專欄 、android