一、Unity3d  To  iOS:

最近要做一个商品和人体模型T台秀相关的功能,要用到Unity3D,搜集了一些资料先保存下来。

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

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

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

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

这个我自己都还没有实际使用过,有错误自行解决大致是这样。

ps:关于SDK的接入还有 android版本的尚未研究网上有很多可以参照;

pps:SDK多版本管理和研究我也在摸索中,哪位大神比较熟悉不吝赐教,本人万分感激,之前到是看过这个http://www.xuanyusong.com/archives/2418#comments

ppps: 这种交互方式在iOS的模拟器上貌似不行,测试请使用真机;

pppps:转载来自:http://blog.csdn.net/zhao_yin

Unity3d与iOS交互开发的更多相关文章

  1. Unity3d与iOS交互开发——接入平台SDK必备技能

    原地址:http://www.2cto.com/kf/201401/273337.html# 前言废话:开发手机游戏都知道,你要接入各种平台的SDK.那就需要Unity3d与iOS中Objective ...

  2. UNITY3D与iOS交互解决方案

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

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

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

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

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

  5. Unity iOS混合开发界面切换思路

    Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...

  6. iOS/mac开发的一些知名个人博客

    王巍的博客:王巍目前在日本横滨任职于LINE.工作内容主要进行Unity3D开发,8小时之外经常进行iOS/Mac开发.他的陈列柜中已有多款应用,其中番茄工作法工具非常棒. http://onevca ...

  7. iOS常用开发技巧

    iOS开发过程中,总有那么一些个小问题让人纠结,它们不会让程序崩溃,但是会让人崩溃.除此之外,还将分享一些细节现在我通过自己的总结以及从其他地方的引用,来总结一下一些常见小问题. 本篇长期更新,多积累 ...

  8. iOS蓝牙开发(二)蓝牙相关基础知识

    原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...

  9. iOS界面开发

    [转载] iOS界面开发 发布于:2014-07-29 11:49阅读数:13399 iOS 8 和 OS X 10.10 中一个被强调了多次的主题就是大一统,Apple 希望通过 Hand-off ...

随机推荐

  1. NIO Channel 管道

    Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Bu ...

  2. hadoop综合

    对CSV文件进行预处理生成无标题文本文件,将爬虫大作业产生的csv文件上传到HDFS 首先,我们需要在本地中创建一个/usr/local/bigdatacase/dataset文件夹,具体的步骤为: ...

  3. max函数比较字符串类型

    关于sql中 max函数比较字符串类型 max只比较首个字符的大小 只要首字母大,则不比较其他位置的字母,若首字母相同,则比较顺序位字母. 今天死在这了 数据库中 step字段类型char分别为 5. ...

  4. Android 系统属性-SystemProperties详解***

    创建与修改android属性用Systemproperties.set(name, value),获取android属性用Systemproperties.get(name),需要注意的是androi ...

  5. 【JS】AJAX跨域-被调用方与调用方解决方案(二)

    解决跨域问题 跨域问题说明,参考[JS]AJAX跨域-JSONP解决方案(一) 实例,使用上一章([JS]AJAX跨域-JSONP解决方案(一))的实例 解决方案三(被调用方支持跨域-服务端代码解决) ...

  6. 查看rpm包spec文件

    $ rpm --scripts -qp kernel-2.6.32-431.el6.x86_64.rpm

  7. Spring boot后台搭建一使用MyBatis集成Mapper和PageHelper

    目标: 使用 Spring  boot+MyBatis+mysql 集成 Mapper 和 PageHelper,实现基本的增删改查 先建一个基本的 Spring Boot 项目开启 Spring B ...

  8. win10锁住鼠标和键盘操作。

    以前做的一个winform自动更新程序没考虑到程序在更新过程中禁止操作被更新程序.现在加上了更新过程中锁住鼠标和大部分键盘. 碰到问题:用系统api -- BlockInput(true)锁住屏幕无效 ...

  9. 开源之路2--SSH

    SSH 为 Secure Shell (安全外壳协议)的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH是每一台Linux电脑的标准配置. SSH 是建立在应 ...

  10. pdflatex 插入eps图片

    1. 将eps图片转成pdf或者将pdf图片转成eps,也就是说一张图片有pdf.eps两种格式.方法一: \includegraphics{pic} %不要扩展名.这样pdflatex自动调相应的p ...