学习AR应用开发有一段时间了,自己开发了一款简单的APP来练手,在这里分享给大家。
APP链接:https://www.coolapk.com/apk/173761
经过上一篇教程《从零构建AR APP新手教程【U3D篇】(1)》的介绍,大家已经知道如何实现简单的AR功能了,但是实际项目中经常需要根据不同的参数在场景中用不同的识别图显示不同的3D物体。接下来就带大家介绍通过脚本来实现在场景动态设置目标和物体的需求。
1.prefab准备
先准备好需要显示在识别图的3D物体,生成预制体,每张识别图对应一个预制体。大家可以用cube、sphere、capsule等代替,或者从asset store下载素材。然后将预制体的名称修改为和识别图名称一致,方便后面调用。
2.编写脚本
首先将scene中的ImageTarget删掉,然后创建一个GameObject,再新建一个脚本命名为TargetCreator并挂载到该GameObject上,后面将通过这个GameObject管理ImageTarget,如图:
这里把scene中的ImageTarget删掉,大家可能会有疑问,没有了target该如何识别。其实大家直接运行unity会发现vuforia会在初始化的时候在scene中创建多个GameObject,如图:
其中底下的6个GameObject就是我在上一篇导入的6个识别图。如果scene中已经存在某个ImageTarget,那么vuforia将会跳过这个ImageTarget,没有的话会自动创建。后面修改识别目标和3D物体就通过修改这些GameObject来实现。
现在打开刚刚创建的TargetCreator脚本开始敲代码。
using Vuforia; //引入vuforia库
public class TargetCreator : MonoBehaviour {
public GameObject[] targetPrefabs; //保存每张识别图对应现实的3D物体
}
回到hierarchy面板,选中TargetManager,在inspector面板中将准备好的预制体拖入TargetPrefabs,如图:
接下来再在脚本中编写如下代码:
public void ConfigTrackable(string targetKey)
{
if (targetPrefabs == null && targetKey == null) return;
IEnumerable<TrackableBehaviour> trackables = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours(); //获取场景中所有的识别图
foreach(TrackableBehaviour behaviour in trackables)
{
if(behaviour.TrackableName == targetKey) //比较名称
{
behaviour.gameObject.name = "ImageTarget"; //修改NewGameObject名称为ImageTarget
behaviour.gameObject.AddComponent<DefaultTrackableEventHandler>(); //添加事件处理脚本
behaviour.gameObject.AddComponent<TurnOffBehaviour>(); //添加禁用渲染工具脚本
foreach (GameObject prefab in targetPrefabs)
{
if (prefab.name.Equals(targetKey))
{
GameObject obj = GameObject.Instantiate(prefab);
obj.transform.parent = behaviour.transform; //修改父级为找到的Target
return;
}
}
}
}
}
通过ConfigTrackable函数,传入一个字符串参数,这个参数就是要设置的识别图的名称。
TrackerManager.Instance.GetStateManager().GetTrackableBehaviours()
这个函数返回的就是场景创建的ImageTarget上的ImageTargetBehavior脚本。
遍历这些脚本,匹配TrackableName找到要修改的 ImageTarget,对它进行设置。
然后遍历预制体,找到名称一致的,生成它并将它设置为ImageTarget的子GameObject。
到这里就完成了,当大家想加载不同的ImageTarget时,传入对应的name就行了,实际效果可以安装我的APP来体验。
Unity3D部分的开发基本完成,我会在下一篇介绍Android部分的开发。