2021년 4학년 1학기 기업연계프로젝트2 컴퓨터소프트웨어공학과 <원광투어팀> 팀장 : 송유진 팀원 : 김나영, 이경희, 한유진
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.

95 lines
3.7 KiB

5 years ago
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.EventSystems;
  4. using UnityEngine.UI;
  5. [RequireComponent(typeof(Image))]
  6. public class DragImage : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  7. {
  8. public bool dragOnSurfaces = true;
  9. private Dictionary<int, GameObject> m_DraggingIcons = new Dictionary<int, GameObject>();
  10. private Dictionary<int, RectTransform> m_DraggingPlanes = new Dictionary<int, RectTransform>();
  11. public void OnBeginDrag(PointerEventData eventData)
  12. {
  13. var canvas = transform.parent == null ? null : transform.parent.GetComponentInParent<Canvas>();
  14. if (canvas == null) { return; }
  15. // We have clicked something that can be dragged.
  16. // What we want to do is create an icon for this.
  17. var draggingIcon = new GameObject("icon");
  18. m_DraggingIcons[eventData.pointerId] = draggingIcon;
  19. draggingIcon.transform.SetParent(canvas.transform, false);
  20. draggingIcon.transform.SetAsLastSibling();
  21. var draggingImage = draggingIcon.AddComponent<Image>();
  22. // The icon will be under the cursor.
  23. // We want it to be ignored by the event system.
  24. var draggingGroup = draggingIcon.AddComponent<CanvasGroup>();
  25. draggingGroup.blocksRaycasts = false;
  26. draggingImage.sprite = GetComponent<Image>().sprite;
  27. var rectTransform = GetComponent<RectTransform>();
  28. draggingImage.SetNativeSize();
  29. draggingImage.rectTransform.sizeDelta = rectTransform.rect.size;
  30. m_DraggingPlanes[eventData.pointerId] = canvas.GetComponent<RectTransform>();
  31. SetDraggedPosition(eventData);
  32. }
  33. public void OnDrag(PointerEventData eventData)
  34. {
  35. if (m_DraggingIcons.ContainsKey(eventData.pointerId))
  36. {
  37. SetDraggedPosition(eventData);
  38. }
  39. }
  40. private void SetDraggedPosition(PointerEventData eventData)
  41. {
  42. GameObject draggingIcon;
  43. if (!m_DraggingIcons.TryGetValue(eventData.pointerId, out draggingIcon)) { return; }
  44. var rectTransform = draggingIcon.GetComponent<RectTransform>();
  45. var raycastResult = eventData.pointerCurrentRaycast;
  46. if (dragOnSurfaces && raycastResult.isValid && raycastResult.worldNormal.sqrMagnitude >= 0.0000001f)
  47. {
  48. // When raycast hit something, place the dragged image at the hit position
  49. // Notice that if raycast performed by GraphicRaycaster module, worldNormal is not assigned (see GraphicRaycaster for more detail)
  50. rectTransform.position = raycastResult.worldPosition + raycastResult.worldNormal * 0.01f; // add a little distance to avoid z-fighting
  51. rectTransform.rotation = Quaternion.LookRotation(raycastResult.worldNormal, raycastResult.gameObject.transform.up);
  52. }
  53. else
  54. {
  55. RectTransform plane;
  56. if (dragOnSurfaces && eventData.pointerEnter != null && eventData.pointerEnter.transform is RectTransform)
  57. {
  58. plane = eventData.pointerEnter.transform as RectTransform;
  59. }
  60. else
  61. {
  62. plane = m_DraggingPlanes[eventData.pointerId];
  63. }
  64. Vector3 globalMousePos;
  65. if (RectTransformUtility.ScreenPointToWorldPointInRectangle(plane, eventData.position, eventData.pressEventCamera, out globalMousePos))
  66. {
  67. rectTransform.position = globalMousePos;
  68. rectTransform.rotation = plane.rotation;
  69. }
  70. }
  71. }
  72. public void OnEndDrag(PointerEventData eventData)
  73. {
  74. if (m_DraggingIcons[eventData.pointerId] != null)
  75. {
  76. Destroy(m_DraggingIcons[eventData.pointerId]);
  77. }
  78. m_DraggingIcons[eventData.pointerId] = null;
  79. }
  80. }