这篇博客其实上个月就开始写了,然后写了一点点就没有继续动工,搁置到现在才来接着写。当时测试的项目也留在了学校的电脑上(当时还把roll a ball给整成AR的形式,但其实也就是把整个平台弄成一个预制体实例化放上去,然后摇杆的方向改成以摄像头的方向为基准而已),现在又重新搞了搞,但是又没啥耐心再弄那个了,就简单往上放物体就是了,道理一样,所以这篇感觉写的挺粗糙的…,见谅。
前面已经实现了将Unity项目打包到安卓平台,
Unity打包到安卓平台(一)
Unity打包到安卓平台(二)
接下来我想做的是,把这个roll a ball改成一个AR的小游戏然后打包到安卓上。 不想重新做了…
大概这个样子:
1.AR Foundation
首先打开PackageManager,安装 AR Foundation 和 ARCore XR Plugin 。选中之后点击Install即可。
下面还有一个ARKit。
ARCore是安卓用的,ARKit是IOS用的。AR Foundation是Unity整合的同一套跨平台的AR工具。现在我只是要打包到安卓,所以就不需要ARKit了。(安装AR Foundation后它就会自动把AR Subsystems也安装了)
然后是一些设置,比如自动选择图形api,之前默认的是不支持arcore的。还有要求最低的安卓版本需要设置成level24。
这些地方都要记得改成这样的。不然打包的时候会报对应的错误。
这里点Creat创建一个配置文件,存在一个地方。
再把它改为可选的(既非必要的)。
1.1.遇到的小问题1
期间遇到过这样一个问题,安装好ARCore后就报错。对应的package里面的代码有问题,可是也没法解决。后来把unity的版本从2019.4.9换成2019.3.0就没事了(之前另一台电脑用的同样是4.9,并没有问题),不知道是不是unity的BUG。
Library\PackageCache\com.unity.xr.management@3.2.17\Editor\XRGeneralBuildProcessor.cs(39,52): error CS0117: ‘BuildPipeline’ does not contain a definition for ‘GetBuildTargetName’
1.2.遇到的小问题2
安装完之后出现这个,XR插件对应的版本太低。
把这个版本升级到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应用
首先把场景中的摄像头删掉,然后把这两个东西都新建出来。
Origin的子物体里面还有一个摄像头,顺便把这个摄像头的标签设置为mainCamera。
这时候打包出来,在手机上就可以看到摄像头的画面了。当然除了画面什么都没有。
想要看到识别的效果,可以用平面或者点云来可视化一下。把上图XR中的AR Default Plane和AR Default Point Cloud都创建出来,然后保存成预制体。
在加上这两个脚本,放上对应的预制体,打包出来就可以看到效果了。
像这样。
然后写个脚本,简单的放置一个东西。
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);
}
}
}
可以弄一个按钮来调用函数(也可以点击屏幕啥的,随意)。大概就这样子,懂得都懂(好吧是我懒了,不想细说了)。
效果的话,说实话并不是特别理想,可能没有深度摄像头,终究还是差点意思。
2.1.遇到的小问题
有的手机打开之后摄像头的画面就是黑屏,UI还有,之前也写了一篇博客。
贴一下之前看的视频
https://www.youtube.com/watch?v=FGh7f-PaGQc&t=2616s
改天试试vuforia吧。