Отслеживание изображений в ARfoundation 2.1 с использованием Unity не работает? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть набор изображений, и для этих изображений мне нужно показать разные префабы. Для этого примера я использую два изображения и два префаба. Для imagetarget1 я хочу показать prefab1, а для imagetarget2 я хочу показать prefab2.

Ниже приведен раздел игровых объектов закрытого класса ARTrackedImageManager.

[SerializeField]
    [Tooltip("If not null, instantiates this prefab for each detected image.")]
    GameObject m_TrackedImagePrefab;

    /// <summary>
    /// If not null, instantiates this prefab for each detected image.
    /// </summary>
    public GameObject trackedImagePrefab
    {
        get { return m_TrackedImagePrefab; }
        set { m_TrackedImagePrefab = value; }
    }

    protected override GameObject GetPrefab()
    {
        return m_TrackedImagePrefab;
    }

    /// <summary>
    /// Invoked once per frame with information about the <see cref="ARTrackedImage"/>s that have changed, i.e., been added, updated, or removed.
    /// This happens just before <see cref="ARTrackedImage"/>s are destroyed, so you can set <c>ARTrackedImage.destroyOnRemoval</c> to <c>false</c>
    /// from this event to suppress this behavior.
    /// </summary>
    public event Action<ARTrackedImagesChangedEventArgs> trackedImagesChanged;

Я создал другой класс для загрузки двух префабов, которые могут отображаться, когда устройство обнаруживает изображения.

public class ImageTest : MonoBehaviour
{
ARTrackedImageManager ImgTrackedmanager;
public  GameObject[] Showprefabs;
List<GameObject> listobjects = new List<GameObject>();
int visiblity = 0;

private void Awake()
{
    ImgTrackedmanager = GetComponent<ARTrackedImageManager>();
}

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
    if(visiblity==1)
    {
        Showprefabs[0].SetActive(true);
        Showprefabs[1].SetActive(false);

    }
    if(visiblity==2)
    {
        ImgTrackedmanager.trackedImagePrefab = null;
        Showprefabs[0].SetActive(false);
        Showprefabs[1].SetActive(true);

    }

}


private void OnEnable()
{
    ImgTrackedmanager.trackedImagesChanged += OnTrackedImagesChanged;
}


void OnDisable()
{
    ImgTrackedmanager.trackedImagesChanged -= OnTrackedImagesChanged;
}



void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
{
    foreach (var trackedImage in eventArgs.added)
    {
        // Give the initial image a reasonable default scale
        //trackedImage.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);

       // Debug.Log("Image Name is .."+trackedImage.gameObject.name);
        Debug.Log("Tracked Name is .." + trackedImage.referenceImage.name);


        if(trackedImage.referenceImage.name == "imagetargets_1")
        {
            if(ImgTrackedmanager.trackedImagePrefab == null)
            {
                GameObject obj1 = Instantiate(Showprefabs[0], trackedImage.transform);
                listobjects.Add(obj1);
                ImgTrackedmanager.trackedImagePrefab = obj1;
                visiblity = 1;

                Debug.Log("Prefab1");

            }



        }
        if(trackedImage.referenceImage.name == "imagetargets_2")
        {

            Destroy(listobjects[0]);

                GameObject obj2 = Instantiate(Showprefabs[1], trackedImage.transform);
                ImgTrackedmanager.trackedImagePrefab = obj2;
                Debug.Log("Prefab2");
                visiblity = 2;


        }

    }
}

}

Здесь, когда он обнаруживает первое изображение, операторы отладки в xcode показывают «Prefab1», а для второго изображения он показывает «Prefab2». Проблема заключается в том, что, когда устройство отображается на втором изображении, первый префаб создается снова.Не понимаю, почему создается первый префаб, добавленный в.

ImgTrackingArfoundation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...