跟着步骤走, 基本没有问题, 如果有什么问题, 可以留言. 看到就会解答
1. 准备
iOS 原生工程, unity 导出的 iOS 工程(导出项目注意参数配置, 再详说)
2. 添加 unity 工程文件到原生 iOS 工程
unity-ios项目下文件夹Classes,Libraries,Data, 文件MapFileParser,MapFileParser.sh添加到 iOS 工程目录下.注意项: 添加时选择
Copy items if needed选项,Classes和Libraries文件夹选择Create groups, 而Data文件夹选择Create folder references选项
3. 移除新增文件多余的.h (影响编译速度)
Classes->Native文件夹下的*.h文件 (选择Remove Reference)
Libraries文件夹下的libil2cpp文件夹 (选择Remove Reference)
4. 添加相关框架
[necessaryFrame
]
注意:
AVFoundation、CoreMotion、iAd的Status都是Optional,其他的都是Required
5. 配置 Bulid Settings 相关项
Enable Bitcode->NO
Other Linker Flags-> 添加-weak_frameworkCoreMotion-weak-lSystem
Header Search Paths-> 添加"$(SRCROOT)""$(SRCROOT)/Classes"$(SRCROOT)/Classes/Native$(SRCROOT)/Libraries/libil2cpp/include$(SRCROOT)/Libraries注意:根据工程实际路径来配置,
$(SRCROOT)是指.xcproj文件所在的路径,如果此处路径配置不正确,可能会出现诸如il2cpp-config.h file not found的编译错误
Library Search Paths-> 添加"$(SRCROOT)""$(SRCROOT)/Libraries"
Custom Compiler Flags->Other C Flags-> 添加-DINIT_SCRIPTING_BACKEND=1
C Language Dialect->C99 [-std=c99]
C++ Language Dialect->C++11 [-std=c++11]
Enable C++ Runtime Types->NO
Warnings-Objective C->Overriding Deprecated Objective-C Methods->YES
Warnings-Objective C->Unintentional Root Classes->YES
新增User-Defined项(顶部+号)
GCC_THUMB_SUPPORT->NO
GCC_USE_INDIRECT_FUNCTION_CALLS->NO
UNITY_RUNTIME_VERSION->5.4.0f3(注意: 此处是 unity 的版本号)
UNITY_SCRIPTING_BACKEND->il2cpp
6. 新建 pch 文件并配置路径
设置
Prefix Header的路径
Precompile Prefix Header->YES
把 unity-ios Classes文件夹下的Prefix.pch的内容全部复制粘贴到PrefixHeader.pch文件的宏定义内部
7. main.m 程序启动配置
重命名
main.m->main.mm
复制Classes文件夹的main.mm全部内容, 覆盖Supporting Files->main.mm内容(到这步Classes文件夹下的main基本就没用了)
修改Supporting Files->main.mm-> 替换内容const char* AppControllerClassName = @”UnityAppController”;
const char* AppControllerClassName = “AppDelegate”;
(注意: 可能修改不生效, 直接在使用AppControllerClassName的地方替换为AppDelegate)
Build Phases-> 移除Classes下的main.mm
Build Phases添加脚本 ->+ New Run Script Phase->"$PROJECT_DIR/MapFileParser.sh"
8. 修改 Classes -> UnityAppController.h
inline UnityAppController*GetAppController() {
return (UnityAppController*)[UIApplication sharedApplication].delegate;
}
替换
#import "AppDelegate.h"
inline UnityAppController* GetAppController() {
AppDelegate *delegate = (AppDelegate *)[UIApplicationsharedApplication].delegate;
return delegate.unityController;
}
9. AppDelegate.h和AppDelegate.m 加入内容
AppDelegate.h新增
#import <UIKit/UIKit.h>
@interface AppDelegate :UIResponder <UIApplicationDelegate>
@property (strong,nonatomic)UIWindow *window;
@property (strong,nonatomic)UIWindow *unityWindow;
-(void)showUnityWindow;
-(void)hideUnityWindow;
@end
AppDelegate.m新增(代码内有注意项)
#import "AppDelegate.h"
@interfaceAppDelegate ()
@end
@implementation AppDelegate
-(UIWindow *)unityWindow { // unity window
return UnityGetMainWindow();
}
-(void)showUnityWindow { // 展示 unity 界面
[self.unityWindow makeKeyAndVisible];
}
-(void)hideUnityWindow { // 展示 app 原生界面
[self.window makeKeyAndVisible];
}
-(void)showUnityView&sendMessage { // 展示 unity 界面. 传递消息
[(AppDelegate *)[UIApplication sharedApplication].delegate showUnityWindow];
// 参数说明: obj = 接受方法的物品或者模型名称, method = 方法名, msg = 要传的参数 (所有不能为 nil, 否则 crash)
UnitySendMessage("Main Camera","OnClick","交互");
}
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 注意1: 以下初始化的代码要放在 self.window 设置 rootView 的前边, 否则启动后只进入 unity 界面
// 注意2: 启动页可能会出现 unity 的启动页,需要在打包的配置里, 取消勾选 Show Unity Splash Screen, 或者新建场景启动场景替换
self.unityController = [[UnityAppController alloc]init];
[self.unityController application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}
-(void)applicationWillResignActive:(UIApplication *)application {
[self.unityController applicationWillResignActive:application];
}
-(void)applicationDidEnterBackground:(UIApplication *)application {
[self.unityController applicationDidEnterBackground:application];
}
-(void)applicationWillEnterForeground:(UIApplication *)application {
[self.unityController applicationWillEnterForeground:application];
}
-(void)applicationDidBecomeActive:(UIApplication *)application {
[self.unityController applicationDidBecomeActive:application];
}
-(void)applicationWillTerminate:(UIApplication *)application {
[self.unityController applicationWillTerminate:application];
}
@end
在 unity 界面添加控件
创建一个
UnityAppController分类, 在self.rootView上添加控件即可
来自热心网友的其他问题
初次运行, 可能遇到 MapFileParser.sh 文件访问权限限制. 打开
terminal-> 进入MapFileParser.sh目录 ->chmod 777 MapFileParser.sh收工
unity为延迟加载, 所有动画都是, 可以 搜索unity项目下的 ->[UIView setAnimationsEnabled:]-> 注释
