ITrackableEventHandler在新版Vuforia失效,求替代方案及报错解决
解决Vuforia新版中ITrackableEventHandler弃用问题
问题原因
Vuforia 10及以上版本移除了ITrackableEventHandler接口,旧版TrackableBehaviour的用法也有调整,导致旧脚本出现类型找不到的报错。
替代方案
以下两种方式可实现原脚本的跟踪状态监听逻辑:
方式1:使用官方推荐的ITrackableStatusObserver接口
替换原ITrackableEventHandler接口,实现状态监听:
using UnityEngine; using UnityEngine.UI; using Vuforia; public class IoT : MonoBehaviour, ITrackableStatusObserver { public GameObject imageTarget; private TrackableBehaviour mTrackableBehaviour; private bool targetFound = false; public GameObject hide; void Start() { mTrackableBehaviour = imageTarget.GetComponent<TrackableBehaviour>(); if (mTrackableBehaviour != null) { mTrackableBehaviour.RegisterTrackableStatusObserver(this); } } void OnDestroy() { if (mTrackableBehaviour != null) { mTrackableBehaviour.UnregisterTrackableStatusObserver(this); } } public void OnTrackableStatusChanged( TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus) { if (newStatus == TrackableBehaviour.Status.DETECTED || newStatus == TrackableBehaviour.Status.TRACKED || newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) { OnTargetFound(); } else { OnTargetLost(); } } void OnTargetFound() { targetFound = true; if (hide != null) hide.SetActive(false); } void OnTargetLost() { targetFound = false; if (hide != null) hide.SetActive(true); } }
方式2:直接订阅状态变化事件
无需实现接口,通过事件绑定完成监听:
using UnityEngine; using UnityEngine.UI; using Vuforia; public class IoT : MonoBehaviour { public GameObject imageTarget; private TrackableBehaviour mTrackableBehaviour; private bool targetFound = false; public GameObject hide; void Start() { mTrackableBehaviour = imageTarget.GetComponent<TrackableBehaviour>(); if (mTrackableBehaviour != null) { mTrackableBehaviour.OnTrackableStatusChanged += OnTrackableStatusChanged; } } void OnDestroy() { if (mTrackableBehaviour != null) { mTrackableBehaviour.OnTrackableStatusChanged -= OnTrackableStatusChanged; } } void OnTrackableStatusChanged( TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus) { if (newStatus == TrackableBehaviour.Status.DETECTED || newStatus == TrackableBehaviour.Status.TRACKED || newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) { targetFound = true; if (hide != null) hide.SetActive(false); } else { targetFound = false; if (hide != null) hide.SetActive(true); } } }
额外注意事项
- 确保Unity中已正确导入最新版Vuforia包,且保留
using Vuforia;命名空间引用。 - 若
TrackableBehaviour仍报错,可替换为ImageTargetBehaviour(图像目标的子类,用法完全一致)。
内容的提问来源于stack exchange,提问作者Sol
相关产品推荐
相关产品推荐

