用Unity做一个简单(简陋、寒酸)的AR应用

这篇博客其实上个月就开始写了,然后写了一点点就没有继续动工,搁置到现在才来接着写。当时测试的项目也留在了学校的电脑上(当时还把roll a ball给整成AR的形式,但其实也就是把整个平台弄成一个预制体实例化放上去,然后摇杆的方向改成以摄像头的方向为基准而已),现在又重新搞了搞,但是又没啥耐心再弄那个了,就简单往上放物体就是了,道理一样,所以这篇感觉写的挺粗糙的…,见谅。

前面已经实现了将Unity项目打包到安卓平台,
Unity打包到安卓平台(一)
Unity打包到安卓平台(二)
接下来我想做的是,把这个roll a ball改成一个AR的小游戏然后打包到安卓上。 不想重新做了…
大概这个样子:
在这里插入图片描述

1.AR Foundation

首先打开PackageManager,安装 AR FoundationARCore XR Plugin 。选中之后点击Install即可。
在这里插入图片描述
下面还有一个ARKit。
ARCore是安卓用的,ARKit是IOS用的。AR Foundation是Unity整合的同一套跨平台的AR工具。现在我只是要打包到安卓,所以就不需要ARKit了。(安装AR Foundation后它就会自动把AR Subsystems也安装了)
然后是一些设置,比如自动选择图形api,之前默认的是不支持arcore的。还有要求最低的安卓版本需要设置成level24。
如果忘记在选择autoAPI,编译的时候就会报错说,使用了错误的图形API。
这些地方都要记得改成这样的。不然打包的时候会报对应的错误。
在这里插入图片描述
这里点Creat创建一个配置文件,存在一个地方。

再把它改为可选的(既非必要的)。

1.1.遇到的小问题1

期间遇到过这样一个问题,安装好ARCore后就报错。对应的package里面的代码有问题,可是也没法解决。后来把unity的版本从2019.4.9换成2019.3.0就没事了(之前另一台电脑用的同样是4.9,并没有问题),不知道是不是unity的BUG。
在这里插入图片描述
Library\PackageCache\com.unity.xr.management@3.2.17\Editor\XRGeneralBuildProcessor.cs(39,52): error CS0117: ‘BuildPipeline’ does not contain a definition for ‘GetBuildTargetName’

1.2.遇到的小问题2

在这里插入图片描述
安装完之后出现这个,XR插件对应的版本太低。

把这个版本升级到2.1.2以上(比如这里的2.1.4)就行。

1.3.遇到的小问题3

打包的时候报错Missing ‘package’ key attribute on element package at [:arcore_client:] AndroidManifest.xml:30:9-54,前段时间专门写了一下博客

2.尝试创建一个极其简陋的AR应用

首先把场景中的摄像头删掉,然后把这两个东西都新建出来。
在这里插入图片描述
Origin的子物体里面还有一个摄像头,顺便把这个摄像头的标签设置为mainCamera。
这时候打包出来,在手机上就可以看到摄像头的画面了。当然除了画面什么都没有。

想要看到识别的效果,可以用平面或者点云来可视化一下。把上图XR中的AR Default Plane和AR Default Point Cloud都创建出来,然后保存成预制体。
在这里插入图片描述
在加上这两个脚本,放上对应的预制体,打包出来就可以看到效果了。
在这里插入图片描述
像这样。
然后写个脚本,简单的放置一个东西。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

public class ItemPlacement : MonoBehaviour
{
    public GameObject itemToPlace;
    public GameObject placePointer;

    public ARRaycastManager raycastManager;

    public List<ARRaycastHit> Hits = new List<ARRaycastHit>();
    
    private void Update()
    {
        Hits.Clear();

        if (raycastManager.Raycast(new Vector2(Screen.width / 2f, Screen.height / 2f), Hits, TrackableType.Planes))
        {
            placePointer.transform.position = Hits[0].pose.position;
            placePointer.transform.rotation = Hits[0].pose.rotation;
        }
    }

    public void Place()
    {
        if (Hits.Count > 0)
        {
            Instantiate(itemToPlace, Hits[0].pose.position, Hits[0].pose.rotation);
        }
    }
}

可以弄一个按钮来调用函数(也可以点击屏幕啥的,随意)。大概就这样子,懂得都懂(好吧是我懒了,不想细说了)。
在这里插入图片描述
效果的话,说实话并不是特别理想,可能没有深度摄像头,终究还是差点意思。

2.1.遇到的小问题

有的手机打开之后摄像头的画面就是黑屏,UI还有,之前也写了一篇博客

贴一下之前看的视频
https://www.youtube.com/watch?v=FGh7f-PaGQc&t=2616s
改天试试vuforia吧。

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值