ar导出ios程序 unity
2018-09-26 17:19:00 weixin_34138056 阅读数 6

最近接到一个需求,要接入AR,给了个Vuforia官网地址,还有AR开发部们同事给的demo(需求以demo为主),就直接开干,查了iOS原生接入Unity的资料,还是遇到了很多问题,在此总结记录一下。

先看效果:
5026441-5690d0b435abe2a2.jpeg
首页
5026441-c68f67ed14050ff8.jpeg
AR扫描后视频播放

目录

配置依赖
Demo封装
问题汇总

配置依赖

首先,我们拿到的demo结构是这样的:


5026441-c76995c455966474.png
demo目录
    1. 将 Classes 和 Libraries 文件夹,以及Framework文件夹中的 Vuforia.framework 拖入工程,按下图方式:
      5026441-d4f785f7bfff702c.png
      导入Classes,Libraries及Vuforia.framework

      -------------------------------------------------->>>

    1. 将 Data 文件夹拖入工程,按下图方式:
      5026441-a741fc37edc2215c.png
      导入Data

      -------------------------------------------------->>>

    1. 结果是这样的(注意文件夹的路径,导入 Header Search Paths按此参照):
      5026441-15fbd5e44a667037.png
      拖入后

注:需将 Data / Raw 文件夹内的Vuforia文件夹按步骤二添加到如下位置,否则会扫描无反应:


5026441-da729ee4f1cc5f25.png
Vuforia

-------------------------------------------------->>>

  • 4.将 Classes 文件夹 main.mm 内容复制到自己项目(ARTest)中的 main.m 中 ,然后ARTest的 main.m 后缀改为 main.mm,删除 Classes 文件夹中的 main.mm (Move To Trash)有报错先忽略, 代码如下图:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#include "RegisterMonoModules.h"
#include "RegisterFeatures.h"
#include <csignal>

static const int constsection = 0;

void UnityInitTrampoline();

const char* AppControllerClassName = "UnityAppController";
int main(int argc, char * argv[]) {
    
    @autoreleasepool {
        UnityInitStartupTime();
        UnityInitTrampoline();
        
        UnityInitRuntime(argc,argv);
        RegisterMonoModules();
        RegisterFeatures();
        
        std::signal(SIGPIPE, SIG_IGN);
        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

-------------------------------------------------->>>

    1. 在build Setting --> other Link Flags 下做如下修改:
 -weak_framework CoreMotion -weak-lSystem
5026441-356f24dafab6dff4.png
other Link Flags

-------------------------------------------------->>>

    1. 在build Setting --> Header Search Paths 下做如下修改:
"$(SRCROOT)/ARTest/Unity" 
"$(SRCROOT)/ARTest/Unity/Classes"
"$(SRCROOT)/ARTest/Unity/Classes/Native"
"$(SRCROOT)/ARTest/Unity/Libraries"
"$(SRCROOT)/ARTest/Unity/Libraries/libil2cpp/include"
                  (不同项目需要按照文件在工程中的路径来确定,本次路径参照步骤三图片所示路径)

如图所示:
5026441-e3c3f05d5253022a.png
Header Search Paths

-------------------------------------------------->>>

    1. 在build Setting --> Other C Flags 做如下修改:
-DINIT_SCRIPTING_BACKEND=1 -fno-strict-overflow -DRUNTIME_IL2CPP=1

如图所示:
5026441-b6684ad4f62fd837.png
Other C Flags

-------------------------------------------------->>>

  • 8.在build Setting --> Precompile Prefix Header做如下修改:如图所示:
    5026441-02fd402c3bf405c7.png
    precompile prefix header

注:若ARTest项目有pch 文件,需合并pch 文件,将Classes内的prefix.pch 内容全部拷贝到本项目中的pch 中,否则编译会报错,如图:
5026441-6d4f2f75968efcec.png
PCH文件合并

-------------------------------------------------->>>

  • 9.在build Setting 做如下操作:
    5026441-01ac0b93abbe99f5.png
    Add-user-defined

    加入如下参数:

GCC_THUMB_SUPPORT:NO 
GCC_USE_INDIRECT_FUNCTION_CALLS:NO 
UNITY_RUNTIME_VERSION:2018.2.3f1  <--这个值可能不一样,根据自己unity-demo来 
UNITY_SCRIPTING_BACKEND: il2cpp

结果:
5026441-555b512d04717217.png
Add-user-defined
  • 10 build Setting --> bitcode关闭
  • 11 添加依赖库,根据demo 来:


    5026441-9e0ed3b4473d0e06.png
    依赖库,根据demo来

Demo封装(以上编译成功再做如下操作)

#import <UIKit/UIKit.h>
@class DTPUnityController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;
@property (nonatomic , strong)UIWindow *unityWindow;
@property (nonatomic, strong) DTPUnityController *unityController;
- (void)showUnityWindow;
- (void)hideUnityWindow;

@end

AppDelegate.mm:

#import "AppDelegate.h"
#import "DTPUnityController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    _unityController = [[DTPUnityController alloc]init];
    return YES;
}

#pragma mark ---------------unity开启与隐藏
- (UIWindow *)unityWindow
{
    if (!_unityWindow) {
        if (!UnityGetMainWindow()) {
            _unityWindow = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
        }else{
            _unityWindow = UnityGetMainWindow();
        }
    }
    return _unityWindow;
}
- (void)showUnityWindow
{
    [self.unityWindow makeKeyAndVisible];
}

- (void)hideUnityWindow
{
    [self.window makeKeyAndVisible];
    [self.unityController pauseUnity];
}

@end
  • 2.新建一个类 DTPUnityController 继承自 UnityAppController 以下是 .h 内容:
#import "UnityAppController.h"

@interface DTPUnityController : UnityAppController

+ (instancetype)instance;

- (void)initUnity;

- (void)pauseUnity;

- (void)startUnity1;

- (BOOL)isPaused;

@end

.m 内容:

#import "DTPUnityController.h"

#import "UnityAppController.h"
#import "UnityAppController+ViewHandling.h"
#import "UnityAppController+Rendering.h"

#import "DisplayManager.h"
#import "UnityView.h"

#include "RegisterMonoModules.h"
#include "RegisterFeatures.h"
#include <csignal>
#import "AppDelegate.h"

@interface DTPUnityController()

@property (nonatomic, assign) BOOL isInitUnity;

@end

@implementation DTPUnityController

+ (instancetype)instance {
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    return delegate.unityController;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.isInitUnity = NO;
        // 注册Unity的事件
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
        
    }
    return self;
}

void UnityInitTrampoline();

- (void)initUnity {
     AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    if (!self.isInitUnity) {
        
        [super applicationDidBecomeActive:[UIApplication sharedApplication]];
        
        UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath] UTF8String]);
        [self selectRenderingAPI];
        [UnityRenderingView InitializeForAPI: self.renderingAPI];

        _window = delegate.unityWindow;
        _unityView      = [self createUnityView];
        
        [DisplayManager Initialize];
        _mainDisplay    = [DisplayManager Instance].mainDisplay;
        [_mainDisplay createWithWindow: _window andView: _unityView];
        
        [self createUI];
        [self preStartUnity];
        self.isInitUnity = YES;
        
        _unityView.back = ^{
            [delegate hideUnityWindow];
        };

    }else{
        [self startUnity1];
    }
     [delegate showUnityWindow];
}

- (void)pauseUnity {
    UnitySendMessage("ARCamera", "Exit", "");  // 调Unity方法 退出模型 (与unity交互)
    UnityPause(1);
}

- (void)startUnity1 {
    UnityPause(0);
}

- (BOOL)isPaused {
    if (UnityIsPaused() == 1) {
        return YES;
    }
    else {
        return NO;
    }
}

-(void)applicationDidFinishLaunching:(UIApplication *)application{
    
}

- (void)appWillEnterForeground:(NSNotification *)notification {
    [super applicationWillEnterForeground:[UIApplication sharedApplication]];
}

- (void)appDidBecomeActive:(NSNotification *)notification {
    if (nil == self.unityView) {
        return;
    }
    [super applicationDidBecomeActive:[UIApplication sharedApplication]];
}

- (void)appWillResignActive:(NSNotification *)notification {
    [super applicationWillResignActive:[UIApplication sharedApplication]];
}

- (void)appWillTerminate:(NSNotification *)notification {
    [super applicationWillTerminate:[UIApplication sharedApplication]];
}

- (void)appDidReceiveMemoryWarning:(NSNotification *)notification {
    [super applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]];
}


@end
    1. 调整demo代码,扫描页面添加返回按钮callback(UnityView.h):
5026441-f73a838dc4bec062.png
点击返回退出的回调

UnityView.mm 添加返回按钮UI, addBackBtn 方法在initWithFrame中调用:

- (void)addBackBtn{
    UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    backBtn.frame = CGRectMake(20, 20, 70, 40);
    [self addSubview:backBtn];
    [backBtn setTitle:@"< 返回" forState:UIControlStateNormal];
    [backBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [backBtn addTarget:self action:@selector(touchEvents) forControlEvents:UIControlEventTouchUpInside];
}

- (void)touchEvents{
    if (self.back) {
        self.back();
    }
}

------------------------------------->>

  • 4.在UnityAppController.h 中按如图修改:
    5026441-8e45e034b36887ca.png
    修改方法
  • 5.在ViewController中添加开启AR代码:
- (IBAction)startAR:(id)sender {
    
    DTPUnityController *vc = [DTPUnityController instance];
    [vc initUnity];
}

以上就是全部过程了。

问题汇总

    1. 第一次运行demo 扫描后发现可以播放,但没有声音,音量也开到最大,以为是bug,找了好久,后面同事提示是否手机开了静音,煞笔了。。。。
    1. 当配置环境时,出现各种头文件引用报错,看是否引用了C C++代码 是的话看下文件是否.mm 结尾,不是的话要相应做修改 。另外,多数情况是Header Search Paths 路径有误,pch 文件合并,还有frameWork路径带来的报错,当然还有build setting 中的 C Language 设置。
    1. 有些报错还是无法解决,只能重新弄个工程集成了,xcode有时会抽风。
    1. 初始化在main 函数里面进行了,然后没找到返回按钮的退出api,只能暂停,然后调用unity 的移除模型api (若没有需要与unity 工程师沟通)。
    1. 最大的坑就是好不容易集成了,扫描无反应,扫描的图片都是需要在官网先注册的,然后有对应的.dat .xml 文件,扫描不了就是这两个文件路径有问题,具体路径设置代码在哪,还希望广大高手指出,非常感激。
    1. 项目多Target时,Target名不能为中文,否则会 EXC_BAD_ACCESS 闪退,原因尚且不知。

转载于:https://www.jianshu.com/p/f325acd95290

2015-03-16 21:34:37 AWNUXCVBN 阅读数 2379

模拟器从未运行成功。

3.0.9插件导出IOS各种报错,不知所云。

更新至4.0.103 妥妥的解决了,真机测试通过。

2016-01-28 13:46:16 k1liang 阅读数 366

1、在吧我们的项目导出到IOS时必须得把PlayerSettings的Scriptingg backend选成IL2CPP

2、得把Graphics API选成OpenGL ES 2.0,要不然渲染人物时shader会出错,

3、项目中有人写了个类继承Dictionay<string,string>,在iPad上跑时会崩溃,改成包含关系就好了,这也是个坑

4、

2014-04-11 16:49:00 weixin_33725722 阅读数 2

效果图

原生OC开发IOS

Unity开发IOS

重要步骤

网上关于这类教程的文档也比较多,当然并不一定你照着做就能一帆风顺的能够实现,或许是因为一些软件是老版本,又或者是其他细节性的没注意到,我也是照着做然后出现了些问题,然后自己摸索查错才得以解决,于是记录一些较为重要的步骤防止初学者可能会比较纠结的地方!

1.首先登陆苹果开发者官方:https://developer.apple.com/,当然在做这些的前提是你已经有了$99的个人开发者账号,然后点击MemberCenter进入登陆界面

2.进入选项界面,添加设备ID

然后我们选择Devices,进入添加要调试的设备的ID

选择GetStarted,然后添加设备

这里的UDID可以查看一下Xcode中Organizer中的Identifier

3.添加AppIDs

4.然后选择Development生成证书

5.下载证书,双击打开

双击就能看到Xcode中Organizer里面已经添加了改证书许可

6.真机运行

Cmd+B编译,Cmd+R运行,就能看到如上图所示的效果图

 
 

 

转载于:https://www.cnblogs.com/luhaixing/p/3659048.html

2017-01-17 09:22:45 liuxiongtao_1124 阅读数 782

学 习了两天的Android开发,我感觉Android开发跟IOS开发和.NET平台下的开发有点不同,Android开发我更觉得跟web(Html) 倒是有类似的地方,都是节点标签显示的,当然个人理解,感觉提示也没IOS开以及.NET开发那么强,可能是我还不是太熟悉eclipse开发环境,当然 当做出东西能导入到自己的Android机还是挺兴奋的。今天晚上摸索了一下IOS真机测试,手上有Mac,ipad,从事unity开发也有些时间 了,Unity的跨平台对我而言体现在IOS上并不是很充分,主要是没有开发者证书,呵呵,今天偶然的机会,一个给力的朋友借我她的开发者证书给我使使, 我摸索了整整一晚,终于试验成功了IPad真机测试!哇咔咔,还是挺开心的!再次感谢这位朋友无私的分享账号!

效果图

原生OC开发iOS

Unity开发IOS

重要步骤

网上关于这类教程的文档也比较多,当然并不一定你照着做就能一帆风顺的能够实现,或许是因为一些软件是老版本,又或者是其他细节性的没注意到,我也是照着做然后出现了些问题,然后自己摸索查错才得以解决,于是记录一些较为重要的步骤防止初学者可能会比较纠结的地方!

1.首先登陆苹果开发者官方:https://developer.apple.com/,当然在做这些的前提是你已经有了$99的个人开发者账号,然后点击MemberCenter进入登陆界面

2.进入选项界面,添加设备ID

然后我们选择Devices,进入添加要调试的设备的ID

选择GetStarted,然后添加设备

这里的UDID可以查看一下Xcode中Organizer中的Identifier

3.添加AppIDs

4.然后选择Development生成证书

5.下载证书,双击打开

双击就能看到Xcode中Organizer里面已经添加了改证书许可

6.真机运行

Cmd+B编译,Cmd+R运行,就能看到如上图所示的效果图

来自:游戏蛮牛
0

Unity中导出iOS工程

阅读数 256

没有更多推荐了,返回首页