# 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](https://www.youtube.com/watch?v=I9j3MD7gS5Y)