Vuforia 中在脚本中添加识别图被识别和丢失的回调

来源:互联网 发布:淘宝运费险怎么退邮费 编辑:程序博客网 时间:2024/05/17 01:49

start

Vuforia 的unity sdk中有一个重要的脚本 DefaultTrackableEventHandler.cs, 这个脚本在场景中拖入ImageTarget的预制体时会自动挂载

using UnityEngine;using UnityEngine.SceneManagement;namespace Vuforia{    /// <summary>    /// A custom handler that implements the ITrackableEventHandler interface.    /// </summary>    public class DefaultTrackableEventHandler : MonoBehaviour,                                                ITrackableEventHandler    {        #region PRIVATE_MEMBER_VARIABLES        private TrackableBehaviour mTrackableBehaviour;        #endregion // PRIVATE_MEMBER_VARIABLES        #region UNTIY_MONOBEHAVIOUR_METHODS        void Start()        {            //easytouch = GameObject.Find ("EasyTouchControlsCanvas");        //  easytouch.SetActive (false);            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)        {            // Debug.Log ("newStatus1" + 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");        }        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");        }        #endregion // PRIVATE_METHODS    }}

分析

可以发现这个脚本是实现了ITrackableEventHandler的接口,在通过对OnTrackableStateChanged状态的判断来通知是否完成对识别图的识别或者已经丢失识别图,这样就可以实现在识别时触发一些事件。
由于这个脚本是公共使用的,自动被ImageTarget挂载的 ,存在多个场景或者多个ImageTarget,但是里面定义的事件不是公共的那么就需要自己写一个脚本实现。(模仿DefaultTrackableEventHandler 实现)

using System.Collections;using System.Collections.Generic;using UnityEngine;using DG.Tweening;using Vuforia;/// <summary>/// 出场方式的动画加粒子效果 的控制 /// </summary>public class CoolShowWhenTrack : MonoBehaviour, ITrackableEventHandler{    /// <summary>    /// 出场时候附带的粒子    /// </summary>    private GameObject showParticle;    private DOTweenAnimation[] dotweens;    private bool isShowFirst;    #region UNTIY_MONOBEHAVIOUR_METHODS    // Use this for initialization    void Start () {        isShowFirst = true;        showParticle = GameObject.Find ("showParticle");        dotweens = GetComponentsInChildren<DOTweenAnimation> ();        //startShowEffect ();        mTrackableBehaviour = GetComponent<TrackableBehaviour>();        if (mTrackableBehaviour)        {            mTrackableBehaviour.RegisterTrackableEventHandler(this);        }    }    // Update is called once per frame    void Update () {    }    // 在第一次被识别的时候调用    public void startShowEffect() {        // 开启各个动画        foreach (DOTweenAnimation dotween in dotweens) {            dotween.DOPlay ();        }    }    #endregion // UNTIY_MONOBEHAVIOUR_METHODS    // ### start about track ###    #region PRIVATE_MEMBER_VARIABLES    private TrackableBehaviour mTrackableBehaviour;    #endregion // PRIVATE_MEMBER_VARIABLES    #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)    {        // Debug.Log ("newStatus1" + 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()    {        Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found111");        // 只在识别后展示一次出场动画        if (isShowFirst) {            startShowEffect ();            isShowFirst = false;        }    }    private void OnTrackingLost()    {        Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost111");    }    #endregion // PRIVATE_METHODS}

之前把这个脚本挂载在了模型身上,没有生效,经过测试发现 必须挂载在ImageTarget上才可以回调到识别状态改变的事件

最后来个效果展示~:
1

阅读全文
0 0
原创粉丝点击