软件环境
- Unity:2017.1.1f
- iOS:Xcode9.1
unity工程打包:
File->Build Settings->Player Settings
-
注意点:打包时为Release模式
-
静静等待,打包完文件目录如下,我们要用的为红色部分(MapFileParser.sh)。
整合进原有的iOS项目中
-
将Classes,Libraries,MapFileParser.sh拖入到项目中,勾选Copy items if needed,Creat groups(文件夹为黄色)
-
将Data拖入到项目,勾选Copy items if needed,勾选Create folder references.(文件夹为蓝色)
开始配置 build settings(最麻烦的开始)
Bitcode 设为NO;
在info.plist文件中删除Main storyboard file base name键值对.
-
添加framework(注意Optional的两个)添加哪些framework,请参照你从Unity导出来的项目一一添加
-
添加Header Search Paths(注意路径配置)
-
添加Library Search Paths
other C Flags/other C++ Flags设置
$(inherited)
-DINIT_SCRIPTING_BACKEND=1
-fno-strict-overflow
-DRUNTIME_IL2CPP=1
-
添加 User-Defined
GCC_THUNB_SUPPORT -> NO
GCC_USE_INDIRECT_FUNCTION_CALLS -> NO
UNITY_RUNTIME_VERSION -> 你导出项目的Unity版本
UNITY_SCRIPTING_BACKEND - il2cpp
-
pch文件合并
1:如果原有项目有pch文件,可将其内容复制到unity->classes下的pch文件,再删掉自己的pch文件。
2:也可以将unity->classes下的pch文件中的内容复制进自己的pch中。删掉unity中的pch,配置好自己的pch文件路径;(这里我采用的是第二种方式)
合并.m文件(因为我们的项目和unity打包出来的都有.m文件,而作为程序的主入口只能存在一个.m文件)
1:合并方式保留任意一个,注意如果保留的是我们自己的,要把.m后缀改为.mm.将原来的UnityAppController改为Appdelegate,那么启动进入的就是我们自己的工程界面。
注意,从Build Phases删除Classes下的 main.mm的文件.只能存在一个
-
添加 Run Script(注意.sh文件路径)
"$PROJECT_DIR/BooMoji/Unity/MapFileParser.sh"
注意 MapFileParser.sh路径一定要正确
- Other Linker Flags(注意添加的顺序,否则编译的时候可能出现链接库失败)
至此编译运行你的项目应该就OK了;
可能存在问题
-
Unknown type name 'NSString'
:将Compile Sources As 改为 Objective-C++ -
"Functions that differ only in their return type cannot be overloaded"
:因为objc_msgSend calls做了严格检查,改成NO就可以了 - 提示函数返回值不匹配问题:Mismatched Return type->No(原因是原生的工程配置了对函数返回值做严格检查,很不幸Unity3D导出的工程有些函数返回值并不规范,所以需要把xcode的配置限制放开,兼容返回值不匹配的场景)
-
Semantic Issue -> Controller may reach end of non-void function
:Mismatched Return type->No -
duplicate symbol _main in xxxx.
:常见错误了. main文件重复. - 各种方法未定义或者.h文件找不到:Header Search Paths路径不正确。
- 运行后调不起unity场景问题:
- other c++ flag 配置
- metalHelp.mm文件