iOS 中集成 Unity3D (附Demo)

作者: Gfengwei | 来源:发表于2016-06-30 22:24 被阅读7096次

    公司有个AR项目,对ios与u3d进行集成,需求如下,点击按钮进入Unity3D界面,并且能够返回,在网上找了一些方法,文章中会进行最简单的集成,最后会附上资料链接以及Demo。

    1 . 新建一个文件夹 取名字为 iOS_Unity 里面存放两个文件夹 分别取名字为 ios 和 unity .

    2. 打开U3D 选择新建(NEW)  工程名字取名字叫 nativeUnity  位置(location) 选择我们刚刚创建的IntegrateUnity文件夹下面的unity,然后点击Create project .

    3. 打开U3D之后随便创建一个东西,然后点击左上方File-->BuildSetting,此时会弹出一个框,iPad. 怎么样随意建一个U3D工程,自己网上选择ios然后点击player Setting.设置如下:iphone就选择iPhone,iPad就选择iPad

    4. 设置结束之后,然后点击Build , 选择位置是IntegrateUnity-->unity,取名字为 unity_ios ,成功导出,如图:

    5. 在真机上运行 一下 刚刚导出来的 Xcode 工程,运行成功.()

    6. 在 IntegrateUnity下面的ios里面新建一个Xcode工程取名字为nativeiOS我的是7.3Unity版本是5.3.4f1.

    7. 下面开始进行集成:新建两个文件夹分别为Unity 和 FrameWorks.在我们从Unity里面导出来ios工程中找到Libraries、Classes和Data拖进工程,此时要注意 Libraries和Classes过程中Copy items if needed -->不选    Create groups--> 选 ; 在Data时 Copy items if needed --> 不选 ,Create folder references -->选。

    8 . 下面进行删除操作( 不删除也可以,并不是真正意义上的删除 )

    libraries删除操作:

    Classes删除操作:

    选择Native然后在最底部进行.h筛选 删除Native下面的所有.h文件,几千个文件慢慢的删除,防止Xcode卡死.

    9. 新建PCH文件 然后把Classes里面的Prefix.pch文件里面的东西全部复制到刚刚所建立的pch文件中,然后在Targer->Build Settings中进行相关配置:

    Enable Bitcode  -->  NO

    Other Link Flags -->  -weak_framework CoreMotion -weak-lSystem

    对刚刚拖进来的Classes和Libraries的路径进行配置,看清路径是从Unity导出来的Xcode工程的:

    最上面 + 进行添加 导入库设置

    10. 把Classes里面的main.mm 全部复制下来 放到main.m里面 并且把main.m修改为main.mm , 并且把修改为main.mm里面的第13行(也可能行号不对自己去找就一个名字是这个的)"UnityAppController" 修改成 "AppDelegate" 然后

    11. 把Classes里面的UnityAppController.h 进行修改如图:此时报错是因为AppDelegate里面没有做修改,

    修改成下图

    12 . 对AppDelegate进行如下代码:

    此时会报错,pch文件加上一句话如下图:

    14 .此时我们对工程进行Build一下: 会报错,我的报错如下:

    在UnityAppController.h 上面加上@Class UnityViewControllerBase如图:

    此时,在进行Build , 完美 、成功.

    15. 到了最后的阶段了了,前期工作都已经做好下面就是进入到Unity3D界面:在ViewController.m里面创建一个Button,在这里就不进行截图了,点击触发方法如下:  导入AppDelegate.h文件:

    16 . 进入到了U3d界面我们如何进行返回呢,如下图,在AppDelegate.m里面的ShowUnityWindow里面 写上如下方法:

    17 . 此次进行真机运行 结果如下:

    18 . 好了,到目前为止最简单的集成就这么实现了,下面附上参考的文章:

    http://www.the-nerd.be/2015/11/13/integrate-unity-5-in-a-native-ios-app-with-xcode-7/

    推荐链接

    Demo连接  密码: 71ry

    注: demo是最近才写的Xcode版本是8.3.2 Unity版本是5.3.4f1(未更新过),demo中的工程名字可能和文章中的名字稍微有点不一样但集成步骤是一样的。网盘中有两个文件一个是Demo下载下来真机运行就可以了, 另一个是Demo中使用的Unity工程(一起做项目的Unity工程师拿来给我测试用的我这里拿来做Demo了)导入Unity中按步骤集成即可。

    相关文章

      网友评论

      • Z小新:我的一直这边报错 按照教程修改 main.mm 还是没有用呢
        clang: warning: libstdc++ is deprecated; move to libc++ [-Wdeprecated]
        ld: library not found for -liPhone-lib
        clang: error: linker command failed with exit code 1 (use -v to see invocation)
      • 码农甲:你这个 unity sdk 从哪里找来的??
        Gfengwei:同事拿来让我测试用的,就放出来了。
      • Gio_0bbd:楼主 我的Unity跟原生IOS集成后 加载沙盒的本地图片时报了这样一个错:Wrong JPEG library version: library is 90, caller expects 62
        然后加载的图片都失败 变成红色问号。请问这是什么原因? Unity版本是5.6.1p1,Xocode版本是9.0
        Z小新:楼主在不在啊 ,求救啊 ,卡在一个问题,用你的demo工程配置成功一次, 我自己的工程 怎么配置都不行
        Z小新:我的一直这边报错 按照教程修改 main.mm 还是没有用呢
        clang: warning: libstdc++ is deprecated; move to libc++ [-Wdeprecated]
        ld: library not found for -liPhone-lib
        clang: error: linker command failed with exit code 1 (use -v to see invocation)
        Gfengwei:不好意思,时间过去很久了,帮不了你了,这里只是提供了一个简单的思路。
      • 哈秋呵呵:请问集成好了,怎么发包呢
        Gfengwei:不好意思,过去这么久了才回复,正常打包就好了。
      • Noah_bin:楼主想问一下,我每次进入U3D后 退出后 U3D 并没有初始化。重新进来的时候 会卡一下 才会重新进入U3D
        Gfengwei:猜测卡一下是因为unity界面有东西要加载吧,demo中比较简单,应该是不存在这种情况的,不好意思现在才恢复。
      • paintingStyle:你好,请教下
        iOS端内部嵌入了两款AR的游戏,进入不同的场景使用 UnitySendMessage("Controller", "OpenSence",data);传递不同的参数,但是只有第一次启动他才能进入其中一个,当进入第二个发送新的消息时还是会显示第一个的游戏画面,iOS端Unity是无法关闭的,后来测试加入 UnityLoadApplication();
        Profiler_InitProfiler();
        切换偶尔是正常的,但有时候会显示错乱,麻烦看下
        (void)showUnityWindow {

        if (_didResignActive) {

        UnityPause(false);
        }
        _didResignActive = NO;

        UnityLoadApplication();
        Profiler_InitProfiler();

        self.window.hidden =YES;
        self.unityWindow.hidden = NO;
        [self.unityWindow makeKeyWindow];
        }

        (void)hideUnityWindow {

        UnityPause(true);
        _didResignActive = YES;
        Profiler_UninitProfiler();

        self.unityWindow.hidden = YES;
        self.window.hidden = NO;
        [self.window makeKeyWindow];
        }

        发送消息代码:

        (void)wjBtnDidClicked {

        [kAppDelegate showUnityWindow];

        [self toUnityPageWithValue:@"wj"];
        }

        (void)scenesBtnDidClicked {

        [kAppDelegate showUnityWindow];

        [self toUnityPageWithValue:@"scenes"];
        }

        #pragma mark - 跳转到对应的Unity页面

        (void)toUnityPageWithValue:(NSString *)value {

        // TODO: 新增代码
        //报错SendMessage: object Controller does not have receiver for function openSence! 说明UnitySendMessage传递的对象不具备相应的方法

        const char *data = [value UTF8String];

        /**
        你那边需要打开场景的话 需要 传值给 OpenSence这个函数 通过ios给unity对象传值的方式 值有两个 "wj" 和 ”scenes“

        "Controller" "openSence" "wj 或者 scenes"
        */

        UnitySendMessage("Controller", "OpenSence",data);
        }
        Gfengwei:你好,是存在这种问题的,因为从集成的代码来看是两个window进行切换的,界面并没有销毁,所以说再次进入还是之前的画面,因为项目已经搁浅了,后来就没有看过了,如果有解决方法还望告知以便于分享其它人。
      • 我想哟:AppDelegate.h file not found 如何解决的
        我想哟:@Gfengwei 我把引入的AppDelegate.h 注释啦 会崩在main函数里
        我想哟:@Gfengwei 确实是找不到AppDelegate 项目中都没有这个文件
        Gfengwei:@我想哟 demo中的吗?不会啊,有人下载是可以的,我也验证过的
      • 韩大熊宝要姓张:感谢分享.~ 谢谢~
      • 74bff15d8e2e:有扣扣吗,想跟你请教一下
      • GanGai:用了高通AR的SDK导出的工程整合到自己的app里各种问题
      • GanGai:你好,按照你的做了,然而并没有什么卵用
        GanGai:@桂_子 网上各种方式都试过了,没法整
        GanGai:@桂_子 不简单,包了很多错,无解
        :sob::sob::sob::sob::sob:
        Gfengwei:@GanGai 项目做一个版本就停下来了,好几个月没动过了,这个集成比较简单,等项目开始做了我熟悉熟悉再写个。
      • Farmers:最近在iOS工程中集成AR 后发现 ar打开屏幕一片漆黑 求教
        kentchen91:@程序员吃西瓜 请问是如何手动渲染
        Farmers:@桂_子 已经解决了 发现是需要在 appdelegate 中手动的调用渲染的方法
        Gfengwei:@程序员吃西瓜 导出问题,uniry导出时你选的可能有问题原因我也说不好,不过你可以试一下,明天给你发个图
      • Farmers:给大家 简单的集成思路 集成了 AR : 详见 github: https://github.com/jzfjay/iOSUnityVuforiaGuide
        Gfengwei:连接我拿走了啊 附在文章里面
      • 五蕴盛:你好,我导入之后老是报错,Unity_ios/Classes/Unity/DisplayManager.mm:5:10: 'UI/UnityView.h' file not found;...Unity_ios/Classes/UI/UnityViewControllerBase.mm:4:10: 'UI/Keyboard.h' file not found,请问一下有没有遇到过呢? 而且我们导出的3dxcode工程我没有找到ilb2cpp 和 Native,这两个文件,是哪里出问题了吗。注:3d工程可以运行。
        五蕴盛:@五蕴盛 我能不能把文件给您发过去看看呢?如果您有时间的话。
        五蕴盛:@桂_子 您好,如果没有这两个文件,还可以照着文章操作吗?我看老外里面也有这两个文件。很无脑啊
        Gfengwei:@五蕴盛宋帅杰 u3d工程不一样导出来的会有差别,我见过的导出来都有你刚说没找到的那两个文件,你这报错我没遇到过。
      • 陈_某_某:UnityAppController.h里面的


        #import "AppDelegate.h"

        NS_INLINE UnityAppController*GetAppController()
        {
        AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
        UnityAppController *currentUnityController = (UnityAppController *)[app valueForKey:@"unityController"];

        return currentUnityController;

        }



        这句一直报错。。找不到AppDelegate。。 :cry:
        Gfengwei:NS_INLINE UnityAppController* GetAppController()
        {
        NSObject<UIApplicationDelegate>* delegate = [UIApplication sharedApplication].delegate;
        UnityAppController* currentUnityController = (UnityAppController *)[delegate valueForKey:@"unityController"];
        return currentUnityController;
        }
        Gfengwei:@桂_子 看不出来
        Gfengwei:@_iOSer 你就导入个头文件,就找不到了,我也不知道是哪里错了,你写的是看出来错。
      • Aaron丶丶:我前年也按照那个英文原文集成的,集成了要半个多小时还是各种报错,唉
        我的大名叫小爱:@Gfengwei 参考生成的xcode的配置 一个个来 不会错的。
        Gfengwei:@Aaron丶丶 这个写的时候仔细点,不会错,但这是最简单。
      • 山野不村夫:作者人很好,单身的妹子可以撩哦
        Gfengwei:@桃花岛主黄老师 :stuck_out_tongue_closed_eyes:

      本文标题:iOS 中集成 Unity3D (附Demo)

      本文链接:https://www.haomeiwen.com/subject/kekfjttx.html