Unity ARFoundation多图像追踪问题:3D模型失识别后延迟隐藏
解决方案
要实现失去图像识别后延迟1秒隐藏模型,需要添加跟踪状态监测、计时器逻辑,以及帧更新时的延迟判断。以下是修改后的代码及关键改动说明:
关键改动点
- 新增跟踪状态标记、延迟计时器和可配置的延迟时间参数
- 处理
TrackingState变为None的情况,启动计时 - 在
Update方法中检查计时,达到延迟后隐藏模型 - 初始化时默认隐藏模型,避免未识别时显示
修改后的完整代码
using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.XR.ARFoundation; using UnityEngine.XR.ARSubsystems; public class ImageTracking2 : MonoBehaviour { public string ReferenceImageName; // 可在Inspector面板调整延迟隐藏的时间(秒) public float hideDelay = 1f; private ARTrackedImageManager _trackedImageManager; private float _lostTrackingTimer; private bool _isTracking; private ARTrackedImage _currentTrackedImage; private void Awake() { _trackedImageManager = FindObjectOfType<ARTrackedImageManager>(); // 初始状态隐藏模型 gameObject.SetActive(false); } private void OnEnable() { if (_trackedImageManager != null) { _trackedImageManager.trackedImagesChanged += OnTrackedImagesChanged; } } private void OnDisable() { if (_trackedImageManager != null) { _trackedImageManager.trackedImagesChanged -= OnTrackedImagesChanged; } } private void Update() { // 如果未在跟踪状态,累加计时器 if (!_isTracking) { _lostTrackingTimer += Time.deltaTime; // 达到延迟时间后隐藏模型 if (_lostTrackingTimer >= hideDelay) { gameObject.SetActive(false); } } } private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs e) { foreach (var trackedImage in e.added) { Debug.Log($"Tracked image detected: {trackedImage.referenceImage.name} with size: {trackedImage.size}"); } UpdateTrackedImages(e.added); UpdateTrackedImages(e.updated); // 处理移除的跟踪图像(比如图像完全移出视野) UpdateTrackedImages(e.removed); } private void UpdateTrackedImages(IEnumerable<ARTrackedImage> trackedImages) { var targetImage = trackedImages.FirstOrDefault(x => x.referenceImage.name == ReferenceImageName); if (targetImage == null) { // 如果当前跟踪的图像被移除,标记为未跟踪 if (_currentTrackedImage != null && trackedImages.Contains(_currentTrackedImage)) { _isTracking = false; _currentTrackedImage = null; } return; } _currentTrackedImage = targetImage; switch (targetImage.trackingState) { case TrackingState.Tracking: case TrackingState.Limited: // 恢复跟踪时,重置计时器并显示模型 _isTracking = true; _lostTrackingTimer = 0f; gameObject.SetActive(true); // 更新模型位置和旋转 transform.SetPositionAndRotation(targetImage.transform.position, targetImage.transform.rotation); break; case TrackingState.None: // 失去跟踪时,标记状态并开始计时 _isTracking = false; _lostTrackingTimer = 0f; break; } } }
使用说明
- 将脚本挂载到需要显示的3D模型对象上
- 在Inspector面板中设置
ReferenceImageName为你要识别的参考图片名称 - 调整
hideDelay参数设置延迟隐藏的时间(默认1秒) - 确保场景中已正确配置
ARTrackedImageManager和参考图片库
内容的提问来源于stack exchange,提问作者Brahe
相关产品推荐
相关产品推荐

