ARFoundation(ARCore)系列-2.第一个AR应用

1)创建项目

  1. 创建3D(URP,URP渲染管线相对于内置渲染管线能够更好的适配设备的性能,并且能够让开发者拥有更多的渲染选项)模板
    在这里插入图片描述

我们第一次打开URP模板项目的时候有可能会看到控制台有几个报错
在这里插入图片描述
这个我们只需要关闭项目重启一下项目就好了

2)安装项目依赖

  1. Window > Packager Manager,列表选择为Unity Register
    在这里插入图片描述
  2. 搜索AR Foundation并点击安装
    在这里插入图片描述
  3. 搜索ARCore XR Plugins点击安装
    在这里插入图片描述
  4. 因为我们使用的URP通用渲染管线,所以我们还需要安装一个依赖包,搜索Universal RP点击安装(有可能已经安装我们就不用管了)
    在这里插入图片描述

3)设置项目配置

  1. Edit > ProjectSettings > XR Plug-in Management > 选择安卓 > 勾选ARCore
    在这里插入图片描述
  2. Edit > ProjectSettings > ARCore我们把Depth设置为Optional,因为Depth深度信息是需要手机相机支持深度才可以,而我们这个案例现在还不需要使用到Depth,所以我们也可以让不支持Depth的手机安装我们的APP,所以我们要设置Depth为可选
    在这里插入图片描述
  3. 我们在项目的Settings文件夹里面创建一个URP的Config,用来配置我们当前的通用渲染管线,命名为ARCorePipeline
    在这里插入图片描述
  4. 创建完成后我们会新出来2个文件,一个是ARCorePipeline.asset一个是ARCorePipeline_Renderer.asset。我们选择ACorePipeline_Renderer.asset添加一个AR Background Renderer Feature,这样ARFoundation就可以把摄像头内容渲染为AR应用背景
    在这里插入图片描述
    在这里插入图片描述
  5. Edit > Project Settings > Graphics把Scriptable Render Pipeline Settings设置为我们刚刚创建的ARCorePipeline这样我们的ARCorePipeline(URP)就应用上啦
    在这里插入图片描述
  6. 设置自己的Company Name和Product Name
    在这里插入图片描述
  7. 选择Android并去掉Auto Graphics API勾选,然后去掉Vulkan
    在这里插入图片描述
  8. 继续往下划我们会看到Minimum API Level设置为Android8.0,因为低于这个API版本的Android手机无法使用AR
    在这里插入图片描述
  9. 现在很多手机都支持64位,所以我们可以把Mono改成IL2CPP,并把ARMv7改成ARM64,能够提高性能
    在这里插入图片描述
  10. Edit > Quality里面设置Android的质量为Performant,以及Render Pipeline Asset设置为刚刚创建的ARCorePipeline(这里有个反面教材,我们不仔细看以为改的是Performant的Render Pipeline Asset,其实是High Fidelity,所以我们要点Performant然后再去设置
    在这里插入图片描述
    在这里插入图片描述
  11. 以上我们所有的项目配置都已经完成了,接下来我们进行代码编写

4)创建场景内容并写脚本

  1. 创建如下文件夹用来存放我们当前这个Demo
    在这里插入图片描述
  2. 在Scenes里面右键创建一个Scene然后命名为HelloWorld,这时候可以把创建项目时自动创建的Samples,然后双击我们创建的HelloWorld打开场景
    在这里插入图片描述
  3. 删除场景中的Main Camera(以为待会添加的AR组件会自带一个相机),Directonal Light可删可不删
    在这里插入图片描述
  4. 在目录里面右键XR > AR Session创建AR Session和AR Session Origin
    在这里插入图片描述
  5. 在Materials文件夹里面右键创建两个Material一个叫Plane(待会用于AR识别到的Plane上面),另一个叫Red(待会用于放置的Cube上面),并且我们把Plane的BaseMap颜色设置成半透明的白色,把Red的BaseMap颜色设置成红色
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  6. 在目录树里面右键创建AR Default Plane,并将它的Material设置成刚才创建的Plane材质,打开Prefabs文件夹把这个AR Default Plane拖入进去创建成为预制体,然后把目录树的AR Default Plane删掉
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  7. 在目录树右键创建3D Object > Cube然后把Material改成刚才创建的Red,并把scale的xyz都设置成0.1,一样的拖入Prefabs文件夹变成预制体,然后把它从场景中删掉
    在这里插入图片描述
    在这里插入图片描述
  8. 选中AR Session Origin对象,然后在右边给他添加一个component:AR Plane Manager,并把刚才创建的Plane预制体拖入AR Plane Manager组件的Prefab参数,这样待会AR Plane Manager就会把AR应用识别到的平面用我们的Plane预制体显示出来让我们看到这个平面被识别到了
    在这里插入图片描述
  9. 在Scripts文件夹里面创建一个C# Script命名为SpawnCubeController,然后双击打开这个脚本(会自动启动Visual Studio),这个脚本用来处理用户放置Cube
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

/// <summary>
/// 用来处理放置Cube操作的脚本
/// </summary>

// 我们当前这个脚本依赖当前GO身上需要有ARRaycastManager,所以我们添加这行代码Unity就会自动判断有没有,如果没有就Unity会自动帮我们添加上
[RequireComponent(typeof(ARRaycastManager))]
public class SpawnCubeController : MonoBehaviour
{
    
    
    public GameObject spawnPrefab; // 放置在平面上的Prefab
    public List<ARRaycastHit> hits = new List<ARRaycastHit>(); // 射线碰撞结果
    private ARRaycastManager mRaycastManager; // 当前GO身上的RaycastManager组件
    private GameObject spawnedPrefab = null; // 已经放置的Prefab我们把他存起来


    // Start is called before the first frame update
    void Start()
    {
    
    
        // 获取自身的ARRaycastManager
        this.mRaycastManager = GetComponent<ARRaycastManager>();
    }

    // Update is called once per frame
    void Update()
    {
    
    
        // 每帧都处理用户的触碰事件
        this.handleTouchToSpawnPrefab();
    }
    /// <summary>
    /// 处理用户的触碰事件来放置prefab
    /// </summary>
    private void handleTouchToSpawnPrefab()
    {
    
    
        // 如果用户没有触碰界面就不执行下面的代码
        if (Input.touchCount == 0)
            return;

        // 获取第一个触碰事件的Touch
        Touch touch = Input.GetTouch(0);
        // 根据Touch来发射一条射线,并判断射线是否有碰撞到可追踪结果
        if(mRaycastManager.Raycast(touch.position, this.hits, TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds))
        {
    
    
            // 获取第一个碰撞结果的pose
            Pose hitPose = hits[0].pose;
            // 如果我们没有spawn过那么我们就实例化一个到场景里面并记录下来,用于下次判断
            if(this.spawnedPrefab == null)
            {
    
    
                this.spawnedPrefab = Instantiate(spawnPrefab, hitPose.position, hitPose.rotation);
            }
            else // 如果我们spawned了那么我们就设置之前实例化的物体的位置就好了,不需要新实例化了
            {
    
    
                this.spawnedPrefab.transform.SetPositionAndRotation(hitPose.position, hitPose.rotation);
            }
        }
    }
}

TrackableType枚举文档

  1. 我们这时候把创建的脚本拖入AR Session Origin就好了,然后把之前创建的Cube的Prefab拖入放到SpawnCubeController的spawnPrefab属性上
    在这里插入图片描述
  2. 这时候我们已经全部写好了,准备打包到手机上测试了
  3. File > Build Settings点击Add Open Scenes把当前场景添加到打包场景,然后选中Android并点击下面的Switch Platform这样我们就切换到Android打包了
    在这里插入图片描述
  4. 使用一条数据线将电脑和手机连接在一起,然后检查手机是否有开启“开发者选项”(因为不同手机的开启方式不一样,可以去网上搜索 = 你使用的手机+如何开启开发者选项,开启之后重新插拔一下手机然后点击可传输文件,和允许ADB调试)然后我们点击一下Run Device旁边的Refresh然后在旁边的设备列表里面点击下拉看看有没有自己的手机,如果有就选中然后打包就好了,如果没有那么就是USB调试或者ADB调试没有设置好。
  5. 点击Build And Run,这样我们可以把apk打包自动安装到手机上
  6. 这样我们的第一个AR应用就开发好了
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45955580/article/details/131277480
今日推荐