Unity室内导航应用:Vuforia图像目标丢失时如何保留显示模型?
解决Vuforia目标丢失后导航线保持显示的问题
核心问题是Vuforia默认会在图像目标丢失时禁用TrackableBehaviour所属的GameObject,导致其所有子对象(包括导航线)被隐藏。要解决这个问题,你需要把导航线从目标对象的层级中剥离,并通过OnTrackableStateChanged回调控制导航线的显示状态。
实现步骤:
调整对象层级
- 将你的导航线对象从Image Target的子节点拖到场景根节点(或独立的父节点下),确保它不依赖Image Target的激活状态。
编写Trackable状态回调脚本
创建一个脚本挂在Image Target对象上,实现ITrackableEventHandler接口,在目标识别/丢失时控制导航线:
using UnityEngine; using Vuforia; public class NavigationLinePersist : MonoBehaviour, ITrackableEventHandler { private TrackableBehaviour _trackableBehaviour; public GameObject navigationLine; // 在Inspector中拖拽你的导航线对象 private Vector3 _targetLastPosition; private Quaternion _targetLastRotation; void Start() { _trackableBehaviour = GetComponent<TrackableBehaviour>(); if (_trackableBehaviour != null) { _trackableBehaviour.RegisterTrackableEventHandler(this); } navigationLine.SetActive(false); } public void OnTrackableStateChanged( TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus) { if (newStatus == TrackableBehaviour.Status.DETECTED || newStatus == TrackableBehaviour.Status.TRACKED || newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) { // 识别到目标时,更新导航线位置并显示 _targetLastPosition = _trackableBehaviour.transform.position; _targetLastRotation = _trackableBehaviour.transform.rotation; navigationLine.SetActive(true); navigationLine.transform.position = _targetLastPosition; navigationLine.transform.rotation = _targetLastRotation; // 如果你的导航线是LineRenderer,这里可以设置起点为目标位置 // var lineRenderer = navigationLine.GetComponent<LineRenderer>(); // lineRenderer.SetPosition(0, _targetLastPosition); } else { // 目标丢失时,保持导航线显示,不做隐藏操作 // 若需要维持导航线的位置,直接保留当前状态即可 } } }
关键注意点:
- 不要让导航线成为Image Target的子对象,否则目标丢失时整个Image Target被禁用,导航线会被强制隐藏。
- 如果导航线的路径依赖目标的位置,在目标识别时记录目标的世界坐标,后续即使目标丢失,也用这个记录的坐标作为导航起点,不需要再依赖Trackable的transform。
- 测试时留意Vuforia的状态切换:当目标完全移出屏幕,状态会变为
LOST,此时脚本不会执行隐藏逻辑,导航线会保持显示。
内容的提问来源于stack exchange,提问作者Sir Antelope
相关产品推荐
相关产品推荐

