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"(要加載的文件)下掛腳本,通過找腳本的方式,獲得物體,因此也需要注意將腳本掛在需要加載的物體上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章