MultiImageSpawner.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using UnityEngine;
  2. using UnityEngine.XR.ARFoundation;
  3. using UnityEngine.XR.ARSubsystems;
  4. using System.Collections.Generic;
  5. public class MultiImageSpawner : MonoBehaviour
  6. {
  7. public GameObject[] prefabsToSpawn;
  8. public Vector3[] spawnOffsets = {
  9. new Vector3(-0.15f, 0.05f, 0f),
  10. new Vector3( 0.15f, 0.05f, 0f)
  11. };
  12. public Quaternion[] spawnRotation = {
  13. Quaternion.identity,
  14. Quaternion.identity
  15. };
  16. private ARTrackedImageManager manager;
  17. private List<GameObject> spawnedObjects = new List<GameObject>();
  18. private Transform imageTransform;
  19. void Awake() { manager = GetComponent<ARTrackedImageManager>(); }
  20. void OnEnable() { manager.trackedImagesChanged += OnImageChanged; }
  21. void OnDisable() { manager.trackedImagesChanged -= OnImageChanged; }
  22. void Update()
  23. {
  24. if (imageTransform == null) return;
  25. for (int i = 0; i < spawnedObjects.Count; i++)
  26. if (spawnedObjects[i] != null)
  27. {
  28. spawnedObjects[i].transform.position =
  29. imageTransform.TransformPoint(spawnOffsets[i]);
  30. spawnedObjects[i].transform.rotation = spawnRotation[i];
  31. }
  32. }
  33. void OnImageChanged(ARTrackedImagesChangedEventArgs args)
  34. {
  35. foreach (var image in args.added)
  36. {
  37. imageTransform = image.transform;
  38. if (spawnedObjects.Count == 0)
  39. for (int i = 0; i < prefabsToSpawn.Length; i++)
  40. {
  41. Vector3 pos = image.transform.TransformPoint(spawnOffsets[i]);
  42. GameObject obj = Instantiate(prefabsToSpawn[i], pos, spawnRotation[i]);
  43. //obj.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
  44. spawnedObjects.Add(obj);
  45. }
  46. }
  47. foreach (var image in args.updated) { imageTransform = image.transform; }
  48. }
  49. }