我有一个 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);
}
}
}
}
谢谢!
您面临的问题可能与您如何处理 10 秒延迟的覆盖层破坏有关。当再次检测到图像时,覆盖层不会出现,因为之前的覆盖层仍在被破坏。要解决此问题,您可以修改代码,以在再次检测到相同图像时取消对先前叠加层的破坏。