public NavigationService(TilemapNavData navData) { NavRegionGenerationFunctions.InitialiseNavRegionsFromData(navData); _navigationTable = navData.NavigationTable; _navigationTable.Initialise(); }
public void InitialiseNavRegionsFromData_LoadsExpectedNeighbourRefsForRawData() { var nodes = new List <NavNode> { new NavNode { Neighbours = new[] { 1, 2 } }, new NavNode { Neighbours = new[] { 0, 2 } }, new NavNode { Neighbours = new[] { 0, 1 } } }; var nodeListingNeighbours = new List <NavNode> { new NavNode { Neighbours = new[] { 0, 2 } } }; var regions = new List <NavRegion> { new NavRegion(nodeListingNeighbours.ToArray()) }; var data = ScriptableObject.CreateInstance <TilemapNavData>(); data.NodeData = nodes; data.NavigationTable = new NavTable(regions); NavRegionGenerationFunctions.InitialiseNavRegionsFromData(data); foreach (var node in nodes) { Assert.AreEqual(2, node.NeighbourRefs.Length); } }
public void GenerateNavRegionsFromNodes_CreatesExpectedNumberOfRegionsForClashingPoints() { const int neighbourCount = 4; const int singleNodes = 30; const int expectedRegionCount = 5; var nodesToAllocate = new List <NavNode>(); var neighbourNodes = new List <NavNode>(neighbourCount); NavNode priorNode = null; for (int j = 0; j < expectedRegionCount; j++) { for (int i = 0; i < singleNodes; i++) { var newNode = new NavNode(); for (int k = 0; k < neighbourCount - 1; k++) { var newNeighbour = new NavNode(); neighbourNodes.Add(newNeighbour); } if (priorNode != null) { var updatedPriorNeighbours = priorNode.NeighbourRefs.ToList(); updatedPriorNeighbours.Add(newNode); priorNode.NeighbourRefs = updatedPriorNeighbours.ToArray(); neighbourNodes.Add(priorNode); } newNode.NeighbourRefs = neighbourNodes.ToArray(); nodesToAllocate.Add(newNode); foreach (var neighbourNode in neighbourNodes) { nodesToAllocate.Add(neighbourNode); } neighbourNodes.Clear(); priorNode = newNode; } } Assert.AreEqual(1, NavRegionGenerationFunctions.GenerateNavRegionsFromNodes(nodesToAllocate, singleNodes * neighbourCount).Count); }
public void GenerateNavRegionsFromNodes_DoesNotConsiderDuplicates() { const int singleNodes = 30; const int expectedRegionCount = 5; var nodesToAllocate = new List <NavNode>(); var newNode = new NavNode(); for (int j = 0; j < expectedRegionCount; j++) { for (int i = 0; i < singleNodes; i++) { nodesToAllocate.Add(newNode); } } Assert.AreEqual(1, NavRegionGenerationFunctions.GenerateNavRegionsFromNodes(nodesToAllocate, singleNodes).Count); }
private void OnGUI() { GUILayout.Label("Nav Settings", EditorStyles.boldLabel); filePath = EditorGUILayout.TextField("File Path", filePath); fileName = EditorGUILayout.TextField("File Name", fileName); tilesPerRegion = EditorGUILayout.IntField("Tiles Per Region", tilesPerRegion); GUILayout.Label("Operations", EditorStyles.boldLabel); if (GUILayout.Button("Build Tilemap Nav")) { var returnedNodes = NavGenerationFunctions.GenerateNavDataForCurrentScene(); var returnedRegions = NavRegionGenerationFunctions.GenerateNavRegionsFromNodes(returnedNodes, tilesPerRegion); var navData = CreateInstance <TilemapNavData>(); navData.NodeData = returnedNodes; navData.NavigationTable = new NavTable(returnedRegions); AssetDatabase.CreateAsset(navData, filePath + fileName + ".asset"); } }
public void GenerateNavRegionsFromNodes_DoesNotCreateRegionsAcrossUnconnectedComponents() { const int neighbourCount = 4; const int singleNodes = 30; const int expectedRegionCount = 5; var nodesToAllocate = new List <NavNode>(); var neighbourNodes = new List <NavNode>(neighbourCount); for (int j = 0; j < expectedRegionCount; j++) { for (int i = 0; i < singleNodes; i++) { var newNode = new NavNode(); for (int k = 0; k < neighbourCount - 1; k++) { var newNeighbour = new NavNode(); neighbourNodes.Add(newNeighbour); } newNode.NeighbourRefs = neighbourNodes.ToArray(); nodesToAllocate.Add(newNode); foreach (var neighbourNode in neighbourNodes) { nodesToAllocate.Add(neighbourNode); } neighbourNodes.Clear(); } } Assert.AreEqual(expectedRegionCount * singleNodes, NavRegionGenerationFunctions.GenerateNavRegionsFromNodes(nodesToAllocate, singleNodes * neighbourCount).Count); }