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

用Unity做一个简单的AR应用

  • 1.AR Foundation
    • 1.1.遇到的小问题1
    • 1.2.遇到的小问题2
    • 1.3.遇到的小问题3
  • 2.尝试创建一个极其简陋的AR应用
    • 2.1.遇到的小问题

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

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

1.AR Foundation

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

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

1.1.遇到的小问题1

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

1.2.遇到的小问题2

用Unity做一个简单(简陋、寒酸)的AR应用_第4张图片
安装完之后出现这个,XR插件对应的版本太低。
用Unity做一个简单(简陋、寒酸)的AR应用_第5张图片
把这个版本升级到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应用

首先把场景中的摄像头删掉,然后把这两个东西都新建出来。
用Unity做一个简单(简陋、寒酸)的AR应用_第6张图片
Origin的子物体里面还有一个摄像头,顺便把这个摄像头的标签设置为mainCamera。
这时候打包出来,在手机上就可以看到摄像头的画面了。当然除了画面什么都没有。

想要看到识别的效果,可以用平面或者点云来可视化一下。把上图XR中的AR Default Plane和AR Default Point Cloud都创建出来,然后保存成预制体。
用Unity做一个简单(简陋、寒酸)的AR应用_第7张图片
在加上这两个脚本,放上对应的预制体,打包出来就可以看到效果了。

像这样。
然后写个脚本,简单的放置一个东西。

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);
        }
    }
}

可以弄一个按钮来调用函数(也可以点击屏幕啥的,随意)。大概就这样子,懂得都懂(好吧是我懒了,不想细说了)。
用Unity做一个简单(简陋、寒酸)的AR应用_第8张图片
效果的话,说实话并不是特别理想,可能没有深度摄像头,终究还是差点意思。

2.1.遇到的小问题

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

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

你可能感兴趣的:(Unity,unity,增强现实,AR,unity3d)