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

前言废话:开发手机游戏都知道,你要接入各种平台的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</foundation>

  

//  MyIOSSdk.m

#import "MyIOSSdk.h"

//这里引用SDK的头文件
#import "SDKPlatform.h" #if defined(__cplusplus)
extern "C"{
#endif
extern void UnitySendMessage(const char *, const char *, const char *);
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]);="" }="" }<="" pre=""><br>
这个我自己都还没有实际使用过,有错误自行解决大致是这样。
<p></p>
<p><br>
</p>
<p>ps:关于SDK的接入还有 android版本的尚未研究网上有很多可以参照;</p>
<p><br>
</p>
<p>pps:SDK多版本管理和研究我也在摸索中,哪位大神比较熟悉不吝赐教,本人万分感激,之前到是看过这个http://www.xuanyusong.com/archives/2418#comments</p>
<p><br>
</p>
<p>ppps:转载请注明来自:http://blog.csdn.net/zhao_yin</p>
<p><br>
</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. 一次非常有意思的sql优化经历

    补充:看到这么多朋友对sql优化感兴趣,我又重新补充了下文章的内容,将更多关于sql优化的知识分享出来, 喜欢这篇文章的朋友给个赞吧,哈哈,欢迎交流,共同进步. 2015-4-30补充:非常感觉编辑的 ...

  2. SVN技术交流提纲

    SVN技术交流提纲:http://lazio10000.github.io/tech/SVN/#/bored

  3. JS事件学习笔记(思维导图)

    导图

  4. 关于js的string的3个函数slice,substring,substr对比

    slice,substring,substr三个函数都是截取字符串,但是对参数的处理有区别 参数处理相似的两个函数式slice和substring slice(start,end)和substring ...

  5. C语言+SDL2 图形化编程

    程设大作业小火车第一版本是命令行界面,第二版本是图形化界面,由于egg库对以后工程开发没有用,我不想用egg库,花了很长时间浏览了一下OpenGL的中文教程,觉得好复杂,需要看很多很多才能写出个简单的 ...

  6. MyEclipse护眼模式、字体大小的调整

    1.Eclipse改变背景颜色 Windows menu --> Preference General -> Editors -> Text Editors(click),  在底部 ...

  7. ubuntu设置屏幕亮度

    楼主的本本是acer4750g ,系统是ubuntu kylin 14.04 原 笔记本ubuntu14.04无法调节屏幕亮度 http://my.oschina.net/lhplj/blog/397 ...

  8. Codevs1299 切水果

    题目描述 Description 简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果(可能有的水果被重复切),每切完一次输出剩下水果数量 数据已重新装配,不会出现OLE错误 时限和 ...

  9. Linux Systemcall By INT 0x80、Llinux Kernel Debug Based On Sourcecode

    目录 . 系统调用简介 . 系统调用跟踪调试 . 系统调用内核源码分析 1. 系统调用简介 关于系统调用的基本原理,请参阅另一篇文章,本文的主要目标是从内核源代码的角度来学习一下系统调用在底层的内核中 ...

  10. The prefix "mvc" for element "mvc:annotation-driven" is not bound 的解决方法

    添加 xmlns:mvc="http://www.springframework.org/schema/mvc" http://www.springframework.org/sc ...