ios -Unity3D的EasyAR集成到已经有项目中。

2023-11-20

 

 近期 在做AR这一块,用EasyAR集成到iOS端,由于现在到项目已经上线,下一版本要做一个AR功能,于是迫于需求需要,自己研究和翻阅读好多集成到资料。

通过整理分出几个重要到模块,其中在这里指出Xcode9版本确实好坑,建议弃坑,该用稍微好点到版本Xcode9.1.

 

一模块.Unity3D导出iOS项目(UD,表示)。

二模块.从UD取出重要到三个文件。

三模块.新建一个iOS项目(ID,表示)

四模块.在ID配置Unity3D的环境

五模块.在ID创建Unity3D的控制器文件及代码

 

开始演示:

一模块.Unity3D导出iOS项目(UD,表示)。

1.在搞好Unity的代码开发后就可以倒出iOS版本了(如果没有AR项目,可以到EasyAR去找dome来做)。

2.导出到相关配置如标,按里面的配置好就好,注意【’允许使用相机?‘,要写,不然导出iOS后运行会崩溃】:(图是取来别人的图)

 

二模块.从UD取出重要到三个文件。

 1.三个目录,Classes,Libraries,Data。

 

三模块.新建一个iOS项目(ID,表示)

 1.引用UD项目里的三个文件,并集成到ID项目里。

 2.这里需要注意的是,Classes和Libraries目录作为Group引用,切记不要勾选copy。

 3.而Data目录不需要参与编译,作为folder引用进来即可。

文件结构如下:(可以不要创建文件夹放置,按照UD项目的结构来做)

 

四模块.在ID配置Unity3D的环境

 1.关闭bitcode。新版的Unity已经支持Bitcode但EasyAR并不支持,不关闭无法正常编译。如图:

 

2.修改Linking -> Other Linker Flags选项,添加参数 -weak_framework CoreMotion -weak-lSystem

3.修改头文件搜索目录,如图:

结构如:

"$(SRCROOT)/项目名称/Classes"

"$(SRCROOT)/项目名称/Libraries"

"$(SRCROOT)/项目名称/Libraries/libil2cpp/include"

"$(SRCROOT)/项目名称/Classes/Native"

"$(SRCROOT)/项目名称"

"$(SRCROOT)" 

 

4.修改库搜索目录,如图:

结构如:

"$(SRCROOT)/项目名称/Libraries"

"$(SRCROOT)/项目名称/Libraries/Plugins/iOS"

"$(SRCROOT)/项目名称"

 

 

5. 修改LLVM - Custom Complier Flags -> Other C Flags选项,添加两个参数: -DINIT_SCRIPTING_BACKEND=1 和 -DRUNTIME_IL2CPP=1

 

6.修改LLVM - Language -> C Language Dialect选项,选择C99

 

 

7.修改LLVM - Language - C++ -> C++ Language Dialect选项,选择 C++11

 

 8.添加三项自定义设置

  • MTL_ENABLE_DEBUG_INFO -> NO
  • UNITY_RUNTIME_VERSION -> 2017.1.1f1(当前你的Unity3d版本号,请自行替换)
  • UNITY_SCRIPTING_BACKEND -> il2cpp

 

 

9.新建一个PCH文件,并修改Precompile Prefix Header为YES,关联pch文件路径。此处新建文件名为 PrefixHeader.pch。

 

10.添加工程依赖(注意三个Optional)

 

五模块.在ID创建Unity3D的控制器文件及代码

  1.ID项目中,将Classes/下的main.mm文件里面的内容,复制全部到集成项目的Supporting Files/下的main.m文件中,然后删除Classes/main.mm,并且把文件后缀改成.mm。并且按照下图对内容进行修改

2.修改 UnityAppController文件

改之前:

改之后:(‘delegate.unityController’的unityController,是之后要建的自定义文件,用来处理AR界面处理的,不明白可以不管)

3.新建一个UnityController文件继承于UnityAppController用来处理AR界面处理(注意变成C++混编文件【把.m文件变成.mm文件】)

 


UnityController.mm文件如下:

 

//  Created by XY IOS on 2017/11/18.

//  Copyright © 2017年 陈诗友. All rights reserved.

//

 

#import "UnityController.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>

 

@interface UnityController()

 

@property (nonatomic, assign) BOOL isInitUnity;

 

@end

 

 

@implementation UnityController

 

+ (instancetype)instance

{

    return (UnityController *)[[UIApplication sharedApplication]valueForKeyPath:@"delegate.unityController"];

}

 

 

- (instancetype)init

{

    self = [super init];

    if (self) {

        self.isInitUnity = NO;

        // 注册Unity的事件

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appDidReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];

        

    }

    return self;

}

- (void)appWillEnterForeground:(NSNotification *)notification {

    [self applicationWillEnterForeground:[UIApplication sharedApplication]];

}

 

- (void)appDidBecomeActive:(NSNotification *)notification {

    if (nil == self.unityView) {

        return;

    }

    [self applicationDidBecomeActive:[UIApplication sharedApplication]];

}

 

- (void)appWillResignActive:(NSNotification *)notification {

    [self applicationWillResignActive:[UIApplication sharedApplication]];

}

 

- (void)appWillTerminate:(NSNotification *)notification {

    [self applicationWillTerminate:[UIApplication sharedApplication]];

}

 

- (void)appDidReceiveMemoryWarning:(NSNotification *)notification {

    [self applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]];

}

 

 

- (UIView *)playView

{

    return self.unityView;

}

 

static const int constsection = 0;

void UnityInitTrampoline();

void initMain() {

    @autoreleasepool

    {

//        UnityInitTrampoline();

//        UnityInitStartupTime();

        UnityInitTrampoline();

        UnityInitRuntime(0NULL);

        

        

        RegisterMonoModules();

        NSLog(@"-> registered mono modules %p\n", &constsection);

        RegisterFeatures();

        

        // iOS terminates open sockets when an application enters background mode.

        // The next write to any of such socket causes SIGPIPE signal being raised,

        // even if the request has been done from scripting side. This disables the

        // signal and allows Mono to throw a proper C# exception.

        std::signal(SIGPIPE, SIG_IGN);

        

    }

}

 

- (void)initUnity {

    

    if (!self.isInitUnity) {

        

        initMain();

        

        

        if ([UIDevice currentDevice].generatesDeviceOrientationNotifications == NO)

            [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

        

        UnityInitApplicationNoGraphics([[[NSBundle mainBundlebundlePathUTF8String]);

        [self selectRenderingAPI];

        [UnityRenderingView InitializeForAPIself.renderingAPI];

        _window = nil;

        _unityView      = [self createUnityView];

        

        

        [DisplayManager Initialize];

        _mainDisplay    = [DisplayManager Instance].mainDisplay;

        [_mainDisplay createWithWindow: _window andView: _unityView];

        

        [super applicationDidBecomeActive:[UIApplication sharedApplication]];

        

        self.isInitUnity = YES;

    }

    

}

 

- (void)pauseUnity {

    

    //[self applicationWillResignActive:[UIApplication sharedApplication]];

    UnityPause(1);

}

 

- (void)startUnity {

    

    //[self applicationDidBecomeActive:[UIApplication sharedApplication]];

    UnityPause(0);

}

 

- (BOOL)isPaused {

    if (UnityIsPaused() == 1) {

        return YES;

    }

    else {

        return NO;

    }

}

@end

 

 

4.在ViewController 文件创建一个(sbtn)按钮[驱动AR], 一个view[AR容器],要注意一点要在AppDelegate.m文件初始化UnityController

 

#import "ViewController.h"

 

 

#import "UnityController.h"

 

 

@interface ViewController ()

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    [self initUI];

    // Do any additional setup after loading the view, typically from a nib.

}

 

- (void)initUI

{

//    self.view.backgroundColor = [UIColor whiteColor];

    UIButton *sbtn = [UIButton buttonWithType:UIButtonTypeCustom];

    sbtn.frame = CGRectMake((CGRectGetMaxX(self.view.frame) - 60 ) / 2, 150, 60, 40);

    sbtn.backgroundColor = [UIColor purpleColor];

    [sbtn setTitle:@"AR开始" forState:UIControlStateNormal];

    [sbtn addTarget:self action:@selector(Actions) forControlEvents:UIControlEventTouchDown];

    [self.view addSubview:sbtn];

    

//    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

//    button1.frame = CGRectMake((CGRectGetMaxX(self.view.frame) - 60 ) / 2, 150 + 40, 60, 40);

//    [button1 setTitle:@"AR暂停" forState:UIControlStateNormal];

//    [self.view addSubview:button1];

//    button1.backgroundColor = [UIColor redColor];

//    [button1 addTarget:self action:@selector(clickHandler1:) forControlEvents:UIControlEventTouchUpInside];

 

    

    // 供Unity显示的View

//    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(sbtn.frame) + 50, CGRectGetWidth(self.view.frame), 400)];

    UIView *view = [[UIView alloc] initWithFrame:self.view.bounds];

    [view setBackgroundColor:[UIColor grayColor]];

    [view setTag:22];

    view.hidden = YES;

    [self.view addSubview:view];

    

 

    

 

}

- (void) clickHandler1:(id)sender

{

    if ([[UnityController instance] isPaused]) {

        [[UnityController instance] startUnity];

    }

    else {

        [[UnityController instance] pauseUnity];

    }

}

 

 

- (void)Actions

{

    NSLog(@"ar");

//    self.unityController = [[UnityController alloc]init];

    [self.view viewWithTag:22].hidden = NO;

    [[UnityController instance]initUnity];

    [UnityController instance].playView.frame = [self.view viewWithTag:22].bounds;

    [[self.view viewWithTag:22addSubview:[UnityController instance].playView];

 

//    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

 

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

 

@end

 

5.在AppDelegate.m文件初始化UnityController

 

7.问题收集

(1)在使用统一摄像头的时候黑屏

问题表现为,在使用Unity打包出来的项目运行是正常的,但是集合到现有项目的时候,摄像头显示区域是黑屏。错误码是:EasyAR is running on an unsupported graphics device of type -4
解决的方法:

 

运行结果:

 

 

 

转载于:https://www.cnblogs.com/shenlaiyaoshi/p/7856577.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios -Unity3D的EasyAR集成到已经有项目中。 的相关文章

  • 将 const char* 转换为 NSString * 并转换回来 - _NSAutoreleaseNoPool()

    我正在尝试将 const char 转换为 NSString 然后将其转换回来 它有效 但我得到 NSAutoreleaseNoPool Object 0x100550a40 of class NSCFArray autoreleased
  • 命令 /usr/bin/codesign 失败,退出代码 1

    我正在尝试在我的手机上测试一个应用程序 我不断收到此错误 Command usr bin codesign failed with exit code 1 我已经添加了配置文件并完成了 Apple iPhone 门户上的设置 我已经看了这个
  • .plist 中的 Xcode4ExternalHosts

    我是 Xcode 和 Mac 环境的新手 我正在尝试设置 PhoneGap Cordova 应用程序 并且我得到了 ERROR whitelist rejection 我进行了彻底的 Google 搜索 一切都表明我需要编辑我的 plist
  • 错误:“会员中心没有注册任何设备”- UDID 无效?

    我收到错误 找不到匹配的配置文件 针对您的 UDID 所选团队没有 iOS 开发者计划成员资格 是的 它有 它处于活动状态 和 无法创建配置文件 因为您的团队没有在会员中心注册设备 请连接设备并启用开发 然后将其添加到会员中心 我已经在会员
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • iOS:在 didFinishLoad 之后调整 UIWebView 的大小(内容应该适合而不滚动)

    我绝对无法调整我的大小UIWebView My UIWebView在 h 中声明并在 IB 中连接 IB 中的高度是 110 但是我的文本高度约为 1500 现在我想更改高度 以便无需滚动即可阅读全文 什么代码可以调整我的大小UIWebVi
  • 检查 ARReferenceImage 是否在相机视图中不再可见

    我想检查一下是否AR参考图像 https developer apple com documentation arkit arreferenceimage在相机视图中不再可见 目前我可以检查图像的节点是否在相机的视图中 但是当AR参考图像
  • Xcode 7.1 在归档 swift ios 应用程序时挂起

    Xcode 7 1 在归档应用程序时 挂在 复制 Swift 标准库 处 知道为什么吗 对于面临同样问题的其他人 在尝试了其他所有方法并失败后 通过重新启动 mac 来修复它 D
  • OS X Server 持续集成 ipa 发行版

    我们有一个配置了 SSL 证书并启用了 Xcode 的 osx 服务器 在将 OSX Server 更新到 3 2 1 和 Xcode 6 0 1 之前 一切正常 我们遇到的问题是 当集成完成后 我们单击设备上的安装按钮 它会尝试下载 但会
  • 奇怪的 UIView 坐标问题

    我正在编写一个通用应用程序 因此 我进行了设置 以便我的 XIB NIB 不是使用视图控制器创建的 而是单独创建的 然后通过将 XIB 上的类名设置为相应视图控制器的类名来链接到视图控制器 并且将文件所有者的视图链接到 XIB 上的视图 然
  • Xcode9:修复范围内的所有内容始终处于禁用状态

    Xcode9 编辑器 修复范围内的所有内容始终处于禁用状态 我怎样才能启用它 在新的 Xcode 版本 9 2 9C40b 中进行了更新 效果非常好
  • 无法找到任何至少支持 iOS 8.0 的 Xcode 安装

    我已经有一段时间没有使用 Appecelerator Titanium 的开发工具了 Studio 和 CLI 现在我尝试在 iOS 模拟器中运行现有的应用程序 从工作室我无法选择 iOS 模拟器 当我使用 CLI 并执行 appc run
  • iPhone X - 设置主页指示器周围区域的颜色

    当我尝试将工作表与 iPhone X 的安全区域对齐时 我对 Xcode 还很陌生 它在工作表下方留下了一个透明区域 有没有办法设置该区域的填充而不扩展纸张或在安全区域之外对齐 这是我的小扩展 如果有人可以建议改进以不通过 幻数 标签访问添
  • iOS 9.0 以下版本的 Storyboard 参考

    我正在使用新的故事板参考 据苹果公司称文档 https developer apple com library ios recipes xcode help IB storyboard Chapters AddSBReference htm
  • self.navigationController?.popViewControllerAnimated 来自 UIAlertController

    我是 swift 的新手 但我想我已经掌握了它的窍门 但这对我的进步来说是相当困难的 我想做的是 当我们找不到与用户查询相关的数据时 向用户抛出一条错误消息 然后继续将他带回之前的 ViewController 然而 我在做这件事时遇到了真
  • iOS 指定初始化器:使用 NS_DESIGNATED_INITIALIZER

    我们在 XCode 6 中引入了这个新宏 NS DESIGNATED INITIALIZER 我在网上搜索 但找不到任何关于如何使用它的好的文档 从语法上来说 我们可以这样使用它 instancetype initWithCoder NSC
  • 在 Swift 中获取 UIPickerView 控件的选定值

    如何在 Swift 中获取 UIPickerView 控件的选定值 我尝试过这样的事情 labelTest text Spinner1 selectedRowInComponent 0 description 但这仅返回选定的索引 我需要这
  • 如何获取目标名称?

    我们知道Xcode维护着环境变量 TARGET NAME 但是如何在 Objective C 代码中访问这个变量呢 我尝试过什么 我已经添加了 TARGET NAME TARGET NAME 这位于构建设置的预处理器宏部分 但现在我不知道如
  • Xcode 8:因特性而异,改变所有尺寸类别的布局

    我正在尝试使用 xcode 8 2 1 上的 very for Traits 功能 但是当我使用 Vary for Traits 更改一个尺寸类的布局 然后在完成后 完成变化 时 它实际上正在更改每个尺寸的布局我的故事板中的课程 例如我尝试
  • 意外运行 Xcode8 模拟器后,Xcode 8 beta 模拟器无法运行应用程序

    无法启动与模拟器的服务连接 尝试清理应用程序 重新安装它 删除派生数据 重置模拟器设置 重新启动 xCode 我还听说其他人通过重新创建模拟器来解决模拟器的问题 我也尝试过 当我按创建时 我收到完全相同的错误消息 回复中返回错误 连接无效

随机推荐

  • CVPR ICCV ECCV 论文列表 // 研究机构 链接

    文章目录 会议 CVPR 一年一次 IEEE Conference on Computer Vision and Pattern Recognition ICCV 两年一次 奇数年 IEEE International Conference
  • 【第38篇】MixConv:混合深度卷积核

    文章目录 摘要 1 简介 2 相关工作 3 MixConv 3 2 MixConv 设计选择 3 3 MobileNets 上的 MixConv 性能 3 4 消融研究 4 MixNet 4 1 架构搜索 4 2 ImageNet 上的 M
  • Linux离线安装 RabbitMQ(RabbitMQ单机安装)

    1 下载erlang和rabbitmq安装包 1 下载Erlang路径 https github com erlang otp releases 2 下载RabbitMQ路径 https github com rabbitmq rabbit
  • SQL查询与修改数据库逻辑文件名,移动数据库存储路径示例

    Author htl258 Tony Date 2010 06 26 21 51 30 Version Microsoft SQL Server 2008 RTM 10 0 1600 22 Intel X86 Jul 9 2008 14 4
  • 万向锁,简单表述,一文看懂

    万向锁问题 看了下百度知乎 居然 很少有说清楚的 想起自己第一次接触的时候 也是一头雾水 特此解释 1 什么是万向锁问题 欧拉角顺序有很多 当中比较常用的 一种 便是用 偏航 俯仰 滚转 yaw pitch roll 三个角度来描述一个旋转
  • Flink_05_状态(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 状态 状态就是一块内存 一个变量 如果要访问历史窗口 或批次 的数据
  • 运动规划入门

    原创文章 作者 tloinny 如若转载 请注明出处 古月居 https www guyuehome com 5652 感谢古月老师 古 月给的机会 让笔者有幸成为古月居签约作者 此后笔者将在古月居发布更多Robotic相关的博文 当然我也
  • gcc搜索动态链接库的路径优先级排序

    GCC运行时 Linux动态链接库的搜索路径按优先级排序为 1 编译目标代码时 Wl rpath 指定的动态库搜索路径 当指定多个动态库搜索路径时 路径之间用冒号 分隔 2 环境变量 LD LIBRARY PATH 指定的动态库搜索路径 3
  • 泊松重建算法原理介绍

    目录 1 泊松重建算法 2 泊松重建核心思想及原理 3 泊松算法流程 本文出自CSDN点云侠 原文链接 爬虫自重 把自己当个人 1 泊松重建算法 泊松重建是Kazhdan M在2006年提出的基于八叉树和泊松方程的一种网格三维重建算法 其本
  • python 爬取google总结

    1 问题 目前主流的搜索引擎 非google莫属 但其对于非法 流量异常 爬虫 请求的封锁也是异常严厉 本人前段时间有个脚本用到了谷歌搜索 具体见python之由公司名推算出公司官网 余弦相似度 当时直接使用的是一个python开源项目 但
  • Python3:官方文档的链接

    1 numpy https www numpy org cn article https numpy org 2 pandas https pandas pydata org 3 matplotlib https matplotlib or
  • 字符串最后一个单词的长度

    描述 计算字符串最后一个单词的长度 单词以空格隔开 字符串长度小于5000 输入描述 输入一行 代表要计算的字符串 非空 长度小于5000 输出描述 输出一个整数 表示输入字符串最后一个单词的长度 示例1 输入 hello nowcoder
  • 手把手教你开发第一个HarmonyOS (鸿蒙)移动应用

    移动应 开发的介绍 移动应 开发 Android IOS HarmonyOS 鸿蒙 HarmonyOS介绍 文档概览 HarmonyOS应用开发官网 2 1 系统的定义 2 1 1 系统的定位 HarmonyOS有三 特征 搭载该操作系统的
  • 快手APP内测「AI对话」

    快手 APP 现在有了 AI 对话能力 8 月 18 日晚 快手公布基于自研大语言模型应用的最新进展 快手 AI 对话 功能已经在快手 APP 安卓版本开放内测 参与测试的用户只需要在最新正式版本的 APP 上点击快手搜索首页右上角 AI
  • 常用Shell命令汇总-用户和用户组管理

    不知道大家平时有没有跟我一样的感受 就是很多shell命令自己其实用过 但时间一久又忘记了 导致又要到处百度 开始写这个系列的目的第一是为了总结 第二是为了以后忘记时可以直接到这找哈哈哈哈哈 平时在百度时还发现一个问题 就是其实我只想要最常
  • 2023华为OD机试真题【机房布局/模拟】

    题目描述 小明正在规划一个大型数据中心机房 为了使得机柜上的机器都能正常满负荷工作 需要确保在每个机柜边上至少要有一个电箱 为了简化题目 假设这个机房是一整排 M表示机柜 I表示间隔 请你返回这整排机房 至少需要多少个电箱 如果无解请返回
  • 安装 Android Studio

    安装 Android Studio 只需轻松点击几下 您需要已下载 Android Studio Windows 如需在 Windows 系统中安装 Android Studio 请执行以下操作 启动您下载的 exe 文件 根据安装向导的指
  • npz,npy的输入和读取np.load和np.save

    np load和np save 是读写磁盘数组数据的两个主要函数 默认情况下 数组是以未压缩的原始二进制格式保存在扩展名为 npy的文件中 np savez 如果你想将多个数组保存到一个文件中的话 可以使用numpy savez函数 sav
  • 数学建模中的经典问题-旅行商(TSP)问题

    1 相关理论 2 算法流程 3 代码实现 4 结果显示 1 相关理论 旅行商 TSP 问题是数学建模中的经典问题 它是一个典型的NP完全问题 TSP问题可描述为 已知n个城区相互之间的距离 某一旅行商从城市出发访问每个城市一次且仅一次 最后
  • ios -Unity3D的EasyAR集成到已经有项目中。

    近期 在做AR这一块 用EasyAR集成到iOS端 由于现在到项目已经上线 下一版本要做一个AR功能 于是迫于需求需要 自己研究和翻阅读好多集成到资料 通过整理分出几个重要到模块 其中在这里指出Xcode9版本确实好坑 建议弃坑 该用稍微好