1Vuforia 中DefaultTrackableEventHandler脚本
Vuforia的ImageTarget中,实现的效果是在识别到底图后,显示Hierarcy中ImageTarget挂的子物体。但是所有挂着的子物体都是同时出现,识别底图消失后同时消失。
在Unity2018.3中分别有OnTrackingFound()、OnTrackingLost()这两个函数,可以通过改写,实现我们预设的效果。
//Vuforia自带代码
protected virtual void OnTrackingFound()
{
var rendererComponents = GetComponentsInChildren<Renderer>(true);
var colliderComponents = GetComponentsInChildren<Collider>(true);
var canvasComponents = GetComponentsInChildren<Canvas>(true);
// Enable rendering:
foreach (var component in rendererComponents)
component.enabled = true;
// Enable colliders:
foreach (var component in colliderComponents)
component.enabled = true;
// Enable canvas':
foreach (var component in canvasComponents)
component.enabled = true;
}
protected virtual void OnTrackingLost()
{
var rendererComponents = GetComponentsInChildren<Renderer>(true);
var colliderComponents = GetComponentsInChildren<Collider>(true);
var canvasComponents = GetComponentsInChildren<Canvas>(true);
// Disable rendering:
foreach (var component in rendererComponents)
component.enabled = false;
// Disable colliders:
foreach (var component in colliderComponents)
component.enabled = false;
// Disable canvas':
foreach (var component in canvasComponents)
component.enabled = false;
}
2改写OnTrackingFound()、OnTrackingLost()
我在网上参考了很多文章,《AR与VR实战》这本书的3.1节,实现了这个功能,文章链接如下:
https://blog.csdn.net/weixin_34275734/article/details/90558671
但是却怎么都实现不了OnTrackingLost()的功能,程序显示“TrackObject”未定义,或者未引入命名空间。
在这里,TrackObject是我自己创建的一个C#文件名。然后我就开始在网上大量搜索“Unity 3D 中C#文件互相调用的问题”。可是并没有准确的答案,系统报错的截图如下:
在一天半的各种试验下,我终于发现在书中是要求将DefaultTrackableEventHandler复制一份,再重新改写,而我是直接在原有的DefaultTrackableEventHandler上改写,破坏了Vuforia中自带的DefaultTrackableEventHandler。
将原有的DefaultTrackableEventHandler文件复制一份,名称改为MyDefaultTrackableEventHandler,再进行改写,原有的错误就消失啦~
这里的感触是代码小白在刚开始编程时,原理可能还没有弄清楚,但一定要一丝不苟的按照现有教程来。
3《AR与VR实战》这的3.1节理解
//改写代码
private void OnTrackingFound()
{
//动态加载模型并实例化到场景中
GameObject obj = GameObject.Instantiate(Resources.Load("Cube")) as GameObject;
//生成之后设定它的父级为识别图物体
obj.transform.parent = this.transform;
//设定物体与识别图在同一位置,这里可以根据需求设定
obj.transform.position = this.transform.position;
}
private void OnTrackingLost()
{
//从子物体中查找所有TrackObject组件
TrackObject to=GetComponentInChildren<TrackObject>();
//如果找到显示物体,则销毁物体并释放无用资源
if (to != null)
{
Destroy(to.gameObject);
Resources.UnloadUnusedAssets();
}
}
在这个代码改写中,OnTrackingFound()直接加载在Resources目录下的文件。但是由于obj是Found下的局部变量,因此在OnTrackingLost()需要重新定义。如果没有定义,直接使用Destory就会出现和我一样这样的报错:显示物体为空
在这本书中是通过在"Cube"(要加载的文件)下挂脚本,通过找脚本的方式,获得物体,因此也需要注意将脚本挂在需要加载的物体上。