private void BakeBoxColliders() { CleanUpOldNavMeshItems(); BoxCollider[] allBoxColliders = GameObject.FindObjectsOfType <BoxCollider>(); GameObject navMeshCubePrefab = GameObject.CreatePrimitive(PrimitiveType.Cube); DestroyImmediate(navMeshCubePrefab.GetComponent <Collider>()); navMeshCubePrefab.name = TEMP_NAV_MESH_OBJECT_TAG; GameObjectUtility.SetStaticEditorFlags(navMeshCubePrefab, StaticEditorFlags.NavigationStatic); navMeshCubePrefab.tag = TEMP_NAV_MESH_OBJECT_TAG; GameObject tempNavMeshCube; foreach (BoxCollider c in allBoxColliders) { if (COLLIDER_LAYER < 0 || c.gameObject.layer == COLLIDER_LAYER) { tempNavMeshCube = Instantiate(navMeshCubePrefab) as GameObject; tempNavMeshCube.name = navMeshCubePrefab.name; tempNavMeshCube.transform.parent = c.transform; tempNavMeshCube.transform.localPosition = c.center; tempNavMeshCube.transform.localRotation = Quaternion.identity; tempNavMeshCube.transform.localScale = c.size; tempNavMeshCube.hideFlags = HideFlags.DontSave; } } DestroyImmediate(navMeshCubePrefab); NavMeshBuilder.BuildNavMeshAsync(); CleanUpOldNavMeshItems(); }
void BakeNavMesh2D() { // create a temporary parent GameObject var obj = new GameObject(); // find all static box colliders, add them to projection AddBoxCollider2Ds(obj.transform); // find all static circle colliders, add them to projection AddCircleCollider2Ds(obj.transform); // find all static polygon colliders, add them to projection AddPolygonCollider2Ds(obj.transform); // min and max point needed for ground plane (from 3d colliders) var cols = GameObject.FindObjectsOfType <Collider>(); if (cols.Length > 0) { var min = new Vector2(Mathf.Infinity, Mathf.Infinity); var max = -min; foreach (var c in cols) { var minmax = NavMeshUtils2D.AdjustMinMax(c, min, max); min = minmax[0]; max = minmax[1]; } // create ground (cube instead of plane because it has unit size) // (pos between min and max; scaled to fit min and max * scale) // note: scale.y=0 so that *groundScale doesn't make it too high var go = GameObject.CreatePrimitive(PrimitiveType.Cube); go.isStatic = true; go.transform.parent = obj.transform; float w = max.x - min.x; float h = max.y - min.y; go.transform.position = new Vector3(min.x + w / 2, -0.5f, min.y + h / 2); go.transform.localScale = new Vector3(w, 0, h) * groundScale; } // bake navmesh asynchronously, clear mesh NavMeshBuilder.BuildNavMeshAsync(); // Async causes weird results if (gizmesh != null) { gizmesh.Clear(); } needsRebuild = true; // rebuild as soon as async baking is finished // delete the gameobjects now that the path was created GameObject.DestroyImmediate(obj); }
public override IEnumerator Execute(UTContext context) { if (UTPreferences.DebugMode) { Debug.Log("Setting up nav mesh settings."); } var settingsObject = new SerializedObject(NavMeshBuilder.navMeshSettingsObject); var agentRadiusSetting = settingsObject.FindProperty("m_BuildSettings.agentRadius"); var agentHeightSetting = settingsObject.FindProperty("m_BuildSettings.agentHeight"); var agentSlopeSetting = settingsObject.FindProperty("m_BuildSettings.agentSlope"); var ledgeDropHeightSetting = settingsObject.FindProperty("m_BuildSettings.ledgeDropHeight"); var agentClimbSetting = settingsObject.FindProperty("m_BuildSettings.agentClimb"); var maxJumpAcrossDistanceSetting = settingsObject.FindProperty("m_BuildSettings.maxJumpAcrossDistance"); var accuratePlacementSetting = settingsObject.FindProperty("m_BuildSettings.accuratePlacement"); var minRegionAreaSetting = settingsObject.FindProperty("m_BuildSettings.minRegionArea"); var widthInaccuracySetting = settingsObject.FindProperty("m_BuildSettings.widthInaccuracy"); var heightInaccuracySetting = settingsObject.FindProperty("m_BuildSettings.heightInaccuracy"); agentRadiusSetting.floatValue = agentRadius.EvaluateIn(context); agentHeightSetting.floatValue = agentHeight.EvaluateIn(context); agentSlopeSetting.floatValue = maxSlope.EvaluateIn(context); ledgeDropHeightSetting.floatValue = dropHeight.EvaluateIn(context); agentClimbSetting.floatValue = stepHeight.EvaluateIn(context); maxJumpAcrossDistanceSetting.floatValue = jumpDistance.EvaluateIn(context); accuratePlacementSetting.boolValue = heightMesh.EvaluateIn(context); minRegionAreaSetting.floatValue = minRegionArea.EvaluateIn(context); widthInaccuracySetting.floatValue = widthInaccuracy.EvaluateIn(context); heightInaccuracySetting.floatValue = heightInaccuracy.EvaluateIn(context); settingsObject.ApplyModifiedProperties(); Debug.Log("Starting baking of nav mesh."); NavMeshBuilder.BuildNavMeshAsync(); do { yield return(""); if (context.CancelRequested) { NavMeshBuilder.Cancel(); } } while(NavMeshBuilder.isRunning); Debug.Log("Nav mesh bake process finished."); }
public static void GeneratePathfindingPlatforms() { GameObject platformsGO = GameObject.Find("Pathfinding Platform"); if (platformsGO != null) { DestroyImmediate(platformsGO); } platformsGO = new GameObject("Pathfinding Platform"); MeshFilter platformMF = platformsGO.AddComponent <MeshFilter>(); MeshRenderer meshRend = platformsGO.AddComponent <MeshRenderer>(); platformsGO.AddComponent <MeshCollider>(); platformsGO.isStatic = true; Mesh newMesh = new Mesh(); EdgeCollider2D[] allEdges = FindObjectsOfType <EdgeCollider2D>(); BoxCollider2D[] allBoxes = FindObjectsOfType <BoxCollider2D>(); List <Quad> quads = new List <Quad>(); float navMeshDepth = 4f; Vector3 depthOffset = new Vector3(0f, 0f, PathfindingCharacterController.navMeshZ + navMeshDepth * 0.5f); Vector3 negDepthOffset = new Vector3(0f, 0f, PathfindingCharacterController.navMeshZ - navMeshDepth * 0.5f); foreach (EdgeCollider2D edge in allEdges) { Vector3 lastWorldPoint = Vector3.zero; for (int p = 0; p < edge.points.Length; p++) { Vector3 worldPoint = edge.transform.TransformPoint(edge.points[p]); if (lastWorldPoint != Vector3.zero) { quads.Add(new Quad(lastWorldPoint + negDepthOffset, worldPoint + negDepthOffset, worldPoint + depthOffset, lastWorldPoint + depthOffset)); } lastWorldPoint = worldPoint; } } foreach (BoxCollider2D box in allBoxes) { if (box.isTrigger) { continue; } float xMin = box.offset.x - box.size.x; float xMax = box.offset.x + box.size.x; float yTop = box.offset.y + box.size.y; Vector3 left = box.transform.TransformPoint(xMin, yTop, 0f); Vector3 right = box.transform.TransformPoint(xMax, yTop, 0f); quads.Add(new Quad(left + negDepthOffset, right + negDepthOffset, right + depthOffset, left + depthOffset)); } Vector3[] vertices = new Vector3[quads.Count * 4]; int[] tris = new int[quads.Count * 6]; for (int q = 0; q < quads.Count; q++) { // Debug.Log("Adding Quad " + q); quads[q].Insert(vertices, q * 4, tris, q * 6); } newMesh.vertices = vertices; newMesh.triangles = tris; platformMF.mesh = newMesh; NavMeshBuilder.ClearAllNavMeshes(); NavMeshBuilder.BuildNavMeshAsync(); meshRend.enabled = false; }