public List <Vector3> GetPath(Vector2 start, Vector2 end) { Vector3Int startCell = tilemap.WorldToCell(new Vector3(start.x, start.y, 0)); Vector3Int endCell = tilemap.WorldToCell(new Vector3(end.x, end.y, 0)); List <Spot> pathTiles = astar.CreatePath(spots, new Vector2Int(startCell.x, startCell.y), new Vector2Int(endCell.x, endCell.y), 1000); List <Vector3> path = new List <Vector3>(); for (int i = 0; i < pathTiles.Count; i++) { path.Add(tilemap.CellToWorld(new Vector3Int( pathTiles[pathTiles.Count - 1 - i].X, pathTiles[pathTiles.Count - 1 - i].Y , 0)) + tilemap.transform.localScale / 2.0f); } return(path); }
/** * Donne les cases les plus proches du joueur vers lesquelles il peut se déplacer * Update aussi la liste des tiles accessibles directement, qu'il y ait ennemis ou non (pour dévoiler les cases dans FogMgr par exemple) */ public void UpdateAccessibleTilesList() { Vector3Int supposedPlayerCellPos = PlayerManager.Instance.supposedPos; //Position du player en format cell nearestTilesList.Clear(); //Clear la liste de tiles avant de placer les nouvelles nearestTilesList.Add(new Vector3Int(supposedPlayerCellPos.x + nbTilesToMove, supposedPlayerCellPos.y, 0)); //Ajoute les 4 cases voisines nearestTilesList.Add(new Vector3Int(supposedPlayerCellPos.x - nbTilesToMove, supposedPlayerCellPos.y, 0)); nearestTilesList.Add(new Vector3Int(supposedPlayerCellPos.x, supposedPlayerCellPos.y + nbTilesToMove, 0)); nearestTilesList.Add(new Vector3Int(supposedPlayerCellPos.x, supposedPlayerCellPos.y - nbTilesToMove, 0)); accessibleTiles.Clear(); showableTilesList.Clear(); Vector3Int currentCellPos = PlayerManager.Instance.GetPlayerCellPosition(); if (null != tilesList) { //On regarde si les cases proches sont walkable, si non : on les retire de la liste List <Vector3Int> tempNearTilesList = new List <Vector3Int>(); foreach (Vector3Int tile in nearestTilesList) { if (tilesList.Contains(tile)) { tempNearTilesList.Add(tile); } } nearestTilesList = tempNearTilesList; //Si le chemin vers les rooms proches est direct, dans ce cas on met la tile dans la liste des accessibles foreach (Vector3Int tile in nearestTilesList) { //Roadpath partant du centre de la room, qu'il y ait un ennemi ou pas, pour calculer les tiles accessibles, et qu'il n'y ait pas de décalage si le player n'est pas au centre de la room roadPath = astar.CreatePath(spots, new Vector2Int(supposedPlayerCellPos.x, supposedPlayerCellPos.y), new Vector2Int(tile.x, tile.y), 100); //Si le chemin est direct (moins de 5 tiles pour y accéder) if (roadPath.Count < 5) { accessibleTiles.Add(tile); showableTilesList.Add(tile); } } //On retire maintenant les tiles où il y a un ennemi si on souhaite le prendre en compte (carte move autre que swift, etc...) List <Vector3Int> tilesToRemove = new List <Vector3Int>(); foreach (Vector3Int tile in accessibleTiles) { //Roadpath partant de la tile actuelle du player, dans le cas où il n'est pas au centre de la room, va permettre de regarder si l'ennemi est sur le path tempRoadPath = astar.CreatePath(spots, new Vector2Int(currentCellPos.x, currentCellPos.y), new Vector2Int(tile.x, tile.y), 100); bool isEnemyOnPath = false; //On check en plus si on a un ennemi sur le chemin foreach (Spot _tile in tempRoadPath) { //Si un ennemi est sur une tile du roadPath if (null != EnemyManager.Instance.GetEnemyViewByPosition(new Vector3Int(_tile.X, _tile.Y, 0))) { //Si cet ennemi est dans la room if (EnemyManager.Instance.GetEnemyViewByPosition(new Vector3Int(_tile.X, _tile.Y, 0)).enemyData.inPlayersRoom) { isEnemyOnPath = true; } } } if (isEnemyOnPath && (PlayerManager.Instance.GetCardEffectData()[0].rolling || PlayerManager.Instance.GetCardEffectData()[0].noBrakes)) { //Remove la tile des accessibles tilesToRemove.Add(tile); } } if (tilesToRemove.Count > 0) { foreach (Vector3Int tile in tilesToRemove) { if (accessibleTiles.Contains(tile)) { Debug.Log("Tile removed"); accessibleTiles.Remove(tile); } } } } else { Debug.Log("TilesList is null !"); } }
/** * Update 2 lists : * * accessibles Tiles where the player can move * * showable Tiles where you can remove fog for example */ public void UpdateAccessibleNodesList() { //Player node position Vector3Int supposedPlayerNodePos = PlayerMgr.Instance.GetNodePosOfPlayer(); Vector3Int supposedPlayerTilePos = PlayerMgr.Instance.GetTilePosOfPlayer(); Node currentNode = GetNodeFromPos(supposedPlayerNodePos).GetComponent <NodeScript>().node; //Clear the list to get new ones nearestNodesList.Clear(); switch (currentNode.roadType) { case RoadType.Cross: //Add the RIGHT node if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z))); } //Add the LEFT node if (supposedPlayerNodePos.x - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z))); } //Add the TOP node if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth))); } //Add the DOWN node if (supposedPlayerNodePos.z - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth))); } break; case RoadType.Horizontal: //Add the RIGHT node if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z))); } //Add the LEFT node if (supposedPlayerNodePos.x - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z))); } break; case RoadType.Vertical: //Add the TOP node if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth))); } //Add the DOWN node if (supposedPlayerNodePos.z - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth))); } break; case RoadType.TurnUpRight: //Add the TOP node if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth))); } //Add the RIGHT node if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z))); } break; case RoadType.TurnUpLeft: //Add the TOP node if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth))); } // Add the LEFT node if (supposedPlayerNodePos.x - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z))); } break; case RoadType.TurnDownRight: //Add the RIGHT node if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z))); } //Add the DOWN node if (supposedPlayerNodePos.z - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth))); } break; case RoadType.TurnDownLeft: // Add the LEFT node if (supposedPlayerNodePos.x - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z))); } //Add the DOWN node if (supposedPlayerNodePos.z - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth))); } break; case RoadType.TRight: //Add the TOP node if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth))); } //Add the DOWN node if (supposedPlayerNodePos.z - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth))); } //Add the RIGHT node if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z))); } break; case RoadType.TLeft: //Add the TOP node if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth))); } //Add the DOWN node if (supposedPlayerNodePos.z - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth))); } // Add the LEFT node if (supposedPlayerNodePos.x - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z))); } break; case RoadType.TUp: //Add the RIGHT node if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z))); } //Add the LEFT node if (supposedPlayerNodePos.x - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z))); } //Add the TOP node if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth))); } break; case RoadType.TDown: //Add the RIGHT node if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z))); } //Add the LEFT node if (supposedPlayerNodePos.x - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z))); } //Add the DOWN node if (supposedPlayerNodePos.z - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth))); } break; case RoadType.DeadendRight: //Add the RIGHT node if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z))); } break; case RoadType.DeadendLeft: //Add the LEFT node if (supposedPlayerNodePos.x - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z))); } break; case RoadType.DeadendUp: //Add the TOP node if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth))); } break; case RoadType.DeadendDown: //Add the DOWN node if (supposedPlayerNodePos.z - nodeWidth >= 0) { nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth))); } break; } //Clear the two lists accessibleNodes.Clear(); showableTilesList.Clear(); //Update card datas to know if it's a swift move card if (null != tilesMap) { //If the path to nearest nodes is direct, add them to accessibles nodes foreach (Transform node in nearestNodesList) { //Get the middle tile of node Vector3Int targetTile = new Vector3Int((int)node.position.x + 1, (int)node.position.y, (int)node.position.z + 1); //Roadpath starting from the center of the node, with enemy on path or not, to calculate accessible tiles, and to not have an offset if the player is not in the center of the node roadPath = astar.CreatePath(grid, new Vector2Int(supposedPlayerTilePos.x, supposedPlayerTilePos.z), new Vector2Int(targetTile.x, targetTile.z), 100); //If the path is direct (less than 5 tiles) if (roadPath != null && roadPath.Count <= 5) { bool enemyOnPath = false; // Check if an enemy is on path, but not on the last tile, because we can go on a node with an enemy on it foreach (Spot tile in roadPath) { //If there is an enemy on path if (EnemyMgr.Instance.GetEnemyByPosition(new Vector3Int(tile.X, 0, tile.Y))) { if (EnemyMgr.Instance.GetEnemyByPosition(new Vector3Int(tile.X, 0, tile.Y)).enemyData.inPlayersNode) { enemyOnPath = true; } } } if (!enemyOnPath || ignoreEnemies) { accessibleNodes.Add(node); } } } } }
public void MoveToPlayer() { tilesList = new List <Spot>(); //position d'arrivée (player) en format cellule Vector3 playerPos = player.transform.position; Vector3Int playerCellPos = walkableTilemap.WorldToCell(playerPos); //Si l'ennemi n'est pas dans la room du player if (!enemyData.inPlayersRoom && !enemyData.inOtherEnemyRoom) { tileIndex = 0; //Position cellule de l'enemy Vector3Int enemyPos = walkableTilemap.WorldToCell(transform.position); if (roadPath != null && roadPath.Count > 0) //reset le roadpath { roadPath.Clear(); } //création du path, prenant en paramètre la position des tiles, le point de départ, le point d'arrivée, et la longueur en tiles du path -> dépend de l'ennemi //roadPath est une liste de spots = une liste de positions de tiles roadPath = astar.CreatePath(walkableTilesArray, new Vector2Int(enemyPos.x, enemyPos.y), new Vector2Int(playerCellPos.x, playerCellPos.y), nbTilesPerMove * enemyData.nbMoves); if (roadPath == null) { return; } //On ajoute les tiles à parcourir dans une liste, en vérifiant si le joueur est sur le path foreach (Spot tile in roadPath) { bool isPlayerOnPath = false; bool isOtherEnemyOnPath = false; //on ajoute les tiles par lesquelles il va devoir passer sauf celle où il y a le player ou un autre ennemi if (playerCellPos.x == tile.X && playerCellPos.y == tile.Y) { isPlayerOnPath = true; enemyData.inPlayersRoom = true; //L'ennemi sera présent dans la room } //On regarde si on a un autre ennemi sur le path parmis tous les ennemis existants foreach (EnemyView enemy in EnemyManager.Instance.GetAllEnemies()) { //Position cellule de l'ennemi Vector3Int _enemyCellPos = walkableTilemap.WorldToCell(enemy.transform.position); //On check seulement les ennemis autres que celui qu'on veut bouger (qui porte ce script) if (enemy != this) { //Si l'ennemi est sur une tile if (_enemyCellPos.x == tile.X && _enemyCellPos.y == tile.Y) { isOtherEnemyOnPath = true; enemyData.inOtherEnemyRoom = true; //L'ennemi sera présent dans la room //Debug.Log("L'ennemi " + this.name + " a un ennemi sur sa route : " + enemy.name); } } } if (!isPlayerOnPath && !isOtherEnemyOnPath) { tilesList.Add(tile); } tileIndex++; } enemiesInRoom.Clear(); //Clear la liste d'ennemis présents dans la future room Vector3 targetTilePos = TilesManager.Instance.walkableTilemap.CellToWorld(new Vector3Int(roadPath[0].X, roadPath[0].Y, 0)); Vector3Int targetRoom = TilesManager.Instance.roomTilemap.WorldToCell(targetTilePos); //Récup la room future en prenant la position de la tile la plus éloignée du path foreach (EnemyView enemy in EnemyManager.Instance.GetAllEnemies()) //Pour chaque ennemi de la map { if (enemy != this) //Si c'est un autre que celui actuel { if (enemy.GetRoomPosition() == targetRoom) //On check si l'autre ennemi est dans la future room { enemiesInRoom.Add(enemy); //On ajoute donc l'ennemi dans la liste } } } tilesList.Reverse(); //on inverse la liste pour la parcourir de la tile la plus proche à la plus éloignée tilesList.RemoveAt(0); Vector3Int enemyCellPos = TilesManager.Instance.walkableTilemap.WorldToCell(this.transform.position); //On update le sprite du player en fonction de sa direction if (tilesList[0].Y > enemyCellPos.y) { UpdateEnemySprite("haut_gauche"); } else if (tilesList[0].X > enemyCellPos.x) { UpdateEnemySprite("haut_droite"); } else if (tilesList[0].X < enemyCellPos.x) { UpdateEnemySprite("bas_gauche"); } else if (tilesList[0].Y < enemyCellPos.y) { UpdateEnemySprite("bas_droite"); } //Affiche les coordonnées de tiles des paths que l'ennemi doit parcourir /*foreach(Spot spot in tilesList) * { * Debug.Log(spot.X + " / " + spot.Y); * }*/ } tileIndex = 0; canMove = true; //On autorise le mouvement lancé par l'Update isMoveFinished = false; //Le bool retournera false tant que le mouvement n'est pas fini //SFX enemy move MusicManager.Instance.PlayEnemyMoving(); }