我如何制作DefaultTrackableEventHandler脚本来检查随机选择的游戏对象是否与向相机显示的游戏对象

本文关键字:对象 游戏 是否 显示 相机 选择 DefaultTrackableEventHandler 何制作 脚本 本来 随机 | 更新日期: 2023-09-27 18:28:22

这是一个从游戏对象数组中随机选择对象的脚本:

public GameObject[] models;
       GameObject currentPoint;
       int index;
 public AudioSource correct;
 public AudioSource notcorrect;
 void Start()
 {
     models = GameObject.FindGameObjectsWithTag("numbers");
     index = Random.Range (0, models.Length);
     currentPoint = models[index];
     print (currentPoint.name);
     models [index].GetComponent<AudioSource> ().PlayDelayed(2);
     }

所以现在它得到一个随机游戏对象,并播放它的相关AudioClip(例如数字5),现在在DefaultTrackableEventHandler中,我需要检查显示给相机的数字是否等于随机选择的数字。

我在下面发布DefaultTrackableEventHandler脚本:

using UnityEngine;
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()
        {
            mTrackableBehaviour = GetComponent<TrackableBehaviour>();
            if (mTrackableBehaviour)
            {
                mTrackableBehaviour.RegisterTrackableEventHandler(this);
            }
        }
        #endregion // UNTIY_MONOBEHAVIOUR_METHODS

        #region PUBLIC_METHODS
        public GameObject show;
        public GameObject hide;
        /// <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()
        {
            show.SetActive(true);
            Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
            Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
            AudioSource[] audiocomponents  = GetComponentsInChildren<AudioSource>(true);
            // Enable rendering:
            foreach (Renderer component in rendererComponents)
            {
                component.enabled = true;
            }

            // Enable colliders:
            foreach (Collider component in colliderComponents)
            {
                component.enabled = true;
            }
            //Enable AudioSource 
            foreach (AudioSource component in audiocomponents)
            {
                component.enabled = true;
            }
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
        }

        private void OnTrackingLost()
        {
            hide.SetActive(true);
            Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
            Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
            AudioSource[] audiocomponents  = GetComponentsInChildren<AudioSource>(true);
            // Disable rendering:
            foreach (Renderer component in rendererComponents)
            {
                component.enabled = false;
            }
            // Disable colliders:
            foreach (Collider component in colliderComponents)
            {
                component.enabled = false;
            }
            //Disable AudioSource
            foreach (AudioSource component in audiocomponents)
            {
                component.enabled = false;
            }
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
        }
        #endregion // PRIVATE_METHODS
    }
}

请帮帮我!!

我如何制作DefaultTrackableEventHandler脚本来检查随机选择的游戏对象是否与向相机显示的游戏对象

Vuforia处理包含可跟踪源的数据集,所以假设您有5个对象,它们代表从1到5的数字,那么您的数据集中需要有5个可跟踪对象。这些都是在Vuforia门户网站上创建的。

然后,你选择一个游戏对象,这个游戏对象应该是可追踪的。您可以定义要匹配的名称,然后可以执行以下操作:

StateManager sm = TrackerManager.Instance.GetStateManager ();
// This gets all the trackable currently tracked
// so if you are looking at 3 and 5 it will contain both
IEnumerable<TrackableBehaviour> activeTrackables = sm.GetActiveTrackableBehaviours ();
 
foreach (TrackableBehaviour tb in activeTrackables) {
    // As you iterate, you compare with current game object name
    // if you have 3 and 5 and target object is 5 then you get a match.
    if( tb.TrackableName == currentObject.name) { }
}