You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
        }
    }
}

使用说明

  1. 将脚本挂载到需要显示的3D模型对象上
  2. 在Inspector面板中设置ReferenceImageName为你要识别的参考图片名称
  3. 调整hideDelay参数设置延迟隐藏的时间(默认1秒)
  4. 确保场景中已正确配置ARTrackedImageManager和参考图片库

内容的提问来源于stack exchange,提问作者Brahe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:43:12