Unity 5.4.3f1 与 Xcode 8 项目导出与合并的详细步骤

Unity 5.4.3f1 与 Xcode 8 项目导出与合并的详细步骤

Xcode 版本:Xcode 8

1. 导出 Unity 项目

1. File->Build Settings->ios->将平台切换为iOS平台,

2.播放器设置.....(此处设置错误会导致导入iOS项目后出现200+错误)

3.File->Build Settings->Build(另存为xcode文件)

-----------我就是分割线---------------

2.合并Unity项目(两种方式,一种是将您的项目集成到Unity项目中,另一种是将Unity项目集成到您的项目中)

(1)将原有项目集成到Unity项目中

1、将原有的项目直接拖入Unity生成的项目中,在Unity项目上进行开发。

2、删除原工程的main.m文件、AppDelegate.h、AppDelegate.m文件,若有pch文件也可以将其与Unity工程中的Pch文件合并后删除(删除前请备份相关文件,合并后检查pch路径是否正确)。

3.此时程序的主函数入口为Classes/main.mm,AppDelegate为Classes/UnityAppController.mm,程序的pch文件为Classes/Prefix.pch。将原有项目对应代码复制到对应文件中。

4.因为现在程序的入口点在Unity项目端,所以在Unity项目运行后,需要将原有项目的主界面添加到keyWindow中(如下图所示,调用“showGameUI”方法之后)。

(2)将Unity项目集成到原项目中

1.将Unity与iOS项目放在同一根目录,并将Unity项目中的`Classes`,`Data`,`Libraries`,以及`MapFileParser.sh`文件夹复制到自己的项目根目录中。

2.添加文件,为数据选择创建文件夹引用,为类和库选择创建组。

3.在Build settings中设置Pch文件(如果工程中已经有PCH文件,请将两个PCH文件合并)。选择Build Settings,在输入框中输入Prefix Header,找到设置路径的Prefix Header值,将工程中的PCH文件拖拽到输入框中,回车即可显示路径。这个是绝对路径,随着工程的移动unity 5.4.3f1,会找不到路径。将输入框中工程文件夹前的路径删除,替换为$(SRCROOT),这个值表示相对路径。回车即可显示设置的相对路径,如果和第7步中的路径一致,则说明路径设置正确。

或者,我的做法是把Unity Classes中Pch文件中的代码复制过来添加到我自己的Pch文件中,然后删除classes中的Pch文件。

4、将Classes中main.mm文件中的代码复制过来,将你的main.m中的代码删除,粘贴进去,删除main.mm,将main.m修改为main.mm;

5.在Build Phases中创建一个新的Run Script语句

rm -rf "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Data"

cp -Rf“$PROJECT_DIR/Data”“$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Data”

6. 在 Build 设置中设置 Header Search Paths

$(SRCROOT)/库/libil2cpp/include

$(SRCROOT)/库/bdwgc/include

$(SRCROOT)/类别/本地

“$(SRCROOT)/类别”

7. 在构建设置中设置其他 C 标志

-mno-thumb

-DINIT_SCRIPTING_BACKEND=1

8.在Build Phases中导入以下库(具体请查看导出的iOS项目中的库,不要重复导入)

9. 在 Build Phases 中,将 MRC 标签添加到所有 .mm 文件(CameraCapture.mm、MetalHelper.mm 和 DisplayManager.mm 文件除外)。

10.真机编译运行(此时运行项目即可进入unity界面)

--------------------------我就是分割线---------------------

3.在iOS项目中打开unity项目。(我们的项目入口点是main.mm,在main函数之后会调用UnityAppController.mm。也就是没有调用之前项目的AppDelegate.m文件3D交通工具,可以删除。)

1.将项目启动方式从先启动unity view改为先启动我们的ViewController

我们添加了一个myPageEnable变量,用来表示我们的myPage是否已经启动,如果已经启动,就不会再执行了。注释掉startUnity:,替换为myPageEnable:,如下图。(此时运行项目就会进入我们自己的界面了)

我使用了一个简单的方法来保存当前应用程序和当前自我(以便稍后单击按钮进入统一)

这样我们就可以实现项目了,直接启动我们的view就可以了,其实总结起来很简单,把APP的rootViewController改成我们的,然后禁用掉原来Unity的相同功能代码就可以了。

2.在iOS中打开unity界面

首先,一旦打开 Unity,我们不需要完全关闭它。从 Unity 返回我们的 View 时,将 Unity 视图暂停到后台,并将窗口的 rootviewcontroller 设置为我们的 rootViewController

我们已经知道启动 Unity 的函数是

- (void)startUnity:(UIApplication *)application,因此只需再次调用此函数

点击我们控制器里的按钮(redpacketButton就是红包按钮)打开unity:

注意startUnity方法只能使用一次,多次调用也会导致应用崩溃,报错:“should not be reached at domain.c”,所以我们使用restartUnity(这个方法写在UnityAppController.mm里)

3.关闭unity界面(这里有两种方式,一种是调用unity里的back函数。一种就是我们自己写退出按钮)

值得注意的是,在extern "C"中,不能使用OC的self和self.window来获取appController和window,而是必须使用UnityAppController对象提供的方法GetAppController()和UnityGetGLView()。

3.1、调用Unity中的back函数(该函数要和Unity开发者沟通,统一命名),调用方法:

外部“C”无效返回(){

//您的代码

3.2 编写自己的退出按钮

当Unity View启动时,在页面中初始化一个UIView,里面有我们写好的关闭按钮,按钮点击事件方法跟上面一样。

--------------------------我就是分割线---------------------

4. 第二种积分方法

第一部分、Unity3D导出Xcode项目

1. 打开您的 Unity 项目并单击文件菜单栏中的构建设置。

2.然后会弹出一个框,点击切换平台选择iOS平台,然后在弹框中点击播放器设置...配置参数如下图,其中Auto Graphics API的配置很重要,如果勾选了,那么播放器集成之后会一直抖动!!!

4.配置完成后点击Build,等待完成,这个过程需要比较长的时间,才能生成项目的代码结构。

5.然后把上面两个红框圈出的文件夹和文件复制到我们的iOS原生项目中,合并后的目录如下

导出项目第一部分已经完成了,这部分比较简单,接下来我们开始第二部分,这也是容易出错的地方,特别是配置需要注意。

第二部分:将Unity3D导出的关键代码合并到原生iOS项目中

1.Unity导出的项目中bundleId必须和你本地iOS项目的id一致

2. 将位代码改为NO

3.删除Main.storyboard,在代码中设置控制器(为了方便窗口切换,也可以保留)

4.将Classes,Libraries,MapFileParser.sh拖入项目中(选择Copy items if needunity 5.4.3f1,选择Create groups)

将数据拖入项目中(如果需要,请选中复制项目,选中创建文件夹引用)

注:拖拽文件进项目的方式不完全相同,效果如下

5.添加框架(注意三个可选)

6.添加头文件搜索路径和库搜索路径

7.其他 C 标志 -> -DINIT_SCRIPTING_BACKEND=1

8.添加User-Defined(UNITY_RUNTIME_VERSION版本号必须与导出项目的Unity版本号一致)

GCC_THUMB_SUPPORT

GCC_USE_INDIRECT_FUNCTION_CALLS

UNITY_RUNTIME_VERSION

UNITY_SCRIPTING_BACKEND

9.添加运行脚本(注意这个脚本是包含在Unity3D导出的Xcode项目中的,所以按照同样的方法配置即可)

10.其他Linker Flags(注意添加的顺序,否则编译时可能会导致链接库失败)

11.将Unity/Classes/Prefix.pch的代码复制到刚刚新建的pch文件中,同时删除classes文件夹中的pch文件。注意:这里的删除并不是真的删除源文件,只是删除了引用而已!而且如果原有项目已经有pch文件,那么只要将Unity/Classes/Prefix.pch的代码添加到iOS原生项目的pch文件中即可,如下图:

11.将Classes/main.mm的所有内容复制到main.m,并将扩展名改为.mm

12.修改UnityAppController.h

13.在AppDelegate.hm中添加以下代码

到此iOS到Unity的调用已经基本完成,下面是我在这个过程中遇到的一些问题。

1.“仅返回类型不同的函数不能被重载”

因为objc_msgSend调用检查很严格,所以直接改成NO就行了,修改如下

2.提示函数返回值不匹配问题

原因是原生项目配置了严格检查函数返回值的,可惜 Unity3D 导出​​的项目有些函数返回值不规范,所以需要放宽 Xcode 的配置限制像素游戏素材,才能兼容返回值不符的场景

以上就是Unity3D项目合并到iOS项目的过程,在做这个项目的过程中,遇到了一个坑,就是在视频播放模式下需要保持横屏,但是其他页面都是竖屏,并且屏幕不会自动旋转。我会在下一篇文章中和大家分享我的解决办法。

5. Unity与iOS的值传递

4.1 iOS发送消息给Unity

//添加此代码,负责向Unity传递参数;(具体参数需要和Unity开发人员商量)

外部无效UnitySendMessage(const char *,const char *,const char *);

IOS使用UnitySendMessage方法调用Unity函数,该方法有三个参数:

UnitySendMessage("游戏对象", "方法",msg);

参数1是unity脚本挂载的gameobject(可以理解为unity中具体的物体或者对象)

参数2是unity脚本中需要调用的方法名

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

4.2 Unity传值给iOS这个我没用过,不过网上可以google很多例子。

结论

最近公司在开发AR红包,特意写了这篇博客给大家参考。因为是初次接触Unity,也查阅了很多资料,如果有错误还望大家指正,后续会持续更新完善集成中遇到的各种问题。

大家有什么问题可以给我发邮件(或者QQ),我看到一定会回复的:

文章来源:https://blog.csdn.net/xiaota00/article/details/71082863