在 Unity AR 中重新扫描对象

问题描述 投票:0回答:1

我有一个 Unity AR 脚本,可以扫描图像,然后使覆盖层出现在检测到的图像之上。当我在覆盖层被破坏之前添加 10 秒的延迟时,如果再次检测到相同的图像,覆盖层将停止出现。

我必须从 eventArgs.updated 循环中删除一行代码:

_instantiatedPrefabs[trackedImage.referenceImage.name].SetActive(trackedImage.trackingState == TrackingState.Tracking);
这样就会出现延迟并且叠加不会立即消失。

我是一名高中生,如果这看起来是一个愚蠢的问题,我很抱歉。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
using System;

[RequireComponent(typeof(ARTrackedImageManager))]
public class PlaceTrackedImages : MonoBehaviour
{
    // Reference to AR tracked image manager component 
    private ARTrackedImageManager _trackedImagesManager;
    // List of prefabs to instaniate
    public GameObject[] ArPrefabs;
    // Dictionary array of created prefabs 
    private readonly Dictionary<string, GameObject> _instantiatedPrefabs = new Dictionary<string, GameObject>();
    // Do not immeditaly destory parent object when it is no longer detected 
    public bool destroyOnRemoval = false;

    private void Awake()
    {
        // Cache a reference to the Tracked Image Manager component  
        _trackedImagesManager = GetComponent<ARTrackedImageManager>();
    }
 
    private void OnEnable()
    {
        // Attach event handler when tracked images change 
        _trackedImagesManager.trackedImagesChanged += OnTrackedImagesChanged;
    }

    private void OnDisable()
    {
        // Remove event handler 
        _trackedImagesManager.trackedImagesChanged -= OnTrackedImagesChanged;
    }

    // Event Handler 
    private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
    {
        // Loop through all new tracked images that have been detected 
        foreach (var trackedImage in eventArgs.added)
        {
            // Get the name of the reference image 
            var imageName = trackedImage.referenceImage.name;
            // Loop over the array of prefabs 
            foreach (var curPrefab in ArPrefabs)
            {
                // Check whether this prefab matches the tracked image name, and that the prefab hasn't already been created 
                if (string.Compare(curPrefab.name, imageName, StringComparison.OrdinalIgnoreCase) == 0 && !_instantiatedPrefabs.ContainsKey(imageName))
                {
                    // Instantiate the prefab, parenting it to the ARTrackedImage 
                    var newPrefab = Instantiate(curPrefab, trackedImage.transform);
                    // Add the created prefab to the array 
                    _instantiatedPrefabs[imageName] = newPrefab;
                }
            }
        }

        // For all prefabs that have been created so far, set them active or not depending on wether their corresponding image is currently being tracked 
        foreach (var trackedImage in eventArgs.updated)
        {
            if (trackedImage.trackingState == TrackingState.Limited || trackedImage.trackingState == TrackingState.None)
            {
                Destroy(trackedImage.gameObject, 10f);
            } 
        }

    }
}

谢谢!

unity-game-engine augmented-reality
1个回答
0
投票

您面临的问题可能与您如何处理 10 秒延迟的覆盖层破坏有关。当再次检测到图像时,覆盖层不会出现,因为之前的覆盖层仍在被破坏。要解决此问题,您可以修改代码,以在再次检测到相同图像时取消对先前叠加层的破坏。

© www.soinside.com 2019 - 2024. All rights reserved.