在我尝试在延迟后销毁预制件后,它立即立即销毁预制件,没有任何延迟。我正在使用
UnityEngine.Object.Destroy
方法。我也尝试过使用协程,但没有成功。
我是一名高中生,正在努力解决这个问题,如果这看起来是一个愚蠢的问题,我很抱歉。
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 tarcked 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>();
private void Awake()
{
//Cache a reference to the Tarcked IMage Manager component
_trackedImagesManager = GetComponent<ARTrackedImageManager>();
}
private void OnEnable()
{
// Attavh event handler when tarcked 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.updated)
{
// 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 wehter their corresponding image is currently being tracked
foreach (var trackedImage in eventArgs.updated)
{
_instantiatedPrefabs[trackedImage.referenceImage.name].SetActive(trackedImage.trackingState == TrackingState.Tracking);
}
// If the AR subsystem has given up looking for a tracked image
foreach (var trackedImage in eventArgs.removed)
{
// Destroy its prefab after 10 second delay
Destroy(_instantiatedPrefabs[trackedImage.referenceImage.name],10f);
// Remove instance from the array
_instantiatedPrefabs.Remove(trackedImage.referenceImage.name);
}
}
}
我的问题出在第 68 行,当我调用 destroy 方法时。谢谢!
看起来您可能错误地将实例化对象的销毁解释为第 68 行调用 Destroy 的结果 - 实际上,销毁正在发生,因为 ARTrackedImageManager 正在销毁 ARTrackedImage 本身 - 在发送“删除”后立即' 活动。
由于您的实例化对象是 ARTrackedImage 的父对象,因此一旦 ARTrackedImage 本身被销毁,它就会被销毁,这意味着您自己对 Destroy 的调用基本上被取代:
var newPrefab = Instantiate(curPrefab, trackedImage.transform);
为了防止实例化对象被自动销毁,您可以将 ARTrackedImage.destroyOnRemoval 设置为 false。这意味着您需要手动销毁 ARTrackedImage 游戏对象,而不仅仅是您自己实例化的游戏对象 - 但它应该给出您需要的结果。