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.

117 lines
3.7 KiB

5 years ago
  1. //========= Copyright 2016-2020, HTC Corporation. All rights reserved. ===========
  2. using HTC.UnityPlugin.Pointer3D;
  3. using UnityEngine;
  4. public class GuideLineDrawer : MonoBehaviour
  5. {
  6. public const float MIN_SEGMENT_LENGTH = 0.01f;
  7. public Vector3 gravityDirection = Vector3.down;
  8. public bool showOnHitOnly;
  9. public float segmentLength = 0.05f;
  10. public Pointer3DRaycaster raycaster;
  11. public LineRenderer lineRenderer;
  12. #if UNITY_EDITOR
  13. protected virtual void Reset()
  14. {
  15. for (var tr = transform; raycaster == null && tr != null; tr = tr.parent)
  16. {
  17. raycaster = tr.GetComponentInChildren<Pointer3DRaycaster>();
  18. }
  19. if (lineRenderer == null) { lineRenderer = GetComponentInChildren<LineRenderer>(); }
  20. if (lineRenderer == null && raycaster != null) { lineRenderer = gameObject.AddComponent<LineRenderer>(); }
  21. if (lineRenderer != null)
  22. {
  23. #if UNITY_5_5_OR_NEWER
  24. lineRenderer.startWidth = 0.01f;
  25. lineRenderer.endWidth = 0f;
  26. #else
  27. lineRenderer.SetWidth(0.01f, 0f);
  28. #endif
  29. }
  30. }
  31. #endif
  32. protected virtual void LateUpdate()
  33. {
  34. var result = raycaster.FirstRaycastResult();
  35. if (showOnHitOnly && !result.isValid)
  36. {
  37. lineRenderer.enabled = false;
  38. return;
  39. }
  40. var points = raycaster.BreakPoints;
  41. var pointCount = points.Count;
  42. if (pointCount < 2)
  43. {
  44. return;
  45. }
  46. lineRenderer.enabled = true;
  47. lineRenderer.useWorldSpace = false;
  48. var startPoint = points[0];
  49. var endPoint = points[pointCount - 1];
  50. if (pointCount == 2)
  51. {
  52. #if UNITY_5_6_OR_NEWER
  53. lineRenderer.positionCount = 2;
  54. #elif UNITY_5_5_OR_NEWER
  55. lineRenderer.numPositions = 2;
  56. #else
  57. lineRenderer.SetVertexCount(2);
  58. #endif
  59. lineRenderer.SetPosition(0, transform.InverseTransformPoint(startPoint));
  60. lineRenderer.SetPosition(1, transform.InverseTransformPoint(endPoint));
  61. }
  62. else
  63. {
  64. var systemY = gravityDirection;
  65. var systemX = endPoint - startPoint;
  66. var systemZ = default(Vector3);
  67. Vector3.OrthoNormalize(ref systemY, ref systemX, ref systemZ);
  68. var initialV = Vector3.ProjectOnPlane(points[1] - points[0], systemZ); // initial projectile direction
  69. var initialVx = Vector3.Dot(initialV, systemX);
  70. var initialVy = Vector3.Dot(initialV, systemY);
  71. var initSlope = initialVy / initialVx;
  72. var approachV = endPoint - startPoint;
  73. var approachVx = Vector3.Dot(approachV, systemX);
  74. var approachVy = Vector3.Dot(approachV, systemY);
  75. var lenx = Mathf.Max(segmentLength, MIN_SEGMENT_LENGTH);
  76. var segments = Mathf.Max(Mathf.CeilToInt(approachVx / lenx), 0);
  77. var factor = (approachVy - initSlope * approachVx) / (approachVx * approachVx);
  78. #if UNITY_5_6_OR_NEWER
  79. lineRenderer.positionCount = segments + 1;
  80. #elif UNITY_5_5_OR_NEWER
  81. lineRenderer.numPositions = segments + 1;
  82. #else
  83. lineRenderer.SetVertexCount(segments + 1);
  84. #endif
  85. lineRenderer.SetPosition(0, transform.InverseTransformPoint(startPoint));
  86. for (int i = 1, imax = segments; i < imax; ++i)
  87. {
  88. var x = i * lenx;
  89. var y = factor * x * x + initSlope * x;
  90. lineRenderer.SetPosition(i, transform.InverseTransformPoint(systemX * x + systemY * y + startPoint));
  91. }
  92. lineRenderer.SetPosition(segments, transform.InverseTransformPoint(endPoint));
  93. }
  94. }
  95. protected virtual void OnDisable()
  96. {
  97. lineRenderer.enabled = false;
  98. }
  99. }