最近做了一个项目,需要和U3D的合作,第一次做这种项目,当两边都做完了工程,开始进行合并的时候,蒙 了,各种报错,不知所云。还好广大同行的无私奉献精神,帮我度过了难关。特此写下我的纠结路程,希望也可以帮助到遇到相同困难的你
版本介绍
U3D的版本5.4.1f
Xcode版本是8.0
这两个版本都是这时候最新的版本。
准备工作
我采用的是把U3D导出的iOS 导入到iOS工程中。
(1)一个运行都没有错误的U3DiOS工程
(2)一个运行都没有错误的iOSNative工程。
(3)一个真机,U3DiOS不做特殊处理必须在真机上进行测试,所以在编译的时候要选择设备。不然会报200个不知所云的错误。
(4)参考文档
[1]http://blog.csdn.net/dingxiaowei2013/article/details/52693421
[2]http://blog.csdn.net/dylan_lwb_/article/details/51452470#comments
开始干活了
(1)把U3D中的 Classes、Data、Libraries、MapFileParser.sh 文件先粘贴到iOSNative工程的根目录下
(2)注意这里几个文件的添加方式,如果添加方式错误了,会导致整合的彻底失败
Classes、Libraries、MapFileParser.sh 通过Add 添加到项目中,注意(选择Copy items if need 选择 Create groups)
我只有通过add添加是正确的,通过别的方式都是错误的
Data添加到项目中 (选择Copy items if needs,选中 Create folder references)这个不是通过add添加的,我的测试通过add添加是失败的。
(3)添加FrameWork
下面的这些都需要添加到iOS 原生工程中去。
注意:libiconv.2.dylib 这个的添加方法
Add other 然后全局搜索 command+shift+G 然后输入/usr/lib 查找就可以了
(4)添加runScript,这个在Xcode8的版本上不用写
(5)添加 Search Paths
(6)预处理文件.pch
需要把U3D和iOS的.pch文件整合为一个。可以通过 Prefix Header 查看工程中使用的是哪个.pch文件的路径
(7)other C Flags -> -DINIT_SCRIPTING_BACKEND=1
(8)添加User-Defined (UNITY_RUNTIME_VERSION版本号与导出工程的Unity版本号一致)
(9)将Classes/main.mm全部内容复制到iOS的main.m 并把iOS中的main扩展名改为.mm, 修改如下代码
然后要删除Classes/main.mm文件
在iOS的main.mm中做如下修改
(10)AppDelegate的修改
#import <UIKit/UIKit.h>
#import "UnityAppController.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UIWindow *unityWindow;
@property (strong, nonatomic) UnityAppController *unityController;
- (void)showUnityWindow;
- (void)hideUnityWindow;
@end
.m
- (UIWindow *)unityWindow {
return UnityGetMainWindow();
}
- (void)showUnityWindow {
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[self.unityWindow makeKeyAndVisible];
}
- (void)hideUnityWindow {
[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
[self.window makeKeyAndVisible];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//这里关于window的初始化一定要写
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
SecondHouseTabBarController * second = [[SecondHouseTabBarController alloc]init];
self.window.rootViewController = second;
self.unityController = [[UnityAppController alloc] init];
[self.unityController application:application didFinishLaunchingWithOptions:launchOptions];
[self.window makeKeyAndVisible];
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];
}
(11)UnityAppController中的修改
在我的版本中并不会报错,但是不修改程序会一直在初始化UnityAppController的时候出错,说是rootWindow没有接受到实体
@interface UnityAppController : NSObject<UIApplicationDelegate>
{
UnityView* _unityView;
CADisplayLink* _displayLink;
UIWindow* _window;
UIView* _rootView;
UIViewController* _rootController;
UIView* _snapshotView;
DisplayConnection* _mainDisplay;
// we will cache view controllers for fixed orientation
// auto-rotation view contoller goes to index=0
这里修改了。这个在Xcode8中不用修改
// UnityViewControllerBase* _viewControllerForOrientation[5];
UIViewController* _viewControllerForOrientation[5];
#if !UNITY_TVOS
UIInterfaceOrientation _curOrientation;
#endif
id<RenderPluginDelegate> _renderDelegate;
}
在UnityAppController.h文件中要做的修改
inline UnityAppController* GetAppController()
{
return [(UnityAppController*)[UIApplication sharedApplication]valueForKeyPath:@"delegate.unityController"];
}
(12)文件重复的错误
(13)升级到Xcode8的时候,出现了问题 .o文件的冲突(重复)
是因为 other link flage 中 写了 -all-load 这个去掉就可以 了
(14)删除Main.storyboard
移除Main interface中的默认Main
到此我的程序可以了,如果你的还有错误,就可以参考我的给出的参考文档。
并且其中一个参考文档是有Demo的。
后续再遇到什么问题,在更新这篇文字吧。
补充内容关于蓝色文件和黄色文件夹的区别
蓝色的是folder 黄色的是group。 那么它们有什么区别呢?
- group 和 folder的区别
group 一般只在你的工程中是文件夹的形式,但是在本地的目录中还是以散乱的形式放在一起的,除非你是从外部以group的形式引用进来的。参与编译
folder 只能作为资源,整个引用进项目,不能编译代码,也就是说,以folder形式引用进来的文件,不能被放在complie sources列表里面。不参与编译