Unity AR小游戏(玩具小车)踩坑记

news2024/11/15 13:40:20

最近对AR产生了兴趣。先科普一下什么是AR吧。AR是Augmented Reality(增强现实)的简称,是基于摄像头对现实世界的实时图像采集、分析和理解,然后在此基础上融入虚拟物体(信息),以达到增强体验的目的——世界从此变得更加丰富多彩!典型的AR设备有Google Lens、微软的HoloLens等。因为智能手机都自带摄像头,所以手机上也比较方便做AR应用。

从应用开发的角度去看,平台支持SDK是少不了的:Google有ARCore,苹果有ARKit。我勉强算是一名Android程序员吧,顺手就看了一遍ARCore官方文档,对AR的技术概念有了大致的理解。要在Android设备上跑AR应用,除了系统要求7.0及以上之外,还需要一个叫“Google Play Services for AR”的关键组件——可以到Google Play应用商店在线安装,也可以从GitHub下载.apk后再离线安装。AR的核心功能都由这个Services来提供,而AR应用通过建立session来与它协作,它们之间的关系如下:

咱们程序员还是比较务实;有了一定的理论知识之后,就要动手写代码了。Google提供了很多示例,有效降低了学习门槛,但稍微有趣一点的就用到了Unity3D。为了做出上佳的AR体验,似乎还不得不学习Unity啊(编程语言是C#),尽管我们不必去开发游戏……使用Unity开发还有一个好处,就是可以一次开发、Android+iOS双端通用,提升开发效率!

从工具链的角度看,大致可以分为两类:

Google似乎偏爱Unity一些,介绍Unity的篇幅明显比Unreal多很多;这里有一篇极好的文档,手把手教我们用Unity来开发一个AR小游戏:通过手机摄像头识别平面,然后在平面上驾驶一辆玩具汽车。实操之前,最好对Unity编辑器有个基本了解,强烈推荐B站上有位叫“阿发你好”的UP主,他做了免费的视频教程,讲解很细致,每集视频只有几分钟,看完前面111集即可,非常适合零基础的初学者。

然后,跟着Google的文档做就是了。我记录一下这个过程中我踩过的几个小坑,确保大家能顺利完成这个AR小游戏。

1. 文档的第2章:文中提到的Unity编辑器版本是2020.3 LTS,而我使用了最新的2023.16f1。在新建项目时,已经没有Universal Render Pipeline这个模板,那就换成2D(URP)吧。项目面板的Assets > Settings目录下也没有ForwardRenderer了,对应修改Renderer2D即可。

2. 文档的第4章:正常的话,这一章的所有步骤完成之后,瞄准器就会跟着手机镜头移动;可惜事与愿违。需要修改ReticleBehaviour.cs文件,将hits.Length改成hits.Count。运行程序时,发现Unity的控制台输出这样的出错信息:

NullReferenceException: Object reference not set to an instance of an object

ReticleBehaviour.Update () (at Assets/Starter Package/ReticleBehaviour.cs:44)

原因是DrivingSurfaceManager.RaycastManager引用了一个空对象。需要去修改DrivingSurfaceManager.cs文件,在Start函数中增加下面这行代码:

RaycastManager = GetComponent<ARRaycastManager>();

改完这几处后,运行起来就符合预期了!同时也引出了一个问题,怎样调试Unity项目呢,比如在Visual Studio里单步调试C#代码?我参考了这篇文章,各种场景都谈到了。需要注意的一点是,确保Unity > Edit > Preferences… > External Tools设置中,将External Script Editor改成Microsoft Visual Studio 2019,而不是默认的Open by file extension。

3. 文档的第5章:做完之后其实环境光的渲染并没有生效,在Visual Studio里调试时,LightEstimation.cs文件的FrameReceived函数中设置断点后并不会进来。原因是,没有在Unity编辑器中给Directional Light的Light Estimation脚本组件的AR Camera Manager赋值。把它指向Scene的AR Camera即可。

4. 课后作业:可以在CarBehaviour.cs文件的OnTriggerEnter函数增加实现,当玩具汽车碰撞到礼盒时,播放一个音效,并产生一个粒子效果:)

总之,按照文档给出的步骤一步一步做下来,最终可以把这个AR应用跑起来,代码量也不是很大,比较容易消化。只是实际效果不甚理想,比如平面识别得不是很准确,得再深入研究一下怎么去优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132142.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Three.js学习(一)初识three.js

文章目录1.基本配置2.基本概念3.Api4.实现一个旋转动画1.基本配置 &#xff08;1&#xff09;安装 ​ npm install three &#xff08;2&#xff09;引入 import * as THREE from three2.基本概念 Three.js是基于原生WebGL封装运行的三维引擎。 &#xff08;1&#xff09;一…

【Linux】实验四 进程信号通信

文章目录一、实验目的二、 实验内容三、 实验原理1、信号3.1.1 信号的基本概念3.1.2、信号的发送2、所涉及的系统函数调用3.2.1 fork()3.2.2 kill( )This is my question.3.2.3 signal( )代码例子3.2.4 getpid()3.2.5 wait()四、 实验内容五、程序代码运行结果六、实验总结及心…

来玩,前端性能优化(+面试必问:宏任务和微任务)

前端性能优化相关的“技能点”笔者之前也写过几篇&#xff0c;但是大多都是小打小闹。我重新整理了曾经使用过的性能优化手段。本文介绍三种方案&#xff1a;页面资源预加载、服务请求优化和非首屏视图延迟加载。 页面资源预加载 页面是不可能真正预加载的&#xff0c;但是有…

Linux | PCIe Hotplug | 概念及工作原理的不完全总结

本文对 PCIe 热插拔的概念及工作原理进行不完全总结。 更新&#xff1a; 2022 / 12 / 31 Linux | PCIe Hotplug | 概念及工作原理的不完全总结热插拔组成部件实现代码通知式热插拔线程中断功耗管理意外移除错误处理整合移除BAR参考链接参考这里 1’ 2’ 3‘ 4’ 5 1992年初始…

postgresql数据库安装,备份还原

一.postgresql数据库安装 1.下载软件包 地址&#xff1a;PostgreSQL: File Browser 2.解压安装 [rootpostgresql u01]# tar -zxf postgresql-14.2.tar.gz安装环境 yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel op…

(深度学习快速入门)第一章:深度学习概述、应用、学习路线和框架选择

文章目录一&#xff1a;基本概念&#xff08;1&#xff09;神经网络&#xff08;2&#xff09;感知器&#xff08;3&#xff09;深度学习&#xff08;4&#xff09;前向运算和反向传播二&#xff1a;DeepLearning学习路线三&#xff1a;深度学习应用&#xff08;1&#xff09;生…

基于Stream的Redis消息队列

目录一、消息队列二、基于List结构模拟消息队列基于List的消息队列的优点&#xff1a;基于List的消息队列的缺点&#xff1a;三、基于PubSub的消息队列基于PubSub的消息队列的优点&#xff1a;基于PubSub的消息队列的缺点&#xff1a;四、基于Stream的消息队列1、XADD语法2、XR…

C++ Primer笔记——allocator、unique_ptr和release、智能指针与动态数组、阻止拷贝

目录 一.P418 unique_ptr和release 二.P426 智能指针与动态数组 &#xff08;一&#xff09;.unique_ptr &#xff08;二&#xff09;.shared_ptr 三.P428 allocator &#xff08;一&#xff09;.申请空间 &#xff08;二&#xff09;.初始化构造 &#xff08;三&#…

活动星投票少儿模特大赛网络评选制作一次图文分组投票怎么制作

关于微信投票&#xff0c;我们现在用的最多的就是小程序投票&#xff0c;今天的网络投票&#xff0c;在这里会教大家如何用“活动星投票”小程序来进行投票。我们现在要以“国际车展少儿模特大赛”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“…

aws cloudformation 使用模板配置 ecs 蓝绿部署

参考资料 Perform ECS blue/green deployments through CodeDeploy using AWS CloudFormationAWS::CodeDeployBlueGreen 在之前的文章中&#xff0c;使用codepipeline中通过控制台的方式创建了ecs蓝绿部署的demo。实际上可以单独通过codedeploy完成ecs服务的蓝绿部署 参考官…

【ARMv8 SIMD和浮点指令编程】Libyuv I420 转 ARGB 流程分析

Libyuv 可以说是做图形图像相关从业者绕不开的一个常用库&#xff0c;它使用了单指令多数据流提升性能。以 ARM 处理为主线&#xff0c;通过 I420 转 ARGB 流程来分析它是如何流转的。 Libyuv 是一个开源项目&#xff0c;包括 YUV 的缩放和转换功能。 使用邻近、双线性或 box…

QThread、moveToThread用法详述

1.吐槽 QThread类提供了一种平台无关的方法对线程进行管理。但对于QThread类的熟练使用&#xff0c;即使是从事Qt开发多年的程序猿们&#xff0c;往往也会踩雷、入坑。总之&#xff1a;QThread类不好用、如果对该类理解不透&#xff0c;很容易导致程序崩溃。本人强烈建议&#…

(函数介绍)puts()函数

功能介绍 1. puts()函数用来向标准输出设备屏幕输出字符串并换行。 2. 函数的参数就是一个起始的地址&#xff0c;然后就从这个地址开始一直输出字符串&#xff0c;直到碰到\0就停止&#xff0c;然后这个\0是不进行输出的&#xff0c;是不能够算在里面的。与此同时&#xff…

十、字节缓冲流、字符流、转换流、对象操作流、对象序列化流

字节缓冲流 构造方法 字节缓冲流介绍 BufferedOutputStream&#xff1a;该类实现缓冲输出流.通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用BufferedInputStream&#xff1a;创建BufferedInputStream将创建一个内部缓冲区数…

2022年为什么要学习C语言?

为什么学习c语言 为什么学C语言逻辑&#xff1f; 为什么要学习C语言&#xff1f; 学习C语言的主要理由有以下几点&#xff1a; C语言可以作为学习计算机程序设计语言的入门语言&#xff1b; C语言是编写操作系统的首选语言&#xff0c;与计算机硬件打交道时灵巧且高效&…

labelImag安装与使用及构造数据集

在做目标检测任务时&#xff0c;需要进行标注&#xff0c;选择了LabelImg作为标注工具&#xff0c;下面是安装及使用过程。 我们使用Anconda的虚拟环境进行安装&#xff0c;激活环境后&#xff0c;执行&#xff1a; pip install labelimg -i https://pypi.tuna.tsinghua.edu.c…

代码随想录算法训练营第四天 java : 24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交,142环形链表II

文章目录Leetcode 24. 两两交换链表中的节点题目链接本题思路需要注意的点AC 代码Leetcode 19.删除链表的倒数第N个节点题目链接需要注意的点AC代码Leetcode面试题 02.07. 链表相交题目链接这个略了Leetcode 142环形链表II题目链接难点:AC代码今日收获**一朵玫瑰正马不停蹄地成…

【Linux】Linux下基本指令(三)

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Linux》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1. Linux基本指令&#xff1a;&#xff08;续&#xff09; 1.1zip指令和u…

极智编程 | C++模板函数

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多笔记分享 大家好&#xff0c;我是极智视界&#xff0c;本文介绍一下 C模板函数。 模板函数是 C 中一种特殊的函数&#xff0c;它的类型参数列表用尖括号 <> 括起来&#xff0c;放在函数名的后面。使用模板函数&a…

Go 并发

来自 《Go 语言从入门到实战》 的并发章节学习笔记&#xff0c;欢迎阅读斧正&#xff0c;感觉该专栏整体来说对有些后端编程经验的来说比无后端编程经验的人更友好。。 Thread VS Groutine 创建时默认 Stack 大小&#xff1a;前者默认 1M&#xff0c;Groutint 的 Stack 初始化…