Unity3d与iOS交互开发
一、Unity3d To iOS:
最近要做一个商品和人体模型T台秀相关的功能,要用到Unity3D,搜集了一些资料先保存下来。
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:SDK多版本管理和研究我也在摸索中,哪位大神比较熟悉不吝赐教,本人万分感激,之前到是看过这个http://www.xuanyusong.com/archives/2418#comments
ppps: 这种交互方式在iOS的模拟器上貌似不行,测试请使用真机;
pppps:转载来自:http://blog.csdn.net/zhao_yin
Unity3d与iOS交互开发的更多相关文章
- Unity3d与iOS交互开发——接入平台SDK必备技能
原地址:http://www.2cto.com/kf/201401/273337.html# 前言废话:开发手机游戏都知道,你要接入各种平台的SDK.那就需要Unity3d与iOS中Objective ...
- UNITY3D与iOS交互解决方案
原地址:http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 “授人以鱼,不如授人以渔”,以UNIT ...
- Unity3D与iOS的交互设计<ViewController 的跳转>
原地址:http://www.aichengxu.com/article/%CF%B5%CD%B3%D3%C5%BB%AF/28797_12.html Unity3D与iOS的交互设计<View ...
- Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息
跨平台这种事情不管多NB, 总要有些与原生系统交互的方法, 比如 Unity3D与iOS消息交互方法. 一: 建立一个空的Unity工程. File --> New Project 二: 编 ...
- Unity iOS混合开发界面切换思路
Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...
- iOS/mac开发的一些知名个人博客
王巍的博客:王巍目前在日本横滨任职于LINE.工作内容主要进行Unity3D开发,8小时之外经常进行iOS/Mac开发.他的陈列柜中已有多款应用,其中番茄工作法工具非常棒. http://onevca ...
- iOS常用开发技巧
iOS开发过程中,总有那么一些个小问题让人纠结,它们不会让程序崩溃,但是会让人崩溃.除此之外,还将分享一些细节现在我通过自己的总结以及从其他地方的引用,来总结一下一些常见小问题. 本篇长期更新,多积累 ...
- iOS蓝牙开发(二)蓝牙相关基础知识
原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...
- iOS界面开发
[转载] iOS界面开发 发布于:2014-07-29 11:49阅读数:13399 iOS 8 和 OS X 10.10 中一个被强调了多次的主题就是大一统,Apple 希望通过 Hand-off ...
随机推荐
- Linux 磁盘的分区
如果我们想在系统中新增一块硬盘,需要做什么呢? 1. 对磁盘进行分区,新建可用分区 2. 对该分区进行格式化,以创建系统可用的文件系统 3. 若想要仔细一点,可以对刚才新建好的文件系统进行检验 4. ...
- python的subprocess模块介绍
一.subprocess以及常用的封装函数运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序.在Python ...
- Ubuntu18.04启动memtest86
对于Ubuntu18.04, 网上搜的结果都是错的, 根本不是启动时按shift, 而是按F8. 反复重启十几次后终于误触调出了启动菜单. 使用的是USB安装盘, 并且使用的是非UFEI模式.
- unable to lock the administration错误解决
在ubantu系统上,使用 apt-get 命令或者其相对更新的APT 管理工具时,遇到 unable to lock the administration directory (/var/lib/d ...
- plsql 的三种循环
set serveroutput on declare pnum ; begin loop dbms_output.put_line(pnum); pnum :; end loop; end; / s ...
- 【非lodop的】JS和html相关博文索引
JS: eval()方法:JS-JAVASCRIPT的eval()方法. Date()对象.getFullYear() 方法.getDate()方法.console.dir()方法:LODOP打印用J ...
- [LeetCode] 316. Remove Duplicate Letters 移除重复字母
Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...
- Netty实现SSL双向验证完整实例
Netty实现SSL双向验证完整实例 博客分类: netty nettyssl自签证书 一.证书准备 要使用ssl双向验证,就必须先要生成服务端和客户端的证书,并相互添加信任,具体流程如下(本人调试 ...
- Google Drive网盘文件直链获取一键脚本
说明:本脚本可以将Google Drive网盘的文件分享链接或者文件ID变成直链,方便我们在很多情况下调用.只支持文件分享,不支持文件夹.文件分享ID为26到48位. 使用 1.需求 wget.g ...
- 【Linux开发】【CUDA开发】Ubuntu上安装NVIDIA显卡驱动
机型为戴尔Vostro3900 显卡型号为GTX 745 对于Nvidia显卡的驱动,如今很多Linux发行版会默认使用名为nouveau的驱动程序.Nouveau是由第三方为Nvidia开发的一 ...