Итак, в Unity я пытаюсь создать приложение AR, которое порождает что-то после обнаружения определенного изображения. Если камера теряет отслеживание изображения или объекта, она приклеивает созданный объект к экрану. Как я могу этого избежать и есть ли переменная, которая показывает состояние?
Я уже пробовал переменную "TrackingState", которая, к сожалению, не сработала. "Limited не только применяется к состоянию приклеивания (к экрану), но также и" поврежден ", что приводит к исчезновению объекта, хотя он все еще отображается правильно. Это, к сожалению, приводит к очень чувствительному обращению с камерой, поэтому это не так. вариант. «Нет», с другой стороны, никогда не появлялся.
Не могли бы вы назвать другие элементы, которые я мог бы использовать для решения этой проблемы? Или объясните, что я делаю не так с «TrackingState»?
Вот код, который я пробовал до сих пор (у меня также был регистратор, чтобы показывать, в каком состоянии он находится каждые полсекунды):
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class ImagesToFigures : MonoBehaviour
{
private ARTrackedImageManager _arTrackedImageManager;
private ARManager _arManager;
private GameObject spawnedObject;
private string existingString;
private bool isActive;
private GameObject[] children;
private FoundStickerEvent foundStickerEvent;
private string addedSticker = "";
private XRReferenceImage referenceImage;
void Awake()
{
_arTrackedImageManager = GetComponentInParent<ARTrackedImageManager>();
// if (GetComponentInParent<ARManager>()) {
_arManager = GetComponentInParent<ARManager>();
// }
existingString = "";
children = new GameObject[this.transform.childCount];
for (int i = 0; i < this.transform.childCount; i++)
{
GameObject child = this.transform.GetChild(i).gameObject;
children[i] = child;
}
}
public void activate()
{
isActive = true;
}
public void OnEnable()
{
_arTrackedImageManager.trackedImagesChanged += OnImageChanged;
}
public void OnDisable()
{
_arTrackedImageManager.trackedImagesChanged -= OnImageChanged;
}
public void destroySpawnedObject()
{
// existingString = "";
foreach (var child in children)
{
child.SetActive(false);
}
// addedSticker = "";
// GameManager.instance.log("destroyed");
}
private void OnImageChanged(ARTrackedImagesChangedEventArgs eventArgs)
{
if (GameManager.instance.currentState == GameState.AR_SCANNING)
{
// GameManager.instance.log(eventArgs.updated.Count +" " + referenceImage.name);
foreach (GameObject child in children)
{
if (addedSticker == "")
{
foreach (ARTrackedImage trackedImage in eventArgs.added)
{
addedSticker = trackedImage.referenceImage.name;
// GameManager.instance.log(addedSticker);
}
}
else
{
// GameManager.instance.log(eventArgs.updated.Count.ToString());
foreach (ARTrackedImage trackedImage in eventArgs.updated)
{
try
{
if (child.name == trackedImage.referenceImage.name &&
(child.name == addedSticker || (referenceImage.name == trackedImage.referenceImage.name && child.name == referenceImage.name))
)
{
if (trackedImage.trackingState == TrackingState.Tracking /*|| trackedImage.trackingState == TrackingState.Limited*/)
{
child.SetActive(true);
GameManager.instance.currentState = GameState.AR_SCANNED;
GameManager.instance.log(trackedImage.referenceImage.name);
referenceImage = trackedImage.referenceImage;
// GameManager.instance.log(child.transform.position.ToString());
// trackedImage.destroyOnRemoval = true;
_arManager.foundStickerEvent.Invoke(trackedImage.referenceImage.name);
// _arManager.displayInfosEvent.Invoke("Tippe auf die Figur für spannende Infos!");
}
}
// else
// {
// child.SetActive(false);
// }
}
catch (Exception e)
{
GameManager.instance.log("error: " + e.ToString());
}
}
}
}
}
if ((currentlyActiveImage.trackingState == TrackingState.None) || currentlyActiveImage.trackingState == TrackingState.Limited))
{
GameManager.instance.destroyARObject();
GameManager.instance.ResetState();
}