1-ARFoundation(ARCore)之HelloWorld

588 阅读6分钟

前言

AR开发我们这两年一直都在听,笔者也因为工作原因需要使用到AR开发于是也算是要迈入AR开发这个领域了。但是笔者发现了一个很严重的问题就是不管你是在b站,还是在YouTube上还是去网上搜各种AR的学习资料都会发现没有那种真的从0到1带你一起学习的,更多的都是别人做的案例然后录了个视频给你看,于是笔者经过一个星期努力的寻找资料学习,终于有了一点小起色了,就想出一个专栏专门用记录笔者在AR领域学到的一些技术和帮助那些还没有入门AR想尝试AR开发的一些小教程。

注:AR领域的技术现在处于快速发展期,各种API很可能几年后就不适用了,所以在观看本文章的时候需要注意文章发布时间

这里笔者打算记录自己的第一个AR小APP的开发过程。

本文适合有一定Unity使用经验的人观看,至少需要安装过Unity并且在里面跑过一些案例项目并打包到Android端进行尝试。

环境准备

  1. Unity2021及以上(笔者使用的是2021.1.15f1c1)
  2. VisualStudio2019(安装UnityEditor会自动下载)
  3. ARFoundation 4.1.13 - November 07, 2022
  4. ARCore Extensions Version 1.34.0
  5. ARCore XR Plugin Version 4.1.13 - November 07, 2022

新建项目引入依赖

首先我们打开UnityHub新建普通3D项目

image.png

这里我们把项目名字设置成HelloWorld。

image.png

注意把默认勾选的项目管理去掉,然后点击“创建项目”

image.png

稍作等待我们的项目就会加载完成

此时我们会进来到Unity界面,可能你们的Unity界面和笔者的不一样,但是不要紧,注意看内容你的一样能找到需要的东西。这个布局只是笔者根据自己的习惯调整了一下

image.png

打开Scenes > SampleScene

image.png

打开Unity包管理器

image.png

将包展示变成Unity Registry

image.png

下载ARFoundation

image.png

下载ARCoreXRPlugin

image.png

去github下载google-ar-extension

github.com/google-ar/a…

image.png

把这个tgz放到当前项目的文件夹里

image.png

image.png

在包管理器里把他加载进入

image.png

image.png

image.png

我们这里使用URP(Universal Render Pipeline通用渲染管线)所以需要安装Universal RP插件

image.png

打开ProjectSetting

image.png

设置ARCore的Depth为可选

image.png

设置XR-Plugin为ARCore

image.png

把Player > Android > Other Setting > Graphic APIs里面的Vulkan去掉,目前的ARCore还不支持Vulkan

image.png

同样在Other Setting里面找到Scripting Backend把他设置成IL2CPP,勾选ARM64。因为现在的手机一般都支持64位运算这样能够提高我们的计算效率

image.png

同样在Other Setting下的Minimum API Level设置成Android 7.0 'Nougat'(API Level 24)

image.png

因为AR的渲染会跑很多SLAM和IMU等定位算法并不像手机游戏一样普通的进行矩阵运算,所以如果我们渲染的品质非常高在低端手机就会运行不流畅,所以我们最好把渲染质量设置成Low来减少渲染压力

image.png

此时我们需要在Assets目录下右键新建一个Setting文件夹

image.png

新建URP渲染管线,并把名字设置成ARCorePipeline

image.png

image.png

我们会得到两个文件

image.png

在ARCorePipelineRenderer.asset文件里新建RendererFeature,新建AR Background Renderer Feature

image.png

回到ProjectSetting搜索Graphics设置渲染管线为我们刚刚创建的ARCoreURP渲染管线

image.png

image.png

到这里我们的项目依赖引入和AR项目设置就已经完成啦,后续我们就可以开始编写我们的AR程序了

编写HelloWorld

首先我们在Assets里面按照项目规范新建Materials文件夹,在里面新建两个Material

image.png

image.png

第一个我们取名叫Plane、第二个我们取名叫Spawn,并将第一个设置成绿色、第二个设置成红色

image.png

image.png

然后我们新建Scripts文件夹在里面新建一个C# Script命名为HelloWorld

image.png

此时我们把场景中的MainCamera选中按Delete健移除,右键新建XR > AR Session和XR > ARSession Origin

image.png

新建文件夹Prefabs,然后在场景里面新建XR > AR Default Plane设置Materials为我们刚刚创建的Plane

image.png

image.png

打开Prefabs文件夹将场景中的AR Default Plane拖入文件夹内

image.png

在场景里面新建3DObject > Cube

image.png

我们把Materials里面的Spawn拖动给到Cube

image.png

把Cube像Plane一样拖入Prefabs文件夹内

然后把他们两个从场景中移除

image.png

此时我们双击Assets > Scripts > HelloWorld打开脚本编写我们的程序逻辑

image.png

image.png

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

[RequireComponent(typeof(ARPlaneManager))] // 因为此脚本需要ARPlaneManger所以我们在这里写这个,当用户添加当前脚本的时候就会添加ARPlaneManager组件进来
public class HelloWorld : MonoBehaviour
{
    public GameObject spawnPrefab; // 放置物体的Prefab
    private GameObject spawnObject = null; // AR放置的物体
    private List<ARRaycastHit> hits = new List<ARRaycastHit>(); // 射线检测结果集合
    private ARRaycastManager m_ARRaycastManager; // 用于后面进行射线检测
    // Start is called before the first frame update
    void Start()
    {
        m_ARRaycastManager = GetComponent<ARRaycastManager>(); // 用于后面进行射线检测
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.touchCount == 0) // 如果用户没有触摸操作就不做管下面的逻辑
            return;
        var touch = Input.GetTouch(0); // 如果用户有触摸操作,那么获取到第一个触摸的操作
        if(m_ARRaycastManager.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds))
        { // 判断射线检测是否打到物体
            var hitPose = hits[0].pose; // 获取到第一个打中的点的位姿信息(position,rotation)
            if (spawnObject == null) // 如果当前没有创建过放置对象那么我们就往场景里面初始化一个Prefab类型的GameObject
            {
                spawnObject = Instantiate(spawnPrefab, hitPose.position, hitPose.rotation);
            }
            else
            { // 如果当前有创建过放置对象那么我们就直接更改当前放置对象的位置和旋转值
                spawnObject.transform.SetPositionAndRotation(hitPose.position, hitPose.rotation);
            }
        }
    }
}

然后我们将脚本拖拽到AR Session Origin上,并把我们刚刚创建的两个Prefab拖入里面,AR Default Plane 拖入ARPlaneManager,Cube 拖入HelloWorld脚本中当作我们要放置的对象

image.png

然后我们点击下面的Add Componenet > ARRaycasManager

image.png

此时我们的程序就都写好啦,我们开始打包apk放到手机安装测试吧

image.png

选中Android平台

image.png

然后我们选中一个位置存放打包结果apk就好啦

Screenshot_20221203_184011_com.DefaultCompany.Hel.jpg

运行之后我们看到效果发现我们的红色方块好像有点大,我们可以把红方块Prefab的Scale设置成0.1这样就小很多了

那么我们的HelloWorld项目就到这里啦

最终结果APK:

链接:pan.baidu.com/s/1DtwCK4PA… 提取码:3022 --来自百度网盘超级会员V4的分享

项目代码:

链接:pan.baidu.com/s/1xePTb_7I… 提取码:yd0q --来自百度网盘超级会员V4的分享

拓展

最后有的小伙伴的手机可能不支持ARCore打开AR程序会闪退,这里笔者给大家做了一个检测自己手机是否支持ARCore的程序大家下载加载检测一下就好啦,如果没有支持ARCore的需要去GooglePlay里面下载GooglePlayServiceForAR,如果上不去GooglePlay的需要安装谷歌三件套所以这些大家就自行操作啦。

链接:pan.baidu.com/s/1msUS-B2A… 提取码:4t48 --来自百度网盘超级会员V4的分享