U3D和iOS的整合问题

最近做了一个项目,需要和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。 那么它们有什么区别呢?

  1. group 和 folder的区别
    group 一般只在你的工程中是文件夹的形式,但是在本地的目录中还是以散乱的形式放在一起的,除非你是从外部以group的形式引用进来的。参与编译

folder 只能作为资源,整个引用进项目,不能编译代码,也就是说,以folder形式引用进来的文件,不能被放在complie sources列表里面。不参与编译

http://www.cnblogs.com/ygm900/p/3627501.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值