一、嵌入条件:
- 已有可以运行正常的iOS项目
- 已经用Unity打出xcode项目,且可以正常运行
二、运行环境
- Unity 2019.2.5f1
- Xcode 10.3
三、整合文件
-
将Unity导出的Xcode项目文件夹中的 Classes、Data、Libraries、MapFileParser.sh 文件复制到iOS工程的根目录下

-
在iOS工程添加上这几个复制过来的文件 需要注意的是Data文件夹的添加方式不同 如果添加方式错误了,会导致整合的彻底失败
-
Classes、Libraries、MapFileParser.sh 通过Add 添加到项目中,注意(选择Copy items if need 选择 Create groups)
-
Data添加到项目中 (选择Copy items if needs,选中 Create folder references)


添加完成后

-
-
以Remove Reference 的方式删除 Libraries 下的 libil2cpp 文件夹
-
以Remove Reference 的方式删除 DynamicLibEngineAPI-functions.h和DynamicLibEngineAPI.mm文件(这点在我找的所有教程中都没有提到,搞了很久才找到国外大神的提示,后来发现Unity导出的Xcode工程确实没有这两个文件的引用)没有删除的话,会报下面的错误:
No member named 'GetSystemTimeAsFileTime' in 'il2cpp::icalls::mscorlib::System::DateTime' No member named 'CultureData' in namespace 'il2cpp::icalls::mscorlib::System::Globalization' -
以Move to Trash 的方式删除 Classes文件夹下的 main.mm 和 Prefix.pch 文件,不过需要将其中内容转移到iOS工程中的main.mm 和 Prefix.pch文件中,如果没有Prefix.pch文件,需要在项目中添加(因为是运行的重要文件,在文件内容转移时,以iOS工程的正常运行为主)
四、添加framework
这个地方每个教程里写的虽然都大差不差,但是还是有区别,最好按unity导出的xcode项目里的framework将iOS项目里缺少的framework都添加上,需要注意三点:
- libiconv.2.dylib 这个的添加方法
Add other 然后全局搜索 command+shift+G 然后输入/usr/lib 查找就可以了 - 注意一些framework的Status 为 Optional 而不是一般的 Required
- 不要重复添加
五、系统环境配置,参考下面这几个点,将iOS工程按照Unity导出的xcode工程保持一致
-
在Build Phases 中添加 runScript

-
Build Setting 中需要将iOS工程按照Unity导出的xcode工程对应起来的配置 (注意保持顺序一致和路径正确)
- 头文件和库文件,Header Search Paths 和 Library Search Paths (保证路径正确)
- Enable Bitcode 、Other C Flags 、Other C++ Flags 、 Other linker flags(保持顺序一致,注意在other C flags 中添加
-DNET_4_0) - C Language Dialect 中需要注意,C99和C11 可能不支持__weak,typeof这样的语法,会让iOS工程中有这些语法的地方都报错,包括cocoapod里的内容,所以要选C++11或者保持iOS工程中的内容,不做改变就好
- 添加设置属性,参考Unity导出的工程中的值,不能乱填。
点击如下图的“+”号,选择4个Add User-Defined Setting
设置key值:GCC_THUMB_SUPPORT
设置key值:GCC_USE_INDIRECT_FUNCTION_CALLS
设置key值:UNITY_RUNTIME_VERSION
设置key值:UNITY_SCRIPTING_BACKEND,设置Value值: il2cpp
-
选择Info.plist
添加key值:Unity_LoadingActivityIndicatorStyle,设置Value值:-1
这会 command B 应该就能成功了,算是嵌入成功,接下来就可以调试Unity里的内容了
六、在iOS工程中运行Unity的内容
-
在Supporting Files文件夹中创建新的PCH文件,命名为PrefixHeader,如下图所示勾选上Target,将Classes中的Prefix.pch文件的内容全部拷贝到Supporting Files中的PrefixHeader.pch中。 在Project->MyProject->Build Setting 设置Precompile Prefix Header: YES 并在Prefix Header中添加: $(SRCROOT)/ARHere/PrefixHeader.pch
-
将Classes/main.mm全部内容复制到iOS的main.m 并把iOS中的main扩展名改为.mm,但是UIApplicationMain() 函数里的内容保持iOS工程里的内容不变 具体运行可以参考这位的www.jianshu.com/p/487015f3b…
参考自:
www.jianshu.com/p/487015f3b…
www.jianshu.com/p/9949d6ed0…
www.pianshen.com/article/445…
github.com/keyv/iOSUni…
forum.unity.com/threads/il2…