Try   HackMD

AR Foundation Image Trtacking - Multiple Objects

tags: Unity Software

完整C#程式

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
using UnityEngine.XR.ARFoundation;

[RequireComponent(typeof(ARTrackedImageManager))]
public class ImageRecognition : MonoBehaviour
{
    [SerializeField]
    private GameObject[] placeablePrefabs;

private Dictionary<string, GameObject> spawnedPrefabs = new Dictionary<string, GameObject>();
private ARTrackedImageManager _arTrackedManarger;

private void Awake()
{
    _arTrackedManarger = FindObjectOfType<ARTrackedImageManager>();

    foreach (GameObject prefab in placeablePrefabs)
    {
        GameObject newPrefab = Instantiate(prefab, Vector3.zero, Quaternion.identity);
        newPrefab.name = prefab.name;
        spawnedPrefabs.Add(prefab.name, newPrefab);
    }
}



private void OnEnable()
{
    _arTrackedManarger.trackedImagesChanged += OnImageChanged;
}

private void OnDisable()
{
    _arTrackedManarger.trackedImagesChanged -= OnImageChanged;
}

private void OnImageChanged(ARTrackedImagesChangedEventArgs args)
{
    foreach (ARTrackedImage trackedImage in args.added)
    {
        UpdateImage(trackedImage);
    }
    foreach (ARTrackedImage trackedImage in args.updated)
    {
        UpdateImage(trackedImage);
    }
    foreach (ARTrackedImage trackedImage in args.removed)
    {
        spawnedPrefabs[trackedImage.name].SetActive(false);
    }
}

private void UpdateImage(ARTrackedImage trackedImage)
{
    string name = trackedImage.referenceImage.name;
    Vector3 position = trackedImage.transform.position;

    GameObject prefab = spawnedPrefabs[name];
    prefab.transform.position = position;
    prefab.SetActive(true);

    foreach (GameObject go in spawnedPrefabs.Values)
    {
        if(go.name != name)
        {
            go.SetActive(false);
        }
    }
}

}

Reference

AR Foundation Improved Image Tracking - Multiple Objects/Images - Unity Augmented Reality/AR