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