unity vuforia AR模型多卡切换后脱卡效果
找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自带的那个删掉