Unity+Vuforia“自定义”物体消失、出现

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"(要加载的文件)下挂脚本,通过找脚本的方式,获得物体,因此也需要注意将脚本挂在需要加载的物体上。

发布了1 篇原创文章 · 获赞 1 · 访问量 87

猜你喜欢

转载自blog.csdn.net/LR2024/article/details/104198038
今日推荐