SW 중심대학 OSS GIT 서버 박건태, 이승준, 고기완, 이준호 새로운 배포
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
3.8 KiB

4 years ago
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using UnityEngine.XR.ARFoundation;
  5. [RequireComponent(typeof(ARRaycastManager))]
  6. public class PlacementWithMultipleDraggingDroppingController : MonoBehaviour
  7. {
  8. [SerializeField]
  9. private GameObject placedPrefab;
  10. [SerializeField]
  11. private GameObject welcomePanel;
  12. [SerializeField]
  13. private Button dismissButton;
  14. [SerializeField]
  15. private Camera arCamera;
  16. private PlacementObject[] placedObjects;
  17. private Vector2 touchPosition = default;
  18. private ARRaycastManager arRaycastManager;
  19. private bool onTouchHold = false;
  20. private static List<ARRaycastHit> hits = new List<ARRaycastHit>();
  21. private PlacementObject lastSelectedObject;
  22. [SerializeField]
  23. private Button redButton, greenButton, blueButton;
  24. private GameObject PlacedPrefab
  25. {
  26. get
  27. {
  28. return placedPrefab;
  29. }
  30. set
  31. {
  32. placedPrefab = value;
  33. }
  34. }
  35. void Awake()
  36. {
  37. arRaycastManager = GetComponent<ARRaycastManager>();
  38. dismissButton.onClick.AddListener(Dismiss);
  39. if (redButton != null && greenButton != null && blueButton != null)
  40. {
  41. redButton.onClick.AddListener(() => ChangePrefabSelection("ARRed"));
  42. greenButton.onClick.AddListener(() => ChangePrefabSelection("ARGreen"));
  43. blueButton.onClick.AddListener(() => ChangePrefabSelection("ARBlue"));
  44. }
  45. }
  46. private void ChangePrefabSelection(string name)
  47. {
  48. GameObject loadedGameObject = Resources.Load<GameObject>($"Prefabs/{name}");
  49. if (loadedGameObject != null)
  50. {
  51. PlacedPrefab = loadedGameObject;
  52. Debug.Log($"Game object with name {name} was loaded");
  53. }
  54. else
  55. {
  56. Debug.Log($"Unable to find a game object with name {name}");
  57. }
  58. }
  59. private void Dismiss() => welcomePanel.SetActive(false);
  60. void Update()
  61. {
  62. // do not capture events unless the welcome panel is hidden
  63. if (welcomePanel.activeSelf)
  64. return;
  65. if (Input.touchCount > 0)
  66. {
  67. Touch touch = Input.GetTouch(0);
  68. touchPosition = touch.position;
  69. if (touch.phase == TouchPhase.Began)
  70. {
  71. Ray ray = arCamera.ScreenPointToRay(touch.position);
  72. RaycastHit hitObject;
  73. if (Physics.Raycast(ray, out hitObject))
  74. {
  75. lastSelectedObject = hitObject.transform.GetComponent<PlacementObject>();
  76. if (lastSelectedObject != null)
  77. {
  78. PlacementObject[] allOtherObjects = FindObjectsOfType<PlacementObject>();
  79. foreach (PlacementObject placementObject in allOtherObjects)
  80. {
  81. placementObject.Selected = placementObject == lastSelectedObject;
  82. }
  83. }
  84. }
  85. }
  86. if (touch.phase == TouchPhase.Ended)
  87. {
  88. lastSelectedObject.Selected = false;
  89. }
  90. }
  91. if (arRaycastManager.Raycast(touchPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
  92. {
  93. Pose hitPose = hits[0].pose;
  94. if (lastSelectedObject == null)
  95. {
  96. lastSelectedObject = Instantiate(placedPrefab, hitPose.position, hitPose.rotation).GetComponent<PlacementObject>();
  97. }
  98. else
  99. {
  100. if (lastSelectedObject.Selected)
  101. {
  102. lastSelectedObject.transform.position = hitPose.position;
  103. lastSelectedObject.transform.rotation = hitPose.rotation;
  104. }
  105. }
  106. }
  107. }
  108. }