Unity 接入原生iOS

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

1. 准备

iOS 原生工程, unity 导出的 iOS 工程(导出项目注意参数配置, 再详说)

2. 添加 unity 工程文件到原生 iOS 工程

unity-ios 项目下文件夹 Classes, Libraries, Data, 文件 MapFileParser, MapFileParser.sh 添加到 iOS 工程目录下.

注意项: 添加时选择Copy items if needed选项,ClassesLibraries文件夹选择 Create groups, 而Data文件夹选择Create folder references选项

3. 移除新增文件多余的.h (影响编译速度)

Classes->Native 文件夹下的*.h文件 (选择Remove Reference)
Libraries 文件夹下的 libil2cpp 文件夹 (选择Remove Reference)

4. 添加相关框架

[
necessaryFrame

]

注意: AVFoundationCoreMotioniAd的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"
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:] -> 注释

推荐阅读更多精彩内容