前言
首先这个文档是基于Unity2018及以上的,由于实习需要做AR相关的内容,但是AR Core之前的教程大多是基于SDK的,而这一功能已不在Unity更高版本中支持,同时楼主又是个Unity小白,所以为了跑起ARCore在安卓上的demo用了很久,以下便是过程记录,仅供参考~
ARCore官方文档
前期准备
- 安装unity以及对应版本的Android Build Support
推荐用unityhub直接安装
- 安装AR Foundation插件与ARCore XR Plugin
在Unity内的Window/Package Manager的Unity Registry中搜索安装
位置为File/Build Settings,选择Android并点击Switch Platform,成功后可以看到如下内容
操作过程
0. 创建元素
- 在Hierarchy中右键,找到XR,然后创建即可,以下模块均为创建相应部分后的操作
1. 创建一个AR Session
检查是否有AR Input Manager(如果没有就要用Add Component添加)
2. 创建一个AR Session Origin
检查AR Camera已经对应了AR Session Origin Camera
- 使用Add Component添加一个AR Plane Manager(实现检测平面的功能)
选择DetectionMode为Everything(为检测水平和垂直的平面)
- 使用Add Component添加AR Raycast Manager(为了与平面交互)
最终结果如下:
- 选择AR Camera的Tag为主相机(记得删除原本的相机)
3. 创建一个AR Default Plane
- 先在上面的Hierarchy中创建(XR/AR Default Plane),再拖至Project视图成为预设(prefab),再删除Scene部分的Plane
- 将预设的Plane拖至AR Session Origin的AR Plane Manager的Plane Prefab
4. 创建一个spawn作为显示在平面内的物体
- 创建一个名为SpawnableObject的Cube
- 设置scale为0.1,0.1,0.1
- 为cube新建一个名为Spawnable的tag,并为cube选中它
最后结果如下:
- 与前面平面同理,将其拖入project window创建预设,并删除Hierarchy中的Cube
(预设Prefab其实有点类似复用的模块、组件…)
5. 创建一个交互的脚本
- 创建一个C#脚本并将其命名为SpawnableManager
- 创建一个Empty Game Object在Scene中,并取名为SpawnManager
- 修改脚本代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class SpawnableManager : MonoBehaviour
{
[SerializeField]
ARRaycastManager m_RaycastManager;
List<ARRaycastHit> m_Hits = new List<ARRaycastHit>();
[SerializeField]
GameObject spawnablePrefab;
GameObject spawnedObject;
// Start is called before the first frame update
void Start()
{
spawnedObject = null;
}
// Update is called once per frame
void Update()
{
// 检测点击,针对点击的不同阶段(phase),我们执行不同的事务
if (Input.touchCount == 0)
return;
if (m_RaycastManager.Raycast(Input.GetTouch(0).position, m_Hits))
{
if (Input.GetTouch(0).phase == TouchPhase.Began)
{
SpawnPrefab(m_Hits[0].pose.position);
}
else if (Input.GetTouch(0).phase == TouchPhase.Moved && spawnedObject != null)
{
spawnedObject.transform.position = m_Hits[0].pose.position;
}
if (Input.GetTouch(0).phase == TouchPhase.Ended)
{
spawnedObject = null;
}
}
}
private void SpawnPrefab(Vector3 spawnPosition)
{
spawnedObject = Instantiate(spawnablePrefab, spawnPosition, Quaternion.identity);
}
}
6. 绑定到页面对象
- 创建一个空的Object,并将其改名为SpawnManager
- 将之前创建的AR Session Origin作为该脚本的Raycast Manager拖入
这将作为页面的AR控制脚本
- 将之前创建的SpawnableObject作为该脚本的Spanwnable Prefab拖入
这将成为代码中可以复制的对象
7. 导出与运行
- 在刚刚的Build Settings中,选择Build,并选择保存位置,即可获得APk,安装在手机上就可以看到效果了:
- 效果类似这样,但是最后出现的物体是你设置的SpawnableObject,仔细阅读代码应该就能明白了!
|