Пример #1
0
        /// <summary>
        /// Create the graph and fills it with the tilemap information
        /// Only "walkable" nodes are considered
        /// </summary>
        private void MountLevel()
        {
            Collectables = new List <Collectable>();

            //iterates through all tiles and create nodes in the graph
            //and elements int he level based on the tile's poisition
            //in the grid and type. Walls are not considered for the graph
            foreach (var tilePosition in _tilemap.cellBounds.allPositionsWithin)
            {
                var tile = _tilemap.GetTile(tilePosition);

                if (tile != null)
                {
                    bool           clearColor = false;
                    Pacman.NavNode navNode    = new Pacman.NavNode();
                    if (tile.name.Equals("pelletTile"))
                    {
                        clearColor = true;

                        navNode.NodeType = Pacman.NodeType.Normal;
                        navNode.Indexes  = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);

                        var pellet = Instantiate(_pelletPrefab).GetComponent <Pellet>();
                        pellet.PelletType         = PelletTypes.Small;
                        pellet.transform.position = _tilemap.GetCellCenterWorld(tilePosition);
                        pellet.Index = new Vector2(tilePosition.x, tilePosition.y);
                        Collectables.Add(pellet);
                    }
                    else if (tile.name.Equals("bigPelletTile"))
                    {
                        clearColor = true;

                        navNode.NodeType = Pacman.NodeType.PowerUp;
                        navNode.Indexes  = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);

                        var bigPellet = Instantiate(_bigPelletPrefab).GetComponent <Pellet>();
                        bigPellet.PelletType         = PelletTypes.Big;
                        bigPellet.transform.position = _tilemap.GetCellCenterWorld(tilePosition);
                        bigPellet.Index = new Vector2(tilePosition.x, tilePosition.y);
                        Collectables.Add(bigPellet);
                    }
                    else if (tile.name.Equals("emptyTile"))
                    {
                        clearColor = true;

                        navNode.NodeType = Pacman.NodeType.Normal;
                        navNode.Indexes  = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("bonusPointTile"))
                    {
                        clearColor = true;

                        navNode.NodeType        = Pacman.NodeType.BonusPoint;
                        NavGraph.BonusPointNode = navNode;
                        navNode.Indexes         = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);

                        var bonusPellet = Instantiate(_bonusPelletPrefab).GetComponent <Pellet>();
                        bonusPellet.PelletType         = PelletTypes.Bonus;
                        bonusPellet.transform.position = _tilemap.GetCellCenterWorld(tilePosition);
                        bonusPellet.Index = new Vector2(tilePosition.x, tilePosition.y);
                        Collectables.Add(bonusPellet);
                    }
                    else if (tile.name.Equals("playerTile"))
                    {
                        clearColor = true;

                        navNode.NodeType         = Pacman.NodeType.PlayerSpawn;
                        NavGraph.PlayerSpawnNode = navNode;
                        navNode.Indexes          = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("enemy1"))
                    {
                        clearColor = true;

                        navNode.NodeType            = Pacman.NodeType.EnemyPosition1;
                        NavGraph.EnemyPosition1Node = navNode;
                        navNode.Indexes             = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("enemy2"))
                    {
                        clearColor = true;

                        navNode.NodeType            = Pacman.NodeType.EnemyPosition2;
                        NavGraph.EnemyPosition2Node = navNode;
                        navNode.Indexes             = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("enemy3"))
                    {
                        clearColor = true;

                        navNode.NodeType            = Pacman.NodeType.EnemyPosition3;
                        NavGraph.EnemyPosition3Node = navNode;
                        navNode.Indexes             = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("enemy4"))
                    {
                        clearColor = true;

                        navNode.NodeType            = Pacman.NodeType.EnemyPosition4;
                        NavGraph.EnemyPosition4Node = navNode;
                        navNode.Indexes             = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("warperDown"))
                    {
                        //clearColor = true;

                        navNode.NodeType    = Pacman.NodeType.WarperDown;
                        NavGraph.WarperDown = navNode;
                        navNode.Indexes     = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("warperUp"))
                    {
                        //clearColor = true;

                        navNode.NodeType  = Pacman.NodeType.WarperUp;
                        NavGraph.WarperUp = navNode;
                        navNode.Indexes   = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("warperLeft"))
                    {
                        //clearColor = true;

                        navNode.NodeType    = Pacman.NodeType.WarperLeft;
                        NavGraph.WarperLeft = navNode;
                        navNode.Indexes     = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("warperRight"))
                    {
                        //clearColor = true;

                        navNode.NodeType     = Pacman.NodeType.WarperRight;
                        NavGraph.WarperRight = navNode;
                        navNode.Indexes      = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("nonPlayableTile"))
                    {
                        clearColor = true;

                        navNode.NodeType = Pacman.NodeType.NonWalkable;
                        navNode.Indexes  = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }
                    else if (tile.name.Equals("EnemyExitTile"))
                    {
                        clearColor = true;

                        navNode.NodeType             = Pacman.NodeType.Normal;
                        NavGraph.EnemyExitTargetNode = navNode;
                        navNode.Indexes = new System.Tuple <int, int>(tilePosition.x, tilePosition.y);
                        NavGraph.AddNavNode(navNode);
                    }

                    if (clearColor)
                    {
                        _tilemap.SetTileFlags(tilePosition, TileFlags.None);
                        _tilemap.SetColor(tilePosition, new Color(0, 0, 0, 0));
                    }
                }
            }


            //link warp nodes
            NavGraph.WarperLeft.Left   = NavGraph.WarperRight;
            NavGraph.WarperRight.Right = NavGraph.WarperLeft;
            NavGraph.WarperUp.Up       = NavGraph.WarperDown;
            NavGraph.WarperDown.Down   = NavGraph.WarperUp;
        }