Draw.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using UnityEngine;
  2. namespace Pathfinding.Util {
  3. /// <summary>Helper methods for drawing gizmos and debug lines</summary>
  4. public class Draw {
  5. public static readonly Draw Debug = new Draw { gizmos = false };
  6. public static readonly Draw Gizmos = new Draw { gizmos = true };
  7. bool gizmos;
  8. Matrix4x4 matrix = Matrix4x4.identity;
  9. void SetColor (Color color) {
  10. if (gizmos && UnityEngine.Gizmos.color != color) UnityEngine.Gizmos.color = color;
  11. }
  12. public void Polyline (System.Collections.Generic.List<Vector3> points, Color color, bool cycle = false) {
  13. for (int i = 0; i < points.Count - 1; i++) {
  14. Line(points[i], points[i+1], color);
  15. }
  16. if (cycle && points.Count > 1) Line(points[points.Count - 1], points[0], color);
  17. }
  18. public void Line (Vector3 a, Vector3 b, Color color) {
  19. SetColor(color);
  20. if (gizmos) UnityEngine.Gizmos.DrawLine(matrix.MultiplyPoint3x4(a), matrix.MultiplyPoint3x4(b));
  21. else UnityEngine.Debug.DrawLine(matrix.MultiplyPoint3x4(a), matrix.MultiplyPoint3x4(b), color);
  22. }
  23. public void CircleXZ (Vector3 center, float radius, Color color, float startAngle = 0f, float endAngle = 2*Mathf.PI) {
  24. int steps = 40;
  25. #if UNITY_EDITOR
  26. if (gizmos) steps = (int)Mathf.Clamp(Mathf.Sqrt(radius / UnityEditor.HandleUtility.GetHandleSize((UnityEngine.Gizmos.matrix * matrix).MultiplyPoint3x4(center))) * 25, 4, 40);
  27. #endif
  28. while (startAngle > endAngle) startAngle -= 2*Mathf.PI;
  29. Vector3 prev = new Vector3(Mathf.Cos(startAngle)*radius, 0, Mathf.Sin(startAngle)*radius);
  30. for (int i = 0; i <= steps; i++) {
  31. Vector3 c = new Vector3(Mathf.Cos(Mathf.Lerp(startAngle, endAngle, i/(float)steps))*radius, 0, Mathf.Sin(Mathf.Lerp(startAngle, endAngle, i/(float)steps))*radius);
  32. Line(center + prev, center + c, color);
  33. prev = c;
  34. }
  35. }
  36. public void Cylinder (Vector3 position, Vector3 up, float height, float radius, Color color) {
  37. var tangent = Vector3.Cross(up, Vector3.one).normalized;
  38. matrix = Matrix4x4.TRS(position, Quaternion.LookRotation(tangent, up), new Vector3(radius, height, radius));
  39. CircleXZ(Vector3.zero, 1, color);
  40. if (height > 0) {
  41. CircleXZ(Vector3.up, 1, color);
  42. Line(new Vector3(1, 0, 0), new Vector3(1, 1, 0), color);
  43. Line(new Vector3(-1, 0, 0), new Vector3(-1, 1, 0), color);
  44. Line(new Vector3(0, 0, 1), new Vector3(0, 1, 1), color);
  45. Line(new Vector3(0, 0, -1), new Vector3(0, 1, -1), color);
  46. }
  47. matrix = Matrix4x4.identity;
  48. }
  49. public void CrossXZ (Vector3 position, Color color, float size = 1) {
  50. size *= 0.5f;
  51. Line(position - Vector3.right*size, position + Vector3.right*size, color);
  52. Line(position - Vector3.forward*size, position + Vector3.forward*size, color);
  53. }
  54. public void Bezier (Vector3 a, Vector3 b, Color color) {
  55. Vector3 dir = b - a;
  56. if (dir == Vector3.zero) return;
  57. Vector3 normal = Vector3.Cross(Vector3.up, dir);
  58. Vector3 normalUp = Vector3.Cross(dir, normal);
  59. normalUp = normalUp.normalized;
  60. normalUp *= dir.magnitude*0.1f;
  61. Vector3 p1c = a + normalUp;
  62. Vector3 p2c = b + normalUp;
  63. Vector3 prev = a;
  64. for (int i = 1; i <= 20; i++) {
  65. float t = i/20.0f;
  66. Vector3 p = AstarSplines.CubicBezier(a, p1c, p2c, b, t);
  67. Line(prev, p, color);
  68. prev = p;
  69. }
  70. }
  71. }
  72. }