找unity同事要的一个脚本直接加上去
这是脱卡的管理类
TrackManager.cs
using UnityEngine;
using System.Collections;
public class TrackManager : MonoBehaviour
{
#region 单例
private static TrackManager _instance;
public static TrackManager Instance { get { return _instance; } }
void Awake()
{
_instance = this;
}
#endregion
private Transform _camera;
private Transform _target;
private Transform _model;
void Start()
{
_camera = Camera.main.transform;
}
/// <summary>
/// 识别到图片时
/// </summary>
/// <param name="target"></param>
public void OnTrackingFound(Transform target)
{
if (_target == null)
{
_target = target;
_model = _target.GetChild(0);
InitModel();
}
else if (_target == target) //如果再次识别到的图片还是上次的识别图
{
InitModel();
}
else //当前的识别图不是上次的识别图
{
ResetModel(); //重置上次的模型
_target = target;
_model = _target.GetChild(0);
InitModel();
}
}
/// <summary>
/// 脱离图片时
/// </summary>
/// <param name="model"></param>
public void OnTrackingLost(Transform target)
{
if (_target == null) //初始化时调用TrackLost则全部将模型隐藏
HideModel(target.GetChild(0).gameObject);
else
ShowInCamera(); //否则设为相机子对象显示在屏幕中
}
/// <summary>
/// 在识别图上重置
/// </summary>
void InitModel()
{
if (_model == null || _target == null)
return;
if (_model.parent == _target) //判断当前模型的父对象是否是识别图
{
_model.localPosition = Vector3.zero;
_model.localEulerAngles = Vector3.zero;
_model.localScale = Vector3.one;
}
else
{
_model.parent = null;
_model.localScale = Vector3.one;
_model.parent = _target;
_model.localPosition = Vector3.zero;
_model.localEulerAngles = Vector3.zero;
}
ShowModel();
}
/// <summary>
/// 脱离识别图时重置模型
/// </summary>
void ResetModel()
{
if (_model == null || _target == null)
return;
_model.parent = null;
_model.localScale = Vector3.one;
_model.parent = _target;
_model.position = Vector3.zero;
_model.eulerAngles = Vector3.zero;
HideModel();
}
/// <summary>
/// 脱离识别图后的模型显示在屏幕中央
/// </summary>
void ShowInCamera()
{
if (_model == null || _camera == null)
return;
if (_model.parent == _camera)
{
_model.localPosition = new Vector3(0f, -0.25f, 1.5f);
_model.localEulerAngles = new Vector3(0f,90f,0f);
_model.localScale = Vector3.one;
}
else
{
_model.parent = null;
_model.localScale = Vector3.one;
_model.parent = _camera;
_model.localPosition = new Vector3(0f, -0.25f, 1.5f);
_model.localEulerAngles = new Vector3(0f,90f,0f);
}
ShowModel();
}
/// <summary>
/// 隐藏模型
/// </summary>
void HideModel()
{
if (_model != null)
_model.gameObject.SetActive(false);
}
/// <summary>
/// 初始化时隐藏模型
/// </summary>
/// <param name="model"></param>
void HideModel(GameObject model)
{
model.SetActive(false);
}
/// <summary>
/// 显示模型
/// </summary>
void ShowModel()
{
if (_model != null)
_model.gameObject.SetActive(true);
}
}
同时在vuforia的DefaultTrackableEventHandler类中引用这个类
TrackableEventHandler.cs
/*==============================================================================
Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
All Rights Reserved.
Confidential and Proprietary - Protected under copyright and other laws.
==============================================================================*/
using UnityEngine;
namespace Vuforia
{
/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
/// </summary>
public class TrackableEventHandler : MonoBehaviour,
ITrackableEventHandler
{
#region PRIVATE_MEMBER_VARIABLES
private TrackableBehaviour mTrackableBehaviour;
#endregion // PRIVATE_MEMBER_VARIABLES
#region UNTIY_MONOBEHAVIOUR_METHODS
void Start()
{
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
}
#endregion // UNTIY_MONOBEHAVIOUR_METHODS
#region PUBLIC_METHODS
/// <summary>
/// Implementation of the ITrackableEventHandler function called when the
/// tracking state changes.
/// </summary>
public void OnTrackableStateChanged(
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
OnTrackingFound();
}
else
{
OnTrackingLost();
}
}
#endregion // PUBLIC_METHODS
#region PRIVATE_METHODS
private void OnTrackingFound()
{
// Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
// Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
//
// // Enable rendering:
// foreach (Renderer component in rendererComponents)
// {
// component.enabled = true;
// }
//
// // Enable colliders:
// foreach (Collider component in colliderComponents)
// {
// component.enabled = true;
// }
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
TrackManager.Instance.OnTrackingFound(mTrackableBehaviour.transform);
}
private void OnTrackingLost()
{
// Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
// Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
//
// // Disable rendering:
// foreach (Renderer component in rendererComponents)
// {
// component.enabled = false;
// }
//
// // Disable colliders:
// foreach (Collider component in colliderComponents)
// {
// component.enabled = false;
// }
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
TrackManager.Instance.OnTrackingLost(mTrackableBehaviour.transform);
}
#endregion // PRIVATE_METHODS
}
}
最后在每个imageTarget上添加这个脚本,并把原先的vuforia自带的那个删掉