Unity ARFoundation,创建具有多个图像跟踪的 Canvas 时出现问题

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

一切工作正常,除非我只能看到每个图像的画布一次。当我进入DisableMe()函数时,有什么方法可以重置这个UpdateTrackedImages方法吗?尝试将 trackedImage 设置为 null 但它不起作用...... 画布对于所有这些都是相同的,但是按钮将接收不同的信息。我应该能够回到他们每一个。

private void UpdateTrackedImages(IEnumerable<ARTrackedImage> trackedImages)
    {
        // If the same image (ReferenceImageName)
        foreach (var trackedImage in trackedImages)
        {
            if (Chairs.Contains(trackedImage.referenceImage.name))
            {
                if (trackedImage.trackingState == TrackingState.Tracking)
                {
                    Invoke("EnableMe", 0.5f);
                }

                if (trackedImage.trackingState != TrackingState.Tracking)
                {
                    Invoke("DisableMe", 0.5f);
                }
            }
        }
    }

    private void EnableMe()
    {
        canvas.enabled = true;
    }
    private void DisableMe()
    {
        canvas.enabled = false;
        trackedImage = null;
    }

我尝试将 trackedImage 设置为 null 但它不起作用...... 画布对于所有这些都是相同的,但是按钮将接收不同的信息。我应该能够回到他们每一个。

c# unity-game-engine augmented-reality ar-foundation
1个回答
0
投票

似乎需要在进入

DisableMe()
功能时重置跟踪图像的状态,以便您可以再次看到每个图像的画布。

您面临的问题是因为

trackedImage
变量是在 foreach 循环内部声明的,并且无法在其外部访问。因此,当您在
trackedImage = null;
函数内调用
DisableMe()
时,它只会影响该函数内的局部变量,而不影响
foreach
循环中的变量。

要解决此问题,您可以为 trackedImage 声明一个类级变量,该变量将存储当前跟踪的图像。这是实现这一目标的修改后的代码:


    private ARTrackedImage currentTrackedImage; // Declare a class-level variable to store the current tracked image

private void UpdateTrackedImages(IEnumerable<ARTrackedImage> trackedImages)
{
    // If the same image (ReferenceImageName)
    foreach (var trackedImage in trackedImages)
    {
        if (Chairs.Contains(trackedImage.referenceImage.name))
        {
            if (trackedImage.trackingState == TrackingState.Tracking)
            {
                currentTrackedImage = trackedImage; // Store the currently tracked image
                Invoke("EnableMe", 0.5f);
            }

            if (trackedImage.trackingState != TrackingState.Tracking)
            {
                Invoke("DisableMe", 0.5f);
            }
        }
    }
}

private void EnableMe()
{
    canvas.enabled = true;
}

private void DisableMe()
{
    canvas.enabled = false;
    currentTrackedImage = null; // Reset the currently tracked image when disabling the canvas
}

现在,通过使用 currentTrackedImage 变量,您应该能够独立启用和禁用每个跟踪图像的画布。请记住在代码的其他部分访问 currentTrackedImage 之前检查它是否不为 null。

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