使用Vuforia时TrackableBehaviour.Status类型缺失问题排查
问题:Vuforia 10.28中
TrackableBehaviour.Status不存在,编译报错CS0234 问题详情
编译代码时触发如下报错:
Assets\NewBehaviourScript.cs(13,64): error CS0234: The type or namespace name 'Status' does not exist in the namespace 'TrackableBehaviour (are you missing an assembly reference?).
涉及代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; using Vuforia; public class ImageTargetFeedback : MonoBehaviour, ITrackableEventHandler { public GameObject feedbackText; public string targetIDToLookFor = "dcba3eb2f8844544ba339810510f0491"; public void OnTrackableStateChanged(TrackableBehaviour.Status status) { TrackableBehaviour trackableBehaviour = (TrackableBehaviour)target; if (status == TrackableBehaviour.Status.DETECTED || status == TrackableBehaviour.Status.TRACKED) { if (trackableBehaviour.TrackableName == targetIDToLookFor) { feedbackText.SetActive(true); feedbackText.GetComponent<TextMeshProUGUI>().text = "Correct Image Target Detected!"; } else { feedbackText.SetActive(false); } } else { feedbackText.SetActive(false); } } }
复现步骤
- 创建Unity 3D Core项目;
- 拖拽导入Vuforia Engine 10.28;
- 导入自行在Vuforia平台创建的目标数据库;
- 获取许可证密钥并配置到AR相机;
- 通过Vuforia菜单在层级面板创建图像目标并关联数据库;
- 在图像目标上放置虚拟对象。
需求
数据库内有多张卡片,需实现AR相机识别到指定ID的目标时,显示反馈文本;识别其他目标或未识别时隐藏文本。
原因分析
Vuforia Engine 10及以上版本对API做了兼容性更新:
- 原
TrackableBehaviour.Status枚举被重命名为TrackableBehaviour.TrackableStatus; ITrackableEventHandler接口的OnTrackableStateChanged方法签名变更,从单参数改为接收前状态和当前状态两个参数;- 原代码中未定义
target变量,无法正确获取图像目标实例。
解决方案
修改代码以适配Vuforia 10.28的API规范:
using System.Collections; using System.Collections.Generic; using UnityEngine; using Vuforia; using TMPro; public class ImageTargetFeedback : MonoBehaviour, ITrackableEventHandler { public GameObject feedbackText; public string targetIDToLookFor = "dcba3eb2f8844544ba339810510f0491"; // 适配Vuforia 10+的方法签名 public void OnTrackableStateChanged(TrackableBehaviour.TrackableStatus previousStatus, TrackableBehaviour.TrackableStatus newStatus) { TrackableBehaviour trackableBehaviour = GetComponent<TrackableBehaviour>(); if (newStatus == TrackableBehaviour.TrackableStatus.DETECTED || newStatus == TrackableBehaviour.TrackableStatus.TRACKED) { // 用TrackableId匹配数据库中的唯一标识,比TrackableName更可靠 if (trackableBehaviour.TrackableId == targetIDToLookFor) { feedbackText.SetActive(true); feedbackText.GetComponent<TextMeshProUGUI>().text = "Correct Image Target Detected!"; } else { feedbackText.SetActive(false); } } else { feedbackText.SetActive(false); } } // 注册状态监听事件 private void Awake() { TrackableBehaviour trackableBehaviour = GetComponent<TrackableBehaviour>(); if (trackableBehaviour != null) { trackableBehaviour.RegisterTrackableEventHandler(this); } } // 注销监听事件,避免内存泄漏 private void OnDestroy() { TrackableBehaviour trackableBehaviour = GetComponent<TrackableBehaviour>(); if (trackableBehaviour != null) { trackableBehaviour.UnregisterTrackableEventHandler(this); } } }
关键修改说明
- API适配:将
TrackableBehaviour.Status替换为TrackableBehaviour.TrackableStatus,同步更新方法签名; - 实例获取:通过
GetComponent<TrackableBehaviour>()获取当前挂载脚本的图像目标组件,替代未定义的target变量; - 匹配优化:使用
TrackableId匹配目标(数据库中目标的唯一标识),比TrackableName更准确; - 事件管理:添加
Awake和OnDestroy方法,完成事件的注册与注销,确保状态变化能触发回调; - 命名空间补充:添加
TMPro命名空间,解决TextMeshProUGUI类型识别问题。
内容的提问来源于stack exchange,提问作者Aayon Ambrose
相关产品推荐
相关产品推荐

