1、首先将导出工程的Class、Library、Data文件Copy到iOS原生工程中去,另外导出需要Copy的文件也是以导出工程为基准的,例如,使用Vuforia来开发的Unity的项目到处时还需要添加Vuforia等文件夹,其中MapFileParser是神马文件,我也不清楚,希望有了解的大神指导
将Unity工程下的3个文件夹Classes、Libraries、Data添加至iOS工程中,添加时注意选择Copy items if needed选项,Classes和Libraries文件夹选择Create groups, 而Data文件夹选择Create folder references选项。
2、添加相关的框架framework,如果Unity用的是ARKit开发的,导出来的需要添加ARKit框架
3、配置Build Settings相关选项,这些配置也是以Unity导出的工程为基准来做的
(1)Enable Bitcode->NO
(2)Other Linker Flags
添加-weak_framework CoreMotion -weak-lSystem
(3)Header Search Paths
添加以下选项:
"$(SRCROOT)"
"$(SRCROOT)/Unity5Native/Classes"
$(SRCROOT)/Unity5Native/Classes/Native
$(SRCROOT)/Unity5Native/Libraries/libil2cpp/include
$(SRCROOT)/Unity5Native/Libraries
注意:根据工程实际路径来配置,$(SRCROOT)是指.xcproj文件所在的路径,Classes和Libraries文件夹是在与Unity5Native.xcproj文件同级的Unity5Native文件夹下面的,所以SRCROOT下面要再添加Unity5Native层级。如果此处路径配置不正确,可能会出现诸如il2cpp-config.h file not found的编译错误。
4)Library Search Paths
添加以下选项:
"$(SRCROOT)"
"$(SRCROOT)/Unity5Native/Libraries"
(5)Custom Compiler Flags->Other C Flags
添加-DINIT_SCRIPTING_BACKEND=1
如果出现以上问题,可能得需要在Other C Flags中添加
-DRUNTIME_IL2CPP=1
(6)C Language Dialect选择C99 [-std=c99]
(7) 新建pch文件:PrefixHeader.pch
(8) 设置Prefix Header的路径
根据pct文件所在路径实际设置,由于我是放在Supporting Filegroup组下面的,实际在与Unity5Native.xcproj文件同目录下的Unity5Native文件夹下。
(9)Precompile Prefix Header选择YES
(10)C++ Language Dialect选择C++11 [-std=c++11]
(11)Enable C++ Runtime Types选择NO
(12)Warnings-Objective C->Overriding Deprecated Objective-C Methods选择YES
(13)Warnings-Objective C->Unintentional Root Classes选择YES
(14)User-Defined
添加如下选项:
GCC_THUMB_SUPPORT->NO
GCC_USE_INDIRECT_FUNCTION_CALLS->NO
UNITY_RUNTIME_VERSION->5.4.0f3
UNITY_SCRIPTING_BACKEND->il2cpp
4、pch文件内容替换
将Classes文件夹下的Prefix.pch文件中的内容全部复制粘贴到PrefixHeader.pch文件的
#define PrefixHeader_pch
#endif/* PrefixHeader_pch */
之间,并且引入UnityAppController.h文件如图所示:
5、Supporting Files下面的main.m
重命名成main.mm
将Classes文件夹下的main.mm文件中的全部内容复制到Supporting Files文件夹下的main.mm文件中,并进行修改:
//const char* AppControllerClassName = @”UnityAppController”;
const char* AppControllerClassName = “AppDelegate”;
Build Phases中移除Classes下的main.mm
6、UnityAppController.h
作如下修改:
//inline UnityAppControllerGetAppController()
//{
// return (UnityAppController)[UIApplication sharedApplication].delegate;
//}
#import"AppDelegate.h"
inline UnityAppController* GetAppController()
{
AppDelegate *delegate= (AppDelegate *)[UIApplication sharedApplication].delegate;
return delegate.unityController;
}
7、AppDelegate.h和AppDelegate.m
AppDelegate.h文件作如下修改:
AppDelegate.m文件作如下修改:
8、在工程的根视图中的ViewDidLoad如下
其按钮的点击事件showUnityView如下
其中,在按钮的点击事件中发送了一个通知,在UnityAppController.mm的applicationDidBecomeActive:方法中添加了一个通知,用来监听是否启动Unity
另外当Unity启动后,即不需要再次调用applicationDidBecomeActive该方法,故使用NSUserDefaults添加一个字段,来判断是否是第一次启动,故在AppDelegate的didFinishLaunchingWithOptions方法中,添加一个初始值,
并在ViewController的点击事件中,来判断是否是第一次启动,并且,Unity启动后,需要改变该字段,同时将通知中心移除。
通过这种方式可以保证,在不调用Unity时,程序的CPU占用相对较小。
其中导出的问题,常见的一些配置bug,参考
http://www.jianshu.com/p/fd52e2cf2f42
http://blog.csdn.net/dylan_lwb_/article/details/51452470
另外导出工程也可参考该博客
http://qingqinghebiancao.github.io/2016/09/07/Unity集成到iOS本地工程中/