我目前用的是高通6117版本的SDK,最新版函数改动不多,大体上一致,话不多说上代码
using UnityEngine;
using System.Collections;
using Vuforia;
using System.Collections.Generic;
using System.IO;
using UnityEngine.UI;
public class Vuforia_Template : MonoBehaviour
{
private string sz_DataPath = null;
private bool b_LoadDataSet = false;
private ObjectTracker m_ObjectTracker = null;
private DataSet m_DataSet = null;
private ImageTargetBehaviour[] m_ImageTargetBehaviours = null;
private static Vuforia_Template _insttance = null;
/// <summary>
/// 是否为使用本地识别库数据
/// </summary>
[Header("是否为使用本地识别库数据")]
public bool b_Location = false;
public static Vuforia_Template Instance
{
get { return _insttance; }
}
public string GetDataPath
{
get { return sz_DataPath; }
set { sz_DataPath = value; }
}
private void Awake()
{
_insttance = this;
}
void Start()
{
//string path = Application.isEditor ? Application.persistentDataPath.Replace("/" + Application.productName, "") : Application.persistentDataPath;
//GetDataPath = path + "/" + "Capable" + ".xml";
VuforiaBehaviour.Instance.RegisterVuforiaStartedCallback(RegisterVuforiaStartedCallback);
}
void RegisterVuforiaStartedCallback()
{
StartCoroutine(LoadDataSet());
}
public void StartLoadDataSet(string data_name)
{
sz_DataPath = data_name;
StartCoroutine(LoadDataSet());
}
#region Public_Method
IEnumerator LoadDataSet()
{
Debug.Log(sz_DataPath);
yield return new WaitUntil(delegate {
return !string.IsNullOrEmpty(sz_DataPath);
});
yield return new WaitForSecondsRealtime(0.5f);
if (VuforiaRuntimeUtilities.IsVuforiaEnabled())
{
m_ObjectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
m_DataSet = m_ObjectTracker.CreateDataSet();
if (m_DataSet == null && !b_Location)
{
b_LoadDataSet = m_DataSet.Load(sz_DataPath, VuforiaUnity.StorageType.STORAGE_ABSOLUTE);//绝对路径 一般用来网络下载的识别库
}
else
{
b_LoadDataSet = m_DataSet.Load(sz_DataPath);//本地预制的识别库
}
}
yield return null;
if (b_LoadDataSet)
{
m_ObjectTracker.ActivateDataSet(m_DataSet);
}
yield return new WaitUntil(() => FindObjectsOfType<ImageTargetBehaviour>().Length>0);
UpdateImageTarget();
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);
yield return new WaitForSeconds(.5f);
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
m_ObjectTracker.Start();//开启识别器 (可以理解为摄像头)
}
void UpdateImageTarget()
{
m_ImageTargetBehaviours = FindObjectsOfType<ImageTargetBehaviour>();
for (int i = 0; i < m_ImageTargetBehaviours.Length; i++)
{
ImageTargetBehaviour imageTargetBehaviour = m_ImageTargetBehaviours[i];
GameObject temp_cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
temp_cube.transform.localPosition = new Vector3(0, 0.4f, 0);
temp_cube.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
temp_cube.transform.SetParent(imageTargetBehaviour.transform,false);
imageTargetBehaviour.name = m_ImageTargetBehaviours[i].ImageTarget.Name + "Target";
imageTargetBehaviour.gameObject.AddComponent<DefaultTrackableEventHandler>();
imageTargetBehaviour.gameObject.AddComponent<TurnOffBehaviour>();
}
}
public void UnLoadDataSet(ImageTargetBehaviour[] imageTargetBehaviours = null)
{
if (m_ImageTargetBehaviours != null && m_ImageTargetBehaviours.Length>0&& imageTargetBehaviours ==null)
{
imageTargetBehaviours = m_ImageTargetBehaviours;
}
bool isVuforiaEnabled = VuforiaRuntimeUtilities.IsVuforiaEnabled();
if (isVuforiaEnabled)
{
ObjectTracker tracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
tracker.Stop();
tracker.DeactivateDataSet(m_DataSet);
IEnumerable<DataSet> dataSets = tracker.GetActiveDataSets();
IEnumerator<DataSet> dEnumerator = dataSets.GetEnumerator();
List<DataSet> list = new List<DataSet>();
while (dEnumerator.MoveNext())
{
list.Add(dEnumerator.Current);
}
for (int i = 0; i < list.Count; i++)
{
tracker.DeactivateDataSet(list[i]);
tracker.DestroyDataSet(list[i], true);
}
for (int i = 0; i < imageTargetBehaviours.Length; i++)
{
TrackerManager.Instance.GetStateManager().DestroyTrackableBehavioursForTrackable(imageTargetBehaviours[i].Trackable);
}
}
}
public IEnumerator SetFocusMode()
{
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);
yield return new WaitForSeconds(.5f);
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}
public void SetCameraDirection(CameraDevice.CameraDirection CameraDirection)
{
CameraDevice.Instance.Stop();
CameraDevice.Instance.Deinit();
CameraDevice.Instance.Init(CameraDirection);
CameraDevice.Instance.Start();
#if UNITY_IPHONE
if (CameraDirection == CameraDevice.CameraDirection.CAMERA_FRONT)
StartCoroutine(shuaxin());
#elif UNITY_ANDROID
#endif
}
IEnumerator shuaxin()
{
yield return new WaitForEndOfFrame();
Camera.main.transform.localEulerAngles = new Vector3(0, 0, 180.0f);
}
public void SetTrackedImageCount(int TrackedCount)
{
VuforiaUnity.SetHint(VuforiaUnity.VuforiaHint.HINT_MAX_SIMULTANEOUS_IMAGE_TARGETS, TrackedCount);
}
public void SetTrackedObjectCount(int TrackedCount)
{
VuforiaUnity.SetHint(VuforiaUnity.VuforiaHint.HINT_MAX_SIMULTANEOUS_OBJECT_TARGETS, TrackedCount);
}
#endregion
}