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