上篇文章我们讲述了如何用Unity结合ARCore做简单的案例演示,案例里的安卓机器人很可爱,但没什么用,因为在我们实际开发中加载的都是项目自身所需要的模型,所以本章我们将讲述如何更换演示模型。
一、准备模型素材
在这里,我准备了一个最喜欢的游戏角色——尤尔哈2号的fbx格式模型,并且通过mixamo给模型赋予动画 ,获得了这样的一个动画模型。大家如果需要测试用的模型,也可以在这个网站上下载。
除此之外,ARCore开发的基本环境也要搭建好,没有搭建环境的小伙伴可以参考上篇文章,了解ARCore所支持的手机型号,以及下载所需要用到的环境包。
一切准备妥当后 , OK , 那就开始吧 !
二、新建项目场景
首先,创建一个 Scene 并且为其赋予名称。
删除当前场景默认的 Prefabs ,引入ARCore
在Project窗口中,找到”GoogleARCore” -> “Prefabs” ,选择 “ARCore Device” 和 “Environmental Light” prefabs,并将这两个 prefabs拖到Hierarchy窗口中,如下图所示。
添加完这两个Prefabs之后,我们还需要添加事件系统以使我们的应用能监听和处理事件信息。
三、导入模型
在Project窗口中,右键”Assets”->”Import New Asset”-> 选择模型 “你的模型名称.fbx”, 直接点击“Import”
当我们导入模型后 ,可能会发现模型身上没有颜色 ,这是因为模型的贴图没有根据指定的位置进行绑定。
所以,我们将Materials 中的Naming设置为From Model’s Material, 然后点击 Search And Remap
现在可以看到 , 模型的贴图都已经穿上了,颜色恢复正常。
如果使出这招还不管用的话,就创建一个Material,然后将贴图赋予Material,最后将材质球拖拽到模型身上即可。
四、创建平面
我们在 Hierarchy 视图内通过右键创建一个平面,命名为 VisualDetectedPlane
在Inspector窗口中,Position一定要归0,还要确保Scale为(1,1,1),否则用代码实例化平面后会出现偏移。
我们给这个平面设置一个纹理 , 也就是我们对平面进行扫描检测时显示的网格
然后 , 需要添加平面渲染脚本
通过将Hierarchy目录拖到Assets视图 , 制作一个Prefabs , 并且删除Hierarchy目录中的VisualDetectedPlane
右键新建一个Game Object,命名为 Detected PlaceGenerater
保持选中”DetectedPlaceGenerater”,在 Inspector窗口点击 “Add Component”按钮,在搜索框中输入”Detected”,可以找到DetectedPlaneGenerator,将这个脚本绑定到我们的平面上。
最后,将我们制作好的平面Prefabs挂载到Detected PlaceGenerater对象上,平面的准备工作就做好了。
五、AppController
接下来,我们需要写一个AppController 用于处理项目中的各种情况
便于管理,先创建一个文件夹 Scripts 用来放脚本代码
然后在Assets视图的Script目录右键创建一个C# 脚本,命名为AppController
AppController的代码如下
using GoogleARCore;
using System;
using UnityEngine;
public class AppController : MonoBehaviour
{
public Camera FirstPersonCamera;
public GameObject prefab;
private bool mIsQuitting = false;
private const float mModelRotation = 180.0f;
// Use this for initialization
void Start()
{
OnCheckDevice();
}
private void OnCheckDevice()
{
throw new NotImplementedException();
}
// Update is called once per frame
void Update()
{
UpdateApplicationLifecycle();
Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)
{
return;
}
TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon | TrackableHitFlags.PlaneWithinBounds;
if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
{
if ((hit.Trackable is DetectedPlane) && Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position, hit.Pose.rotation * Vector3.up) < 0)
{
Debug.Log("射线击中了DetectedPlane的背面!");
}
else
{
var FoxObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);
FoxObject.transform.Rotate(0, mModelRotation, 0, Space.Self);
var anchor = hit.Trackable.CreateAnchor(hit.Pose);
FoxObject.transform.parent = anchor.transform;
}
}
}
private void UpdateApplicationLifecycle() { if (Session.Status != SessionStatus.Tracking) { const int lostTrackingSleepTimeout = 15; Screen.sleepTimeout = lostTrackingSleepTimeout; } else { Screen.sleepTimeout = SleepTimeout.NeverSleep; } if (mIsQuitting) { return; } }
现在我们要把这个写好的AppController脚本挂载到项目场景中,在Hierarchy窗口中,右键选择”Create Empty”,新建一个空对象,并命名为”AppController”。
然后选中这个AppController对象,在右上角 Inspector视图中点击 Add Component,找到AppController脚本进行绑定。
并且,挂载ARCore Device中的相机,以及我们所要加载的模型
六、打包测试
快捷键 Ctrl+Shift+B,对项目进行打包 , 有几点需要注意 :
1.上面的 Scenes In Build 需要选中我们此次创建的Scene;
2.Platform 选择适合自己手机的Android版本;
3.Setting里面选择系统版本 , 勾选ARCore Support;
将这个Apk发送到自己的手机,进行安装后 , 我们就可以体验加载自己的模型了。
到此,可爱的二哈就这样出现在你的眼前了,你可以通过移动自己的手机,从不同角度去欣赏她的美,感受虚拟与现实的融合,这就是AR的魅力所在吧。