原地址:http://www.2cto.com/kf/201401/273337.html#

前言废话:开发手机游戏都知道,你要接入各种平台的SDK。那就需要Unity3d与iOS中Objective-C的函数有交互,所以你就需要用到如下内容:

一、Unity3d To iOS:

1、创建一个C#文件 SdkToIOS.cs 这是调用iOS函数的接口:

  1. public class SdkToIOS: MonoBehaviour
  2. {
  3. //平台接入开关
  4. public static bool isOpenPlatform = false;
  5.  
  6. //导入定义到.m文件中的C函数
  7. [DllImport("__Internal")]
  8. private static extern void _PlatformInit();
  9.  
  10. //定义接口函数供游戏逻辑调用
  11. public static void InitSDK()
  12. {
  13. if (isOpenPlatform)
  14. {
  15. _PlatformInit();
  16. }
  17. }
  18. }

  

2、编写与接口对应的Objective-c函数:

  1. // MyIOSSdk.h
  2.  
  3. #import <foundation foundation.h="">
  4.  
  5. @interface MyIOSSdk : NSObject
  6.  
  7. @end</foundation>

  

  1. // MyIOSSdk.m
  2.  
  3. #import "MyIOSSdk.h"
  4.  
  5. //这里引用SDK的头文件
  6. #import "SDKPlatform.h"
  7.  
  8. #if defined(__cplusplus)
  9. extern "C"{
  10. #endif
  11. extern void UnitySendMessage(const char *, const char *, const char *);
  12. extern NSString* _CreateNSString (const char* string);
  13. #if defined(__cplusplus)
  14. }
  15. #endif
  16.  
  17. //*****************************************************************************
  18.  
  19. @implementation MyIOSSdk
  20.  
  21. //**********************
  22. //message tools
  23.  
  24. + (void)sendU3dMessage:(NSString *)messageName param:(NSDictionary *)dict
  25. {
  26. NSString *param = @"";
  27. if ( nil != dict ) {
  28. for (NSString *key in dict)
  29. {
  30. if ([param length] == 0)
  31. {
  32. param = [param stringByAppendingFormat:@"%@=%@", key, [dict valueForKey:key]];
  33. }
  34. else
  35. {
  36. param = [param stringByAppendingFormat:@"&%@=%@", key, [dict valueForKey:key]];
  37. }
  38. }
  39. }
  40. UnitySendMessage("SDK_Object", [messageName UTF8String], [param UTF8String]);
  41. }
  42.  
  43. //**********************
  44. //SDK fun
  45.  
  46. //初始化SDK
  47. -(void)SDKInit
  48. {
  49. SDKcfg *cfg = [[[SDKcfg alloc] init] autorelease];
  50. cfg.appid =123456;
  51. cfg.appKey =@"aoaoaoaoaoaoaoaoaoaoaoaoaaoaoaoaoaoaoao";
  52. cfg.orientation = UIDeviceOrientationLandscapeLeft;
  53. //调用SDK的初始化函数
  54. [[SDKPlatform defaultPlatform] SDKInit:cfg];
  55. //添加回调监听
  56. [[SDKPlatform defaultPlatform] addObserver:self selector:@selector(SNSInitResult:) name:(NSString *)kInitNotification object:nil];
  57. }
  58.  
  59. //获取用户ID
  60. -(NSString*)SDKGetUserID
  61. {
  62. [[SDKPlatform defaultPlatform] SDKGetUserID];
  63. }
  64.  
  65. //**********************
  66. //call back fun
  67.  
  68. //初始化更新回调
  69. - (void)SNSInitResult:(NSNotification *)notify
  70. {
  71. [MyIOSSdk sendU3dMessage:@"SDKMsgInit" param:nil];
  72. }
  73.  
  74. @end
  75.  
  76. //*****************************************************************************
  77.  
  78. #if defined(__cplusplus)
  79. extern "C"{
  80. #endif
  81.  
  82. //字符串转化的工具函数
  83.  
  84. NSString* _CreateNSString (const char* string)
  85. {
  86. if (string)
  87. return [NSString stringWithUTF8String: string];
  88. else
  89. return [NSString stringWithUTF8String: ""];
  90. }
  91.  
  92. char* _MakeStringCopy( const char* string)
  93. {
  94. if (NULL == string) {
  95. return NULL;
  96. }
  97. char* res = (char*)malloc(strlen(string)+1);
  98. strcpy(res, string);
  99. return res;
  100. }
  101.  
  102. static MyIOSSdk *mySDK;
  103.  
  104. //供u3d调用的c函数
  105.  
  106. void _PlatformInit()
  107. {
  108. if(mySDK==NULL)
  109. {
  110. mySDK = [[MyIOSSdk alloc]init];
  111. }
  112. [lsSDK SDKInit];
  113. }
  114.  
  115. //注意这个函数是返回字符串
  116. const char* _PlatformGetUin()
  117. {
  118. if(lsSDK==NULL)
  119. {
  120. lsSDK = [[MyIOSSdk alloc]init];
  121. }
  122. return _MakeStringCopy([[lsSDK SDKGetUserID] UTF8String]);
  123. }
  124.  
  125. #if defined(__cplusplus)
  126. }
  127. #endif

  

 

值得一提的是在上面的代码中特意写了一个返回字符串的例子,因为你要获取用户ID 、昵称什么的。对应在cs文件中导入函数如下:

  1. [DllImport ("__Internal")]
  2. 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函数,我还在消息接受脚本中写过一个消息参数的解析:

  1. void ParseMsg(string msg, out Dictionary<string, string=""> dicMsg){
  2. if( null == msg || 0 == msg.Length ){
  3. dicMsg = null;
  4. return;
  5. }
  6. dicMsg = new Dictionary<string, string="">();
  7. string[] msgArray = msg.Split('&');
  8. for( int i=0; i<msgarray.length; i++){="" string[]="" elementarray="msgArray[i].Split('=');" dicmsg.add(elementarray[0],elementarray[1]);="" }="" }<="" pre=""><br>
  9. 这个我自己都还没有实际使用过,有错误自行解决大致是这样。
  10. <p></p>
  11. <p><br>
  12. </p>
  13. <p>ps:关于SDK的接入还有 android版本的尚未研究网上有很多可以参照;</p>
  14. <p><br>
  15. </p>
  16. <p>ppsSDK多版本管理和研究我也在摸索中,哪位大神比较熟悉不吝赐教,本人万分感激,之前到是看过这个http://www.xuanyusong.com/archives/2418#comments</p>
  17. <p><br>
  18. </p>
  19. <p>ppps:转载请注明来自:http://blog.csdn.net/zhao_yin</p>
  20. <p><br>
  21. </p> </msgarray.length;></string,></string,>

  

Unity3d与iOS交互开发——接入平台SDK必备技能的更多相关文章

  1. Unity3d与iOS交互开发

    一.Unity3d  To  iOS: 最近要做一个商品和人体模型T台秀相关的功能,要用到Unity3D,搜集了一些资料先保存下来. 1.创建一个C#文件 SdkToIOS.cs 这是调用iOS函数的 ...

  2. UNITY3D与iOS交互解决方案

    原地址:http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 “授人以鱼,不如授人以渔”,以UNIT ...

  3. 《转》iOS 平台 Cocos2d-x 项目接入新浪微博 SDK 的坑

    最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理 ...

  4. 开发腾讯移动游戏平台SDK ios版Ane扩展 总结

    本文记录了在开发 腾讯移动游戏平台SDK(MSDK) ios版Ane扩展 过程中所遇到的问题 文中非常多问题都是基础的问题.对object c和xcode配置了解不深入导致的.(没办法,开发ane的程 ...

  5. Unity3D与iOS的交互设计<ViewController 的跳转>

    原地址:http://www.aichengxu.com/article/%CF%B5%CD%B3%D3%C5%BB%AF/28797_12.html Unity3D与iOS的交互设计<View ...

  6. Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息

    跨平台这种事情不管多NB, 总要有些与原生系统交互的方法, 比如  Unity3D与iOS消息交互方法. 一: 建立一个空的Unity工程. File -->  New Project 二: 编 ...

  7. 开发腾讯移动游戏平台SDK Android版Ane扩展 总结

    本文记录了在开发 腾讯移动游戏平台SDK(MSDK) Android版Ane扩展 过程中所遇到的问题和相关解决方式 问题一:编译报错:Unable to resolve target 'android ...

  8. 使用JAVA开发微信公众平台(一)——环境搭建与开发接入

    一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...

  9. Node.js SDK与fabric链码交互开发

    1.本篇背景 前面已经对链码开发作了比较详细的介绍,并且对官方提供的 fabcar 链码进行了解读,本篇将介绍如何使用 Node.js SDK 与区块链网络中的链码进行交互. 本篇内容基本来自官方 H ...

随机推荐

  1. QQ第三方登录

    QQ第三方登录 在Android应用程序的开发过程中,很多时候需要加入用户登录/注册模块.除了自己动手设计登录界面并实现相应功能外,现在还可以借助百度.腾讯等开发者平台提供的第三方账号登录模块.最近研 ...

  2. 判断一个点是否在多边形内部,射线法思路,C#实现

    感谢原作者,原理请看原作者的文章 http://www.html-js.com/article/1517 C#实现 public string rayCasting(PointF p, PointF[ ...

  3. android之简易新闻客户端

    将一个新闻信息保存到一个XML文件中,并将放在服务器下.通过手机客户端来从服务器下载该文件并解析显示. news.xml <?xml version="1.0" encodi ...

  4. 24.C#LINQ TO XML(十二章12.3)

    自己也写了那么多,但还有很多不懂,有点浮躁吧,但饭还是要吃啊,说说LINQ TO XML吧. LINQ TO XML位于System.Xml.Linq程序集,并且大多数类型位于System.Xml.L ...

  5. attempted to assign id from null one-to-one

    one-to-one在hibernate中可以用来作为两张表之间的主键关联,这也是hibernate中主键关联的一种用法,这样在一张表中的ID,在生成另外一张表的同时回自动插入到相应的ID字段中去,相 ...

  6. Html-Css-div标签嵌套浮动div标签时无法撑开外部div的解决

    当DIV1里面嵌套有一个DIV2,当DIV2设置了浮动,那么DIV1是无法被撑开的 当DIV1里面嵌套有一个DIV2,当DIV2设置了浮动,那么DIV1是无法被撑开的,也就是说DIV2在这里相当于浮在 ...

  7. meta之renderer

    今天不小心看了下慕课网首页的源码,看到有一行 1 <meta name="renderer" content="webkit|ie-comp|ie-stand&qu ...

  8. oracle存储过程执行中输出日志文件

    create or replace procedure p_outputdebug(a varchar2,b varchar2,c varchar2)is vFileName varchar2(100 ...

  9. css常用技巧

    去点号 list-style:none; 字体居中 text-align:center; 链接去下划线 text-decoration:none; 鼠标禁止右键 <body oncontextm ...

  10. 详解Python对象属性

    在面向对象编程中,公开的数据成员可以在外部随意访问和修改,很难控制用户修改时新数据的合法性.解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提供对私有数据成员的读取和修改操作,修改私 ...