跟着步骤走, 基本没有问题, 如果有什么问题, 可以留言. 看到就会解答
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:] -> 注释