Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

NavMeshSurfaceTests.cs 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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 NavMeshSurfaceTests
  11. {
  12. GameObject plane;
  13. NavMeshSurface surface;
  14. [SetUp]
  15. public void CreatePlaneWithSurface()
  16. {
  17. plane = GameObject.CreatePrimitive(PrimitiveType.Plane);
  18. surface = new GameObject().AddComponent<NavMeshSurface>();
  19. Assert.IsFalse(HasNavMeshAtOrigin());
  20. }
  21. [TearDown]
  22. public void DestroyPlaneWithSurface()
  23. {
  24. GameObject.DestroyImmediate(plane);
  25. GameObject.DestroyImmediate(surface.gameObject);
  26. Assert.IsFalse(HasNavMeshAtOrigin());
  27. }
  28. [Test]
  29. public void NavMeshIsAvailableAfterBuild()
  30. {
  31. surface.BuildNavMesh();
  32. Assert.IsTrue(HasNavMeshAtOrigin());
  33. }
  34. [Test]
  35. public void NavMeshCanBeRemovedAndAdded()
  36. {
  37. surface.BuildNavMesh();
  38. Assert.IsTrue(HasNavMeshAtOrigin());
  39. surface.RemoveData();
  40. Assert.IsFalse(HasNavMeshAtOrigin());
  41. surface.AddData();
  42. Assert.IsTrue(HasNavMeshAtOrigin());
  43. }
  44. [Test]
  45. public void NavMeshIsNotAvailableWhenDisabled()
  46. {
  47. surface.BuildNavMesh();
  48. surface.enabled = false;
  49. Assert.IsFalse(HasNavMeshAtOrigin());
  50. surface.enabled = true;
  51. Assert.IsTrue(HasNavMeshAtOrigin());
  52. }
  53. [Test]
  54. public void CanBuildWithCustomArea()
  55. {
  56. surface.defaultArea = 4;
  57. var expectedAreaMask = 1 << 4;
  58. surface.BuildNavMesh();
  59. Assert.IsTrue(HasNavMeshAtOrigin(expectedAreaMask));
  60. }
  61. [Test]
  62. public void CanBuildWithCustomAgentTypeID()
  63. {
  64. surface.agentTypeID = 1234;
  65. surface.BuildNavMesh();
  66. Assert.IsTrue(HasNavMeshAtOrigin(NavMesh.AllAreas, 1234));
  67. }
  68. [Test]
  69. public void CanBuildCollidersAndIgnoreRenderMeshes()
  70. {
  71. plane.GetComponent<MeshRenderer>().enabled = false;
  72. surface.useGeometry = NavMeshCollectGeometry.PhysicsColliders;
  73. surface.BuildNavMesh();
  74. Assert.IsTrue(HasNavMeshAtOrigin());
  75. surface.useGeometry = NavMeshCollectGeometry.RenderMeshes;
  76. surface.BuildNavMesh();
  77. Assert.IsFalse(HasNavMeshAtOrigin());
  78. }
  79. [Test]
  80. public void CanBuildRenderMeshesAndIgnoreColliders()
  81. {
  82. #if NMC_CAN_ACCESS_PHYSICS
  83. plane.GetComponent<Collider>().enabled = false;
  84. #else
  85. Assert.Inconclusive("This test requires the com.unity.modules.physics package in order to run. Make sure to reference it in the project.");
  86. #endif
  87. surface.useGeometry = NavMeshCollectGeometry.PhysicsColliders;
  88. surface.BuildNavMesh();
  89. Assert.IsFalse(HasNavMeshAtOrigin());
  90. surface.useGeometry = NavMeshCollectGeometry.RenderMeshes;
  91. surface.BuildNavMesh();
  92. Assert.IsTrue(HasNavMeshAtOrigin());
  93. }
  94. [Test]
  95. public void BuildIgnoresGeometryOutsideBounds()
  96. {
  97. surface.collectObjects = CollectObjects.Volume;
  98. surface.center = new Vector3(20, 0, 0);
  99. surface.size = new Vector3(10, 10, 10);
  100. surface.BuildNavMesh();
  101. Assert.IsFalse(HasNavMeshAtOrigin());
  102. }
  103. [Test]
  104. public void BuildIgnoresGeometrySiblings()
  105. {
  106. surface.collectObjects = CollectObjects.Children;
  107. surface.BuildNavMesh();
  108. Assert.IsFalse(HasNavMeshAtOrigin());
  109. }
  110. [Test]
  111. public void BuildDoesntCullAreaBiggerThanMinRegionArea()
  112. {
  113. // Move plane away from NavMesh tile's boundaries
  114. plane.transform.localScale = new Vector3(0.25f, 0, 0.25f);
  115. plane.transform.position = new Vector3(2.5f, 0, 7.5f);
  116. surface.minRegionArea = 1f;
  117. surface.BuildNavMesh();
  118. Assert.IsTrue(HasNavMeshAtPosition(plane.transform.position));
  119. }
  120. [Test]
  121. public void BuildCullsAreaSmallerThanMinRegionArea()
  122. {
  123. // Move plane away from NavMesh tile's boundaries
  124. plane.transform.localScale = new Vector3(0.25f, 0, 0.25f);
  125. plane.transform.position = new Vector3(2.5f, 0, 7.5f);
  126. surface.minRegionArea = 5;
  127. surface.BuildNavMesh();
  128. Assert.IsFalse(HasNavMeshAtPosition(plane.transform.position));
  129. }
  130. [Test]
  131. public void BuildUsesOnlyIncludedLayers()
  132. {
  133. plane.layer = 4;
  134. surface.layerMask = ~(1 << 4);
  135. surface.BuildNavMesh();
  136. Assert.IsFalse(HasNavMeshAtOrigin());
  137. }
  138. [Test]
  139. public void DefaultSettingsMatchBuiltinSettings()
  140. {
  141. var bs = surface.GetBuildSettings();
  142. Assert.AreEqual(NavMesh.GetSettingsByIndex(0), bs);
  143. }
  144. [Test]
  145. public void ActiveSurfacesContainsOnlyActiveAndEnabledSurface()
  146. {
  147. Assert.IsTrue(NavMeshSurface.activeSurfaces.Contains(surface));
  148. Assert.AreEqual(1, NavMeshSurface.activeSurfaces.Count);
  149. surface.enabled = false;
  150. Assert.IsFalse(NavMeshSurface.activeSurfaces.Contains(surface));
  151. Assert.AreEqual(0, NavMeshSurface.activeSurfaces.Count);
  152. surface.enabled = true;
  153. surface.gameObject.SetActive(false);
  154. Assert.IsFalse(NavMeshSurface.activeSurfaces.Contains(surface));
  155. Assert.AreEqual(0, NavMeshSurface.activeSurfaces.Count);
  156. }
  157. [UnityTest]
  158. public IEnumerator NavMeshMovesToSurfacePositionNextFrame()
  159. {
  160. plane.transform.position = new Vector3(100, 0, 0);
  161. surface.transform.position = new Vector3(100, 0, 0);
  162. surface.BuildNavMesh();
  163. Assert.IsFalse(HasNavMeshAtOrigin());
  164. surface.transform.position = Vector3.zero;
  165. Assert.IsFalse(HasNavMeshAtOrigin());
  166. yield return null;
  167. Assert.IsTrue(HasNavMeshAtOrigin());
  168. }
  169. [UnityTest]
  170. public IEnumerator UpdatingAndAddingNavMesh()
  171. {
  172. var navmeshData = new NavMeshData();
  173. var oper = surface.UpdateNavMesh(navmeshData);
  174. Assert.IsFalse(HasNavMeshAtOrigin());
  175. do
  176. {
  177. yield return null;
  178. } while (!oper.isDone);
  179. surface.RemoveData();
  180. surface.navMeshData = navmeshData;
  181. surface.AddData();
  182. Assert.IsTrue(HasNavMeshAtOrigin());
  183. }
  184. [Test]
  185. public void BuildTakesIntoAccountAdjacentWalkableSurfacesOutsideBounds()
  186. {
  187. surface.collectObjects = CollectObjects.Volume;
  188. surface.center = new Vector3(0, 0, 0);
  189. surface.size = new Vector3(10, 10, 10);
  190. var adjacentPlane = GameObject.CreatePrimitive(PrimitiveType.Plane);
  191. adjacentPlane.transform.position = new Vector3(10f, 0, 0);
  192. surface.BuildNavMesh();
  193. try
  194. {
  195. Assert.IsTrue(HasNavMeshAtPosition(new Vector3(surface.size.x / 2f, 0, 0)),
  196. "A NavMesh should exists at the desired position.");
  197. }
  198. finally
  199. {
  200. Object.DestroyImmediate(adjacentPlane);
  201. }
  202. }
  203. static bool HasNavMeshAtPosition(Vector3 position, int areaMask = NavMesh.AllAreas, int agentTypeID = 0)
  204. {
  205. var filter = new NavMeshQueryFilter {areaMask = areaMask, agentTypeID = agentTypeID};
  206. return NavMesh.SamplePosition(position, out _, 0.1f, filter);
  207. }
  208. public static bool HasNavMeshAtOrigin(int areaMask = NavMesh.AllAreas, int agentTypeID = 0)
  209. {
  210. return HasNavMeshAtPosition(Vector3.zero, areaMask, agentTypeID);
  211. }
  212. }
  213. }
  214. #endif