您的当前位置:首页正文

Unity 接入原生iOS

来源:华拓网

跟着步骤走, 基本没有问题, 如果有什么问题, 可以留言. 看到就会解答

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_framework CoreMotion -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" inlineUnityAppController* 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:] -> 注释