1)创建项目
- 创建3D(URP,URP渲染管线相对于内置渲染管线能够更好的适配设备的性能,并且能够让开发者拥有更多的渲染选项)模板
我们第一次打开URP模板项目的时候有可能会看到控制台有几个报错
这个我们只需要关闭项目重启一下项目就好了
2)安装项目依赖
- Window > Packager Manager,列表选择为Unity Register
- 搜索AR Foundation并点击安装
- 搜索ARCore XR Plugins点击安装
- 因为我们使用的URP通用渲染管线,所以我们还需要安装一个依赖包,搜索Universal RP点击安装(有可能已经安装我们就不用管了)
3)设置项目配置
- Edit > ProjectSettings > XR Plug-in Management > 选择安卓 > 勾选ARCore
- Edit > ProjectSettings > ARCore我们把Depth设置为Optional,因为Depth深度信息是需要手机相机支持深度才可以,而我们这个案例现在还不需要使用到Depth,所以我们也可以让不支持Depth的手机安装我们的APP,所以我们要设置Depth为可选
- 我们在项目的Settings文件夹里面创建一个URP的Config,用来配置我们当前的通用渲染管线,命名为ARCorePipeline
- 创建完成后我们会新出来2个文件,一个是ARCorePipeline.asset一个是ARCorePipeline_Renderer.asset。我们选择ACorePipeline_Renderer.asset添加一个AR Background Renderer Feature,这样ARFoundation就可以把摄像头内容渲染为AR应用背景
- Edit > Project Settings > Graphics把Scriptable Render Pipeline Settings设置为我们刚刚创建的ARCorePipeline这样我们的ARCorePipeline(URP)就应用上啦
- 设置自己的Company Name和Product Name
- 选择Android并去掉Auto Graphics API勾选,然后去掉Vulkan
- 继续往下划我们会看到Minimum API Level设置为Android8.0,因为低于这个API版本的Android手机无法使用AR
- 现在很多手机都支持64位,所以我们可以把Mono改成IL2CPP,并把ARMv7改成ARM64,能够提高性能
- Edit > Quality里面设置Android的质量为Performant,以及Render Pipeline Asset设置为刚刚创建的ARCorePipeline(这里有个反面教材,我们不仔细看以为改的是Performant的Render Pipeline Asset,其实是High Fidelity,所以我们要点Performant然后再去设置)
- 以上我们所有的项目配置都已经完成了,接下来我们进行代码编写
4)创建场景内容并写脚本
- 创建如下文件夹用来存放我们当前这个Demo
- 在Scenes里面右键创建一个Scene然后命名为HelloWorld,这时候可以把创建项目时自动创建的Samples,然后双击我们创建的HelloWorld打开场景
- 删除场景中的Main Camera(以为待会添加的AR组件会自带一个相机),Directonal Light可删可不删
- 在目录里面右键XR > AR Session创建AR Session和AR Session Origin
- 在Materials文件夹里面右键创建两个Material一个叫Plane(待会用于AR识别到的Plane上面),另一个叫Red(待会用于放置的Cube上面),并且我们把Plane的BaseMap颜色设置成半透明的白色,把Red的BaseMap颜色设置成红色
- 在目录树里面右键创建AR Default Plane,并将它的Material设置成刚才创建的Plane材质,打开Prefabs文件夹把这个AR Default Plane拖入进去创建成为预制体,然后把目录树的AR Default Plane删掉
- 在目录树右键创建3D Object > Cube然后把Material改成刚才创建的Red,并把scale的xyz都设置成0.1,一样的拖入Prefabs文件夹变成预制体,然后把它从场景中删掉
- 选中AR Session Origin对象,然后在右边给他添加一个component:AR Plane Manager,并把刚才创建的Plane预制体拖入AR Plane Manager组件的Prefab参数,这样待会AR Plane Manager就会把AR应用识别到的平面用我们的Plane预制体显示出来让我们看到这个平面被识别到了
- 在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);
}
}
}
}
- 我们这时候把创建的脚本拖入AR Session Origin就好了,然后把之前创建的Cube的Prefab拖入放到SpawnCubeController的spawnPrefab属性上
- 这时候我们已经全部写好了,准备打包到手机上测试了
- File > Build Settings点击Add Open Scenes把当前场景添加到打包场景,然后选中Android并点击下面的Switch Platform这样我们就切换到Android打包了
- 使用一条数据线将电脑和手机连接在一起,然后检查手机是否有开启“开发者选项”(因为不同手机的开启方式不一样,可以去网上搜索 = 你使用的手机+如何开启开发者选项,开启之后重新插拔一下手机然后点击可传输文件,和允许ADB调试)然后我们点击一下Run Device旁边的Refresh然后在旁边的设备列表里面点击下拉看看有没有自己的手机,如果有就选中然后打包就好了,如果没有那么就是USB调试或者ADB调试没有设置好。
- 点击Build And Run,这样我们可以把apk打包自动安装到手机上
- 这样我们的第一个AR应用就开发好了