Unity Vuforia 动态生成识别图,返回识别图的监听
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using Vuforia;
/*
* 1.下载 XML Dat 文件到本地 (XML Dat 的路径和文件名要一样)
* 2.根据本地XML路径动态生成Vuforial识别图
* 3.生成完毕后 会返回识别图的监听 IEnumerable<ObserverBehaviour>
* 4.绑定监听 ObserverBehaviour
*/
public class VufroiaTrigger
{
public JsonData msg;
public UserSceneItem usi;
public string xmlFile;
public string datFile;
public static string LoaclxmlFile;
public static string LoacldatFile;
bool isData;
bool isXML;
public void init()
{
xmlFile = msg["vuforiaXML"].ToString();
datFile = msg["vuforiaDat"].ToString();
LoaclxmlFile = Application.persistentDataPath + "/StreamingAssets/Vuforia/GHZVuforia.xml";
LoacldatFile = Application.persistentDataPath + "/StreamingAssets/Vuforia/GHZVuforia.dat";
Debug.Log(" DGJ ===> " + LoaclxmlFile);
Debug.Log(" DGJ ===> " + LoacldatFile);
LoadManager.Instance.loadVuforia(xmlFile, datFile,(bool b)=> {
isXML = true;
if(isData)
{
GameScene.Instance.StartCoroutine(loadVuforia());
}
}, (bool b) => {
isData = true;
if (isXML)
{
GameScene.Instance.StartCoroutine(loadVuforia());
}
});
}
IEnumerator loadVuforia()
{
Debug.Log("DGJ ===> 加载Database " + LoaclxmlFile);
IEnumerable<ObserverBehaviour> observer = null;
observer = VuforiaBehaviour.Instance.ObserverFactory.CreateBehavioursFromDatabase(LoaclxmlFile);
try
{
}
catch (System.Exception e)
{
}
yield return observer;
// Create an Image Target from the database.
if(observer !=null)
{
foreach (string item2 in usi.SpotsList.Keys)
{
foreach (var item111 in usi.SpotsList[item2].modelList.Keys)
{
for (int ij = 0; ij < usi.SpotsList[item2].modelList[item111].materialList.Count; ij++)
{
Debug.Log("測試===2=》" + usi.SpotsList[item2].modelList[item111].materialList[ij].name);
Debug.Log("測試===2=》" + usi.SpotsList[item2].id + "_" + DataManager.Instance.ProjectID.ToString() + "_" + usi.id);
Debug.Log("測試===2=》" + usi.SpotsList[item2].triggerImageMark);
}
}
}
foreach (ObserverBehaviour item in observer)
{
foreach (string item2 in usi.SpotsList.Keys)
{
Debug.Log("HJJVufroia 正在匹配" + item.TargetName+"_"+ usi.SpotsList[item2].triggerImageMark);
if (item.TargetName == usi.SpotsList[item2].triggerImageMark)
{
Debug.Log("HJJVufroia 场景匹配成功"+ item.TargetName);
usi.SpotsList[item2].setObVuforia(item);
}
}
Debug.Log("DGJ ===> " + item.gameObject.name);
GameManager.Instance.listVuforia.Add(item.gameObject);
}
}
UIManager.Instance.HideUI(UINameConfig.LoadingPanel);
UserSceneUI.Instance.obj.GetComponent<UserChooseScene>().st.SetActive(true);
}
IEnumerator loadVuforia2()
{
Debug.Log("DGJ ===> 加载Database " + LoaclxmlFile);
IEnumerable<ObserverBehaviour> observer = null;
// 加载识别图
observer = VuforiaBehaviour.Instance.ObserverFactory.CreateBehavioursFromDatabase(LoaclxmlFile);
try
{
}
catch (System.Exception e)
{
}
yield return observer;
// Create an Image Target from the database.
if (observer != null)
{
foreach (ObserverBehaviour item in observer)
{
foreach (string item2 in usi.SpotsList.Keys)
{
Debug.Log("HJJVufroia 正在匹配" + item.TargetName + "_" + usi.SpotsList[item2].triggerImageMark);
if (item.TargetName == usi.SpotsList[item2].triggerImageMark)
{
Debug.Log("HJJVufroia 场景匹配成功" + item.TargetName);
usi.SpotsList[item2].setObVuforia(item);
/* setObVuforia 大致方法
this.obVuforia = obVuforia;
Debug.Log("添加Vuforia监听" + obVuforia.TargetName + " 景点===》" + name);
this.obVuforia.OnTargetStatusChanged += OnTargetStatusChanged;
obVuforia.gameObject.name = "ImageTarget_" + obVuforia.TargetName;
obVuforia.gameObject.AddComponent<TurnOffBehaviour>();
if (obVuforia.gameObject.GetComponent<DefaultObserverEventHandler>())
{
GameObject.Destroy(obVuforia.gameObject.GetComponent<DefaultObserverEventHandler>());
}
obVuforia.gameObject.AddComponent<DefaultObserverEventHandler>();
DefaultObserverEventHandler imageaction = obVuforia.gameObject.GetComponent<DefaultObserverEventHandler>();
obj = new GameObject("Cube");
obj.transform.parent = imageaction.transform;
obj.transform.localEulerAngles = new Vector3(90, 0, 0);
obj.transform.localPosition = Vector3.zero;
*/
}
}
Debug.Log("DGJ ===> " + item.gameObject.name);
GameManager.Instance.listVuforia.Add(item.gameObject);
}
}
UIManager.Instance.HideUI(UINameConfig.LoadingPanel);
UserSceneUI.Instance.obj.GetComponent<UserChooseScene>().st.SetActive(true);
}
}
在相机上可以动态添加
OpenXRCamera.Instance.head.gameObject.AddComponent<VuforiaBehaviour>();
OpenXRCamera.Instance.head.gameObject.AddComponent<DefaultInitializationErrorHandler>();
目前的缺点:
二次加载识别图的时候,已经加载过的识别图监听会返回报错,需要自己维护一个表 做判断, 如果有重复的话不要删除当前的监听物体,卸载掉原监听事件,新增新的监听事件(目前还是理论,没有实际测过)

浙公网安备 33010602011771号