qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          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

          評論

          # re: Unity3d與iOS交互開發—接入平臺SDK必備技能 2015-05-06 11:06 親親

          SDKPlatForm。h 找不到
            回復  更多評論   

          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 齐齐哈尔市| 永定县| 兴和县| 德令哈市| 赫章县| 澄城县| 高密市| 临潭县| 曲水县| 滁州市| 麻城市| 石嘴山市| 双城市| 玉环县| 扎赉特旗| 潮安县| 来凤县| 庐江县| 怀来县| 同德县| 汕头市| 甘孜县| 寿宁县| 手游| 专栏| 湟源县| 尤溪县| 盐山县| 名山县| 沾益县| 呼伦贝尔市| 吴江市| 安西县| 凤凰县| 嘉峪关市| 集安市| 广宁县| 清镇市| 南华县| 河西区| 辽中县|