如何修复Unity AR中的destroy方法

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

在我尝试在延迟后销毁预制件后,它立即立即销毁预制件,没有任何延迟。我正在使用

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 方法时。谢谢!

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

看起来您可能错误地将实例化对象的销毁解释为第 68 行调用 Destroy 的结果 - 实际上,销毁正在发生,因为 ARTrackedImageManager 正在销毁 ARTrackedImage 本身 - 在发送“删除”后立即' 活动。

由于您的实例化对象是 ARTrackedImage 的父对象,因此一旦 ARTrackedImage 本身被销毁,它就会被销毁,这意味着您自己对 Destroy 的调用基本上被取代:

var newPrefab = Instantiate(curPrefab, trackedImage.transform);

为了防止实例化对象被自动销毁,您可以将 ARTrackedImage.destroyOnRemoval 设置为 false。这意味着您需要手动销毁 ARTrackedImage 游戏对象,而不仅仅是您自己实例化的游戏对象 - 但它应该给出您需要的结果。

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