コード例 #1
0
        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);
        }
コード例 #2
0
 internal static void CollectSources(List<NavMeshBuildSource> sources, NavMeshBuilder2dWrapper builder)
 {
     var root = builder.GetRoot();
     foreach (var it in root)
     {
         CollectSources(it, sources, builder);
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
                    }
                }
            }
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }