Ejemplo n.º 1
0
        private static void DrawPolygon(NavigationPolygon region, Color color)
        {
            Gizmos.color = color;
            var p0 = region[region.Count - 1];
            var p1 = region[0];

            Gizmos.DrawLine(new Vector3(p0.X.ToFloat(), 0, p0.Y.ToFloat()), new Vector3(p1.X.ToFloat(), 0, p1.Y.ToFloat()));
            for (int i = 1; i < region.Count; i++)
            {
                p0 = region[i - 1];
                p1 = region[i];
                Gizmos.DrawLine(new Vector3(p0.X.ToFloat(), 0, p0.Y.ToFloat()), new Vector3(p1.X.ToFloat(), 0, p1.Y.ToFloat()));
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Fills list of TilePerims of tiles in a TileMap.
        /// </summary>
        /// <param name="tileMap">The TileMap which we are grabbing tiles from</param>
        /// <returns>A list containing the TilePerims in the input TileMap</returns>
        private static List <TilePerim> _FillTiles(TileMap tileMap)
        {
            var tilePerims = new List <TilePerim>();
            var usedCells  = new List <Vector2>(tileMap.GetUsedCells().OfType <Vector2>()); //thanks to godot's C# api array being non-typed i have to commit this atrocity

            for (int i = 0; i < usedCells.Count; i++)
            {
                Vector2           cell        = usedCells[i];
                Vector2           botCoord    = tileMap.MapToWorld(cell); //Thanks to graphics in general using reverse Y axis, the bottom coordinate actually has the HIGHEST y-value
                int               cellID      = tileMap.GetCellv(cell);
                Vector2           originCoord = botCoord - (new Vector2((float)Globals.TileWidth / 2, 0)) + tileMap.TileSet.TileGetTextureOffset(cellID);
                NavigationPolygon navPoly     = tileMap.TileSet.TileGetNavigationPolygon(cellID);

                Vector2[] vertices  = _ShiftVertices(navPoly.Vertices, originCoord);
                var       tilePerim = new TilePerim(vertices, cell, i);
                tilePerims.Add(tilePerim);
            }
            return(tilePerims);
        }
Ejemplo n.º 3
0
        public override void _Ready()
        {
            var navPoly = new NavigationPolygon();
            var offset  = new Vector2(0, -Globals.TileHeight);

            foreach (int tileID in this.TileSet.GetTilesIds())
            {
                this.TileSet.TileSetTextureOffset(tileID, offset);

                if (tileID == 0)
                {
                    navPoly = this.TileSet.TileGetNavigationPolygon(tileID);
                }
                else
                {
                    this.TileSet.TileSetNavigationPolygon(tileID, navPoly);
                }
            }
        }
Ejemplo n.º 4
0
        private NavigationPolygon ToPolygon(GameObject go, int funnelSize)
        {
            var points = new NavigationPolygon();

            var mesh = go.GetComponent <BoxCollider>();

            Vector3 p1 = new Vector3(-mesh.size.x, 0, -mesh.size.z) * 0.5f;
            Vector3 p2 = new Vector3(mesh.size.x, 0, -mesh.size.z) * 0.5f;
            Vector3 p3 = new Vector3(mesh.size.x, 0, mesh.size.z) * 0.5f;
            Vector3 p4 = new Vector3(-mesh.size.x, 0, mesh.size.z) * 0.5f;

            p1 = go.transform.TransformPoint(p1);
            p2 = go.transform.TransformPoint(p2);
            p3 = go.transform.TransformPoint(p3);
            p4 = go.transform.TransformPoint(p4);
            points.Add(new DeterministicVector2()
            {
                X = (int)p1.x - funnelSize,
                Y = (int)p1.z - funnelSize
            });
            points.Add(new DeterministicVector2()
            {
                X = (int)p2.x + funnelSize,
                Y = (int)p2.z - funnelSize
            });
            points.Add(new DeterministicVector2()
            {
                X = (int)p3.x + funnelSize,
                Y = (int)p3.z + funnelSize
            });
            points.Add(new DeterministicVector2()
            {
                X = (int)p4.x - funnelSize,
                Y = (int)p4.z + funnelSize
            });

            return(points);
        }
Ejemplo n.º 5
0
        private void ProzessFloorAndStaticObjects(NavigationFloorComponent floorObject,
                                                  NavigationStaticObjectComponent[] staticObjects, out NavigationPolygons staticObjectsPoly, out NavigationPolygon floorObjectsPoly)
        {
            floorObjectsPoly = ToPolygon(floorObject.gameObject, 0);

            staticObjectsPoly = new NavigationPolygons();
            foreach (var staticObj in staticObjects)
            {
                staticObjectsPoly.Add(ToPolygon(staticObj.gameObject, 0));
            }
        }