public Mesh GetMesh(Sprite sprite) { Mesh mesh; if (map.ContainsKey(sprite)) { mesh = map[sprite]; } else { mesh = new Mesh(); NavMeshBuilder2d.sprite2mesh(sprite, mesh); map.Add(sprite, mesh); } return mesh; }
public Mesh GetMesh(Sprite sprite, Transform transform) { Mesh mesh; if (map.ContainsKey(sprite)) { mesh = map[sprite]; } else { var shapeCount = sprite.GetPhysicsShapeCount(); if (shapeCount > 0) { mesh = new Mesh(); var combine = new CombineInstance[shapeCount]; for (var i = 0; i < shapeCount; i++) { var shape = new List <Vector2>(); sprite.GetPhysicsShape(i, shape); var vertices = shape.Select(point => new Vector3(point.x, point.y, 0.0f)).ToList(); combine[i].mesh = CreateMeshFromPolygon(vertices); combine[i].transform = transform.localToWorldMatrix; } mesh.CombineMeshes(combine); map.Add(sprite, mesh); } else { mesh = new Mesh(); NavMeshBuilder2d.sprite2mesh(sprite, mesh); map.Add(sprite, mesh); } } return(mesh); }
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); } NavMeshBuilder2d.CollectGridSources(sources, m_DefaultArea, m_LayerMask, m_OverrideByGrid, m_UseMeshPrefab); } 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); } NavMeshBuilder2d.CollectGridSources(sources, m_DefaultArea, m_LayerMask, m_OverrideByGrid, m_UseMeshPrefab); } 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); }
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); } if (!hideEditorLogs && !Mathf.Approximately(transform.eulerAngles.x, 270f)) { Debug.LogWarning("NavMeshSurface2d is not rotated respectively to (x-90;y0;z0). Apply rotation unless intended."); } 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; builder.hideEditorLogs = hideEditorLogs; 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); } if (!hideEditorLogs && !Mathf.Approximately(transform.eulerAngles.x, 270f)) { Debug.LogWarning("NavMeshSurface2d is not rotated respectively to (x-90;y0;z0). Apply rotation unless intended."); } 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; builder.hideEditorLogs = hideEditorLogs; 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); }