NavMeshSurfaceLinkTests.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #if UNITY_EDITOR || UNITY_STANDALONE
  2. using System.Collections;
  3. using NUnit.Framework;
  4. using UnityEngine;
  5. using UnityEngine.AI;
  6. using UnityEngine.TestTools;
  7. namespace Unity.AI.Navigation.Tests
  8. {
  9. [TestFixture]
  10. class NavMeshSurfaceLinkTests
  11. {
  12. GameObject plane1, plane2;
  13. NavMeshLink link;
  14. NavMeshSurface surface;
  15. [SetUp]
  16. public void CreatesPlanesAndLink()
  17. {
  18. plane1 = GameObject.CreatePrimitive(PrimitiveType.Plane);
  19. plane2 = GameObject.CreatePrimitive(PrimitiveType.Plane);
  20. plane1.transform.position = 11.0f * Vector3.right;
  21. surface = new GameObject().AddComponent<NavMeshSurface>();
  22. surface.BuildNavMesh();
  23. Assert.IsFalse(HasPathConnecting(plane1, plane2));
  24. Assert.IsFalse(HasPathConnecting(plane2, plane1));
  25. link = new GameObject().AddComponent<NavMeshLink>();
  26. link.startPoint = plane1.transform.position;
  27. link.endPoint = plane2.transform.position;
  28. Assert.IsTrue(HasPathConnecting(plane1, plane2));
  29. Assert.IsTrue(HasPathConnecting(plane2, plane1));
  30. }
  31. [TearDown]
  32. public void DestroyPlanesAndLink()
  33. {
  34. Object.DestroyImmediate(surface.gameObject);
  35. Object.DestroyImmediate(link.gameObject);
  36. Object.DestroyImmediate(plane1);
  37. Object.DestroyImmediate(plane2);
  38. }
  39. [Test]
  40. public void NavMeshLinkCanConnectTwoSurfaces()
  41. {
  42. Assert.IsTrue(HasPathConnecting(plane1, plane2));
  43. }
  44. [Test]
  45. public void DisablingBidirectionalMakesTheLinkOneWay()
  46. {
  47. link.bidirectional = false;
  48. Assert.IsTrue(HasPathConnecting(plane1, plane2));
  49. Assert.IsFalse(HasPathConnecting(plane2, plane1));
  50. }
  51. [Test]
  52. public void ChangingAreaTypeCanBlockPath()
  53. {
  54. var areaMask = ~(1 << 4);
  55. Assert.IsTrue(HasPathConnecting(plane1, plane2, areaMask));
  56. link.area = 4;
  57. Assert.IsFalse(HasPathConnecting(plane1, plane2, areaMask));
  58. }
  59. [Test]
  60. public void EndpointsMoveRelativeToLinkOnUpdate()
  61. {
  62. link.transform.position += Vector3.forward;
  63. Assert.IsFalse(HasPathConnectingViaPoint(plane1, plane2, plane1.transform.position + Vector3.forward));
  64. Assert.IsFalse(HasPathConnectingViaPoint(plane1, plane2, plane2.transform.position + Vector3.forward));
  65. link.UpdateLink();
  66. Assert.IsTrue(HasPathConnectingViaPoint(plane1, plane2, plane1.transform.position + Vector3.forward));
  67. Assert.IsTrue(HasPathConnectingViaPoint(plane1, plane2, plane2.transform.position + Vector3.forward));
  68. }
  69. [UnityTest]
  70. public IEnumerator EndpointsMoveRelativeToLinkNextFrameWhenAutoUpdating()
  71. {
  72. link.transform.position += Vector3.forward;
  73. link.autoUpdate = true;
  74. Assert.IsFalse(HasPathConnectingViaPoint(plane1, plane2, plane1.transform.position + Vector3.forward));
  75. Assert.IsFalse(HasPathConnectingViaPoint(plane1, plane2, plane2.transform.position + Vector3.forward));
  76. yield return null;
  77. Assert.IsTrue(HasPathConnectingViaPoint(plane1, plane2, plane1.transform.position + Vector3.forward));
  78. Assert.IsTrue(HasPathConnectingViaPoint(plane1, plane2, plane2.transform.position + Vector3.forward));
  79. }
  80. [Test]
  81. public void ChangingCostModifierAffectsRoute()
  82. {
  83. var link1 = link;
  84. link1.startPoint = plane1.transform.position;
  85. link1.endPoint = plane2.transform.position + Vector3.forward;
  86. var link2 = link.gameObject.AddComponent<NavMeshLink>();
  87. link2.startPoint = plane1.transform.position;
  88. link2.endPoint = plane2.transform.position - Vector3.forward;
  89. link1.costModifier = -1;
  90. link2.costModifier = 100;
  91. Assert.IsTrue(HasPathConnectingViaPoint(plane1, plane2, link1.endPoint));
  92. Assert.IsFalse(HasPathConnectingViaPoint(plane1, plane2, link2.endPoint));
  93. link1.costModifier = 100;
  94. link2.costModifier = -1;
  95. Assert.IsFalse(HasPathConnectingViaPoint(plane1, plane2, link1.endPoint));
  96. Assert.IsTrue(HasPathConnectingViaPoint(plane1, plane2, link2.endPoint));
  97. }
  98. static bool HasPathConnecting(GameObject a, GameObject b, int areaMask = NavMesh.AllAreas, int agentTypeID = 0)
  99. {
  100. var path = new NavMeshPath();
  101. var filter = new NavMeshQueryFilter();
  102. filter.areaMask = areaMask;
  103. filter.agentTypeID = agentTypeID;
  104. NavMesh.CalculatePath(a.transform.position, b.transform.position, filter, path);
  105. return path.status == NavMeshPathStatus.PathComplete;
  106. }
  107. static bool HasPathConnectingViaPoint(GameObject a, GameObject b, Vector3 point, int areaMask = NavMesh.AllAreas, int agentTypeID = 0)
  108. {
  109. var path = new NavMeshPath();
  110. var filter = new NavMeshQueryFilter();
  111. filter.areaMask = areaMask;
  112. filter.agentTypeID = agentTypeID;
  113. NavMesh.CalculatePath(a.transform.position, b.transform.position, filter, path);
  114. if (path.status != NavMeshPathStatus.PathComplete)
  115. return false;
  116. for (int i = 0; i < path.corners.Length; ++i)
  117. if (Vector3.Distance(path.corners[i], point) < 0.1f)
  118. return true;
  119. return false;
  120. }
  121. }
  122. }
  123. #endif