internal static void CollectGridSources(List <NavMeshBuildSource> sources, NavMeshBuilder2dWrapper builder) { var grid = GameObject.FindObjectOfType <Grid>(); foreach (var modifier in grid.GetComponentsInChildren <NavMeshModifier>()) { if (((0x1 << modifier.gameObject.layer) & builder.layerMask) == 0) { continue; } if (!modifier.AffectsAgentType(builder.agentID)) { continue; } int area = builder.defaultArea; //if it is walkable if (builder.defaultArea != 1 && !modifier.ignoreFromBuild) { var tilemap = modifier.GetComponent <Tilemap>(); if (tilemap != null) { if (builder.compressBounds) { tilemap.CompressBounds(); } Debug.Log($"Walkable Bounds [{tilemap.name}]: {tilemap.localBounds}"); var box = BoxBoundSource(NavMeshSurface2d.GetWorldBounds(tilemap.transform.localToWorldMatrix, tilemap.localBounds)); box.area = builder.defaultArea; sources.Add(box); } } if (modifier.overrideArea) { area = modifier.area; } if (!modifier.ignoreFromBuild) { if (builder.CollectGeometry == NavMeshCollectGeometry.PhysicsColliders) { CollectSources(sources, modifier, area, builder); } else { var tilemap = modifier.GetComponent <Tilemap>(); if (tilemap != null) { CollectTileSources(sources, tilemap, area, builder); } var sprite = modifier.GetComponent <SpriteRenderer>(); if (sprite != null) { CollectSources(sources, sprite, area, builder); } } } } Debug.Log("Sources " + sources.Count); }
internal static void CollectSources(List<NavMeshBuildSource> sources, NavMeshBuilder2dWrapper builder) { var root = builder.GetRoot(); foreach (var it in root) { CollectSources(it, sources, builder); } }
internal static void CollectGridSources(List <NavMeshBuildSource> sources, int defaultArea, int layerMask, bool overrideByGrid, GameObject useMeshPrefab, bool compressBounds, Vector3 overrideVector) { var builder = new NavMeshBuilder2dWrapper(); builder.defaultArea = defaultArea; builder.layerMask = layerMask; builder.useMeshPrefab = useMeshPrefab; builder.overrideByGrid = overrideByGrid; builder.compressBounds = compressBounds; builder.overrideVector = overrideVector; var grid = GameObject.FindObjectOfType <Grid>(); foreach (var tilemap in grid.GetComponentsInChildren <Tilemap>()) { if (((0x1 << tilemap.gameObject.layer) & layerMask) == 0) { continue; } int area = defaultArea; var modifier = tilemap.GetComponent <NavMeshModifier>(); //if it is walkable if (defaultArea != 1 && (modifier == null || (modifier != null && !modifier.ignoreFromBuild))) { if (compressBounds) { tilemap.CompressBounds(); } Debug.Log($"Walkable Bounds [{tilemap.name}]: {tilemap.localBounds}"); var box = BoxBoundSource(NavMeshSurface2d.GetWorldBounds(tilemap.transform.localToWorldMatrix, tilemap.localBounds)); box.area = defaultArea; sources.Add(box); } if (modifier != null && modifier.overrideArea) { area = modifier.area; } if (modifier != null && !modifier.ignoreFromBuild) { CollectTileSources(sources, tilemap, area, builder); } } Debug.Log("Sources " + sources.Count); }
static private void CollectTileSources(List <NavMeshBuildSource> sources, Tilemap tilemap, int area, NavMeshBuilder2dWrapper builder) { var bound = tilemap.cellBounds; var vec3int = new Vector3Int(0, 0, 0); var size = new Vector3(tilemap.layoutGrid.cellSize.x, tilemap.layoutGrid.cellSize.y, tilemap.layoutGrid.cellSize.y); Mesh sharedMesh = null; Quaternion rot = default; var src = new NavMeshBuildSource(); src.shape = NavMeshBuildSourceShape.Mesh; src.area = area; Mesh mesh; if (builder.useMeshPrefab != null) { sharedMesh = builder.useMeshPrefab.GetComponent <MeshFilter>().sharedMesh; size = builder.useMeshPrefab.transform.localScale; rot = builder.useMeshPrefab.transform.rotation; } for (int i = bound.xMin; i < bound.xMax; i++) { for (int j = bound.yMin; j < bound.yMax; j++) { vec3int.x = i; vec3int.y = j; if (!tilemap.HasTile(vec3int)) { continue; } if (!builder.overrideByGrid && tilemap.GetColliderType(vec3int) == Tile.ColliderType.Sprite) { mesh = builder.GetMesh(tilemap.GetSprite(vec3int)); src.transform = Matrix4x4.Translate(Vector3.Scale(tilemap.GetCellCenterWorld(vec3int), builder.overrideVector)) * tilemap.GetTransformMatrix(vec3int); src.sourceObject = mesh; sources.Add(src); } else if (builder.useMeshPrefab != null || (builder.overrideByGrid && builder.useMeshPrefab != null)) { src.transform = Matrix4x4.TRS(Vector3.Scale(tilemap.GetCellCenterWorld(vec3int), builder.overrideVector), rot, size); src.sourceObject = sharedMesh; sources.Add(src); } else //default to box { var boxsrc = new NavMeshBuildSource(); boxsrc.transform = Matrix4x4.Translate(Vector3.Scale(tilemap.GetCellCenterWorld(vec3int), builder.overrideVector)); boxsrc.shape = NavMeshBuildSourceShape.Box; boxsrc.size = size; boxsrc.area = area; sources.Add(boxsrc); } } } }
private static void CollectSources(List <NavMeshBuildSource> sources, NavMeshModifier modifier, int area, NavMeshBuilder2dWrapper builder) { var collider = modifier.GetComponent <Collider2D>(); if (collider == null) { return; } if (collider.usedByComposite) { collider = collider.GetComponent <CompositeCollider2D>(); } var src = new NavMeshBuildSource(); src.shape = NavMeshBuildSourceShape.Mesh; src.area = area; Mesh mesh; mesh = builder.GetMesh(collider); if (mesh == null) { Debug.Log($"{collider.name} mesh is null"); return; } if (collider.attachedRigidbody) { src.transform = Matrix4x4.TRS(Vector3.Scale(collider.transform.position, builder.overrideVector), collider.transform.rotation, Vector3.one); } else { src.transform = Matrix4x4.identity; } src.sourceObject = mesh; sources.Add(src); }
private static void CollectSources(List <NavMeshBuildSource> sources, SpriteRenderer sprite, int area, NavMeshBuilder2dWrapper builder) { if (sprite == null) { return; } var src = new NavMeshBuildSource(); src.shape = NavMeshBuildSourceShape.Mesh; src.area = area; Mesh mesh; mesh = builder.GetMesh(sprite.sprite); if (mesh == null) { Debug.Log($"{sprite.name} mesh is null"); return; } src.transform = Matrix4x4.TRS(Vector3.Scale(sprite.transform.position, builder.overrideVector), sprite.transform.rotation, sprite.transform.lossyScale); src.sourceObject = mesh; sources.Add(src); }
List <NavMeshBuildSource> CollectSources() { var sources = new List <NavMeshBuildSource>(); var markups = new List <NavMeshBuildMarkup>(); List <NavMeshModifier> modifiers; if (m_CollectObjects == CollectObjects2d.Children) { modifiers = new List <NavMeshModifier>(GetComponentsInChildren <NavMeshModifier>()); modifiers.RemoveAll(x => !x.isActiveAndEnabled); } else { modifiers = NavMeshModifier.activeModifiers; } foreach (var m in modifiers) { if ((m_LayerMask & (1 << m.gameObject.layer)) == 0) { continue; } if (!m.AffectsAgentType(m_AgentTypeID)) { continue; } var markup = new NavMeshBuildMarkup(); markup.root = m.transform; markup.overrideArea = m.overrideArea; markup.area = m.area; markup.ignoreFromBuild = m.ignoreFromBuild; markups.Add(markup); } #if UNITY_EDITOR if (!EditorApplication.isPlaying) { if (m_CollectObjects == CollectObjects2d.All) { UnityEditor.AI.NavMeshBuilder.CollectSourcesInStage( null, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, gameObject.scene, sources); } else if (m_CollectObjects == CollectObjects2d.Children) { UnityEditor.AI.NavMeshBuilder.CollectSourcesInStage( transform, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, gameObject.scene, sources); } else if (m_CollectObjects == CollectObjects2d.Volume) { Matrix4x4 localToWorld = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one); var worldBounds = GetWorldBounds(localToWorld, new Bounds(m_Center, m_Size)); UnityEditor.AI.NavMeshBuilder.CollectSourcesInStage( worldBounds, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, gameObject.scene, sources); } var builder = new NavMeshBuilder2dWrapper(); builder.defaultArea = defaultArea; builder.layerMask = layerMask; builder.agentID = agentTypeID; builder.useMeshPrefab = useMeshPrefab; builder.overrideByGrid = overrideByGrid; builder.compressBounds = compressBounds; builder.overrideVector = overrideVector; builder.CollectGeometry = useGeometry; builder.CollectObjects = collectObjects; builder.parent = gameObject; NavMeshBuilder2d.CollectSources(sources, builder); } else #endif { if (m_CollectObjects == CollectObjects2d.All) { NavMeshBuilder.CollectSources(null, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, sources); } else if (m_CollectObjects == CollectObjects2d.Children) { NavMeshBuilder.CollectSources(transform, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, sources); } else if (m_CollectObjects == CollectObjects2d.Volume) { Matrix4x4 localToWorld = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one); var worldBounds = GetWorldBounds(localToWorld, new Bounds(m_Center, m_Size)); NavMeshBuilder.CollectSources(worldBounds, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, sources); } var builder = new NavMeshBuilder2dWrapper(); builder.defaultArea = defaultArea; builder.layerMask = layerMask; builder.agentID = agentTypeID; builder.useMeshPrefab = useMeshPrefab; builder.overrideByGrid = overrideByGrid; builder.compressBounds = compressBounds; builder.overrideVector = overrideVector; builder.CollectGeometry = useGeometry; builder.CollectObjects = collectObjects; builder.parent = gameObject; NavMeshBuilder2d.CollectSources(sources, builder); } if (m_IgnoreNavMeshAgent) { sources.RemoveAll((x) => (x.component != null && x.component.gameObject.GetComponent <NavMeshAgent>() != null)); } if (m_IgnoreNavMeshObstacle) { sources.RemoveAll((x) => (x.component != null && x.component.gameObject.GetComponent <NavMeshObstacle>() != null)); } AppendModifierVolumes(ref sources); return(sources); }