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

news/2024/11/17 10:49:39/

最近对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.ppmy.cn/news/8423.html

相关文章

docker的上下文和工作目录

写在前面 在编写Dockerfile时我们总会接触到COPY上下文和工作目录&#xff0c;有时候这些位置搞不清楚&#xff0c;总是让我们陷入困境&#xff0c;本文就一起来看下这2个路径。 1&#xff1a;COPY上下文 Dockerfile文件的COPY指令&#xff0c;拷贝的源文件就是基于上下文目…

APP应用渗透测试思路

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是APP应用渗透测试思路。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权…

mysql 性能优化

mysql 调优可以从这个四个方面来看 1.性能监控 1.1 show profile for query n 查看具体的sql语句各阶段执行时间 show profiles; show profile for query n; 1.2 performance schema 监控mysql 整个服务器中发生的各种事件。 performance schema 表中的数据不会持久化的磁…

Allegro如何在PCB上查看pin number的三种方法操作指导

Allegro如何在PCB上查看pin number的三种方法操作指导 Allegro支持快捷的在PCB上查看pin number,如下图 具体操作如下 方法一:show element 选择Show Element命令Find选择Pins

算法训练 —— 链表(2)

目录 1. LeetCode24. 两两交换链表中的结点 2. LeetCode19. 删除链表的倒数第N个节点 3. LeetCode160.相交链表 4. LeetCode141.环形链表 5. LeetCode142.环形链表II 6. LeetCode138.复制带随机指针的链表 1. LeetCode24. 两两交换链表中的结点 两两交换链表中的结点 …

2022年总结

2022年悄无声息的过去了&#xff0c;迎来了2023年。 学生时代的每一年过的都会比较充实&#xff0c;因为有同学和周围优秀的人去推动自己进步。 我是一个不善于表达的人&#xff0c;高中时候优秀的文字功底已经被消耗殆尽&#xff0c;已经写不出什么让人眼前一亮的文字了&#…

超好用!win10安装Eiseg标注软件及使用(CPU版本)

写在前面的话 众所周知&#xff0c;标注分割掩膜的软件一般使用labelme&#xff0c;但是一个一个点太麻烦了&#xff0c;工作量太大&#xff0c;&#xff0c;之前&#xff0c;我的思路就是先标少量的数据然后训练个初始模型&#xff0c;再用初始模型对剩下的图像预测掩膜&…

蓝桥杯寒假集训第四天(全球变暖DFS)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 有一个正方形区域&#xff0c;里面有大陆和海洋&#xff0c;暂且用‘.’表示海洋&#xff0c;用‘#’表示大陆。我们把上下左右都连在一起的大陆称之为岛屿。但是随着气温…