iOS与Unity3D交互

最近游戏组让配合开发一个 “在Unity中点击按钮弹出原生二维码扫码页面 -> 再把获取到的二维码信息传回给Unity” 的功能,于是我就开始了学习iOS与Unity3d交互的不归路~。

由于对Unity不熟,导出的Xcode工程跟平时用的Xcode也有些差异,遇到了很多没遇到过的问题,只能慢慢摸索,慢慢解决。

刚开始在网上下载下来的Xcode Demo无法在真机上运行(在模拟器上正常)、添加不了Pod,只好自己新建一个干净的Unity工程,仿照Unity Demo编写交互代码再重新导出Xcode工程,没有问题了再对接二维码扫码的功能。

在Unity中点击按钮“跳转iOS” -> 在App中扫描二维码并把结果返回给Unity -> 在Unity中显示“二维码内容


一、代码实现:


1、Unity代码:

添加一个C#文件,添加实现代码。

// Unity代码

using UnityEngine;

using System.Collections;

using System.Runtime.InteropServices;

public class Test : MonoBehaviour {

    public GameObject cube;

    // DllImport这个方法相当于是告诉Unity,有一个unityToIOS函数在外部会实现。

    // 使用这个方法必须要导入System.Runtime.InteropServices;

    [DllImport("__Internal")]

    private static extern void unityToIOS ( string str );

    public string scanStatus;//二维码扫描结果

    void OnGUI(){

         // 当点击按钮后,调用外部方法

         if (GUI.Button (new Rect (100, 100, 200, 60), "跳转IOS")) {

             // Unity调用ios函数,同时传递数据

             unityToIOS ("Hello IOS");

         }

        //控件要写在GUI里面 可以设置一个全局str,赋值,OnGUI是每秒都会自动刷新。

       GUI.Label (new Rect (100, 200, 400, 60), scanStatus); 

    }

    // 用户取消了扫码

    void cancelScan(string str){

         scanStatus = str;

    }

    // 获取二维码成功

    void getQRSuccess(string str){

         scanStatus = @"二维码内容:" + str;

    }

    // 向右转函数接口

    void turnRight(string num){

         float f;

         if (float.TryParse (num, out f)) {// 将string转换为float,数据之间的传递只能以string类型

             Vector3 r = new Vector3 (cube.transform.rotation.x, cube.transform.rotation.y - 10f, cube.transform.rotation.z);

             cube.transform.Rotate (r);

         } 

}}


2、iOS代码:

iOS端主要在UnityAppController.mm文件中编写代码 (创建一个LARManager.h文件并创建一些交互方法)。

// MARK: - 直接加载unity页面

- (void)startUnity:(UIApplication*)application{

    //新增代码

    [self showUnityPage];

    /* 隐藏了一些Unity代码 */

}

// MARK: - 展示Unity页面

- (void)showUnityPage {

    if ([LARManager sharedInstance].unityIsPaused) {

        UnityPause(false);//打开Unity

        [LARManager sharedInstance].unityIsPaused = NO;

        //设置rootView为Unity界面

        self.window.rootViewController = self.rootViewController;

 }}


iOS调用Unity:通过UnitySendMessage方法实现。

UnitySendMessage("gameobject", "Method", msg);

参数一为unity脚本挂载的gameobject

参数二为unity脚本中要调用的方法名

参数三为传递的数据,*注意:传递的数据只能是char 类型

// MARK: - iOS传递事件给Unity ScanDelegate

//取消扫描

- (void)cancelScan {

    [self showUnityPage];

    UnitySendMessage("Main Camera", "cancelScan", [@"取消扫描" UTF8String]);

}

//获取二维码信息成功

- (void)getQRSuccess:(NSString *)str{

    [self showUnityPage];

    UnitySendMessage("Main Camera", "getQRSuccess", [str UTF8String]);

}

- (void)turnRight{//右转

    const char* str = [[NSString stringWithFormat:@"10"] UTF8String];

    UnitySendMessage("Main Camera", "turnRight", str);//IOS调用Unity的方法,通过UnitySendMessage方法实现。

}

- (void)turnLeft{//左转

    const char* str = [[NSString stringWithFormat:@"10"] UTF8String];

    UnitySendMessage("Main Camera", "turnLeft", str);

}


Unity调用iOS:实现Unity的调用方法

// MARK: - Unity传递事件给iOS (跳转到iOS界面,Unity界面暂停)

extern "C"{

    void unityToIOS(char* str){// 对Unity中的unityToIOS方法进行实现

        NSLog(@"*************%s",str);// Unity传递过来的参数

        UnityPause(true);//暂停Unity

        [LARManager sharedInstance].unityIsPaused = YES;


        //扫码页面

        ScanController *vc = [ScanController new];

        vc.delegate = GetAppController().self;//添加代理

        GetAppController().scanVC = vc;

        // GetAppController()获取appController,相当于self; UnityGetGLView()获取UnityView,相当于_window; 点击按钮后跳转到IOS界面,设置界面为IOS界面

        GetAppController().window.rootViewController = GetAppController().scanVC;

}}


二、遇到的问题:


1、在Unity中: C#脚本Test和控件Cube要建立好绑定关系,不然无效.

2、(巨坑:浪费了我不少时间~.~)

Xcode:打包出来没有在IOS中实现Unity定义的交互函数,运行Xcode就报错,还以为是在网上下载的demo代码有问题。

原因:

没有实现Unity定义的交互函数_unityToIOS

解决:

在 extern "C”{中实现相关函数

3、把IOS代码拖入工程后运行__weak typeof(self) wSelf = self声明报错:

a parameter list without types is only allowed in a function definition。

原因:

可能是编译器识别不了typeof关键字

解决:

Apple LLVM 6.1 - Language设置C Language Dialect为Compiler Default或者GNU99[-std=gnu99]

4、继续报错

Undefined symbols for architecture arm64: "_kCGImagePropertyExifDictionary", referenced from: -[SGQRCodeObtain captureOutput:didOutputSampleBuffer:fromConnection:] in SGQRCodeObtain.o

原因:

引用第三方库时是直接把代码拖进工程的,可能漏了某些文件.

解决:

直接用pod导入第三方库.

5、用到了相机、相册或其他功能忘记添加访问权限配置,导致闪退

解决:

要在info.plist中添加访问权限配置


三、拓展:


1、Unity导出Xcode工程:

下载好Unity项目并打开 -> File -> Building Setting -> iOS-> Switch Platform -> Add Open Scenes -> Player Setting -> .NET 2.0 -> Build

a、首先在File->Build Settings

b、选择iOS,第一次装的时候需要先下载一个iOS支持文件,下载完成后安装。

重启unity->Build(release)

这样就创建成功一个苹果工程了

选择iOS后要点击Switch Platform,不然打不了iOS包

点击player settings->Target SDK可以选择映射出来的苹果项目是运行于模拟器的还是真机的。

2、打包上架遇坑:

在给游戏打苹果包的时候,发现在最后一步一直显示Compiling bitcode超时

原因:

Enable Bitcode设置的YES,工程进行了Bitcode编译很耗时。我查看了其他工程都是设置的NO

解决:

Build Settings->Enable Bitcode设置为NO


3、探索:(待完善)

游戏端的代码更新了,可不可以做到直接在原有的Xcode工程上替换unity相关文件,而不需要每次都重新生成Xcode工程,再在新工程上重新写一遍IOS代码;

如果必须每次都写一遍的话,那就把代码封装到工具类中,每次只需要拖入工具并改少量的代码就行。把iOS代码复用性做到最高,耦合性降到最低。

扫码相关的内容就不细说了,可以下载我的代码 MyUnityToIOS了解 提取码:feeg。里面有Unity和Xcode两端的代码,感兴趣的可以自己下载下来慢慢看~.~

资料

iOS与Unity3d交互

Unity里调用iOS原生

Unity3D与iOS的交互

swift-unity

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 前言 最近在实验室做了一个项目,用到了蓝牙通讯和U3D的交互,都有很多坑,如:IOS与Unity3D界面之间的跳转...
    Larrycal阅读 23,582评论 39 53
  • 一.小记 最近公司有个需求,需要用unity3D建立3D模型,并且实现切换功能,由于做开发时间不算长,又没有接触过...
    矫炎圻阅读 12,794评论 20 19
  • Unity3D 简介 Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游...
    ProgramDouglas阅读 1,080评论 0 0
  • 1. 关于Unity3D Unity3D(以下简称U3D)是由Unity Technologies开发的一个让玩家...
    杰嗒嗒的阿杰阅读 37,732评论 17 53
  • 前言 关于Unity和iOS的交互,在网上看了很多文章后发现,其他作者都有一个共同点,描述不完整,作者们以为大家都...
    Teun丶阅读 2,654评论 5 6