using System.Collections.Generic; using Cysharp.Threading.Tasks; using Game.Boss; using Game.Pathfinding; using Game.Player; using Game.RayCast; using Game.Room; using UnityEngine; using UnityEngine.SceneManagement; namespace Game.Dinosaurs { public class DinosaursGameManager : IDinosaursGameManager { // private bool isInit; private bool isPlaying; private bool isInBalance; private float currentTime = 0f; private float bossRefreshTime = 20f; private GameSceneMainUI sceneMainUI; private BFSManager _bfsManager; private MouseInputManager _mouseInputManager; private BossManager _bossManager; private PlayerManager _playerManager; private RoomManager _roomManager; private RobotManager _robotManager; public IBFSManager bfsManager => this._bfsManager; public IMouseInputManager mouseInputManager => this._mouseInputManager; public IBossManager bossManager => this._bossManager; public IPlayerManager playerManager => this._playerManager; public IRoomManager roomManager => this._roomManager; public IRobotManager robotManager => this._robotManager; public IPlayer currentPlayer => this._playerManager.currentPlayer; public IRoom room => this._roomManager.currentRoom; public DinosaursGameManager() { this._bfsManager = new BFSManager(); this._mouseInputManager = new MouseInputManager(); this._bossManager = new BossManager(this.bfsManager); this._playerManager = new PlayerManager(this.bfsManager); this._roomManager = new RoomManager(); this._robotManager = new RobotManager(this.bfsManager, this.roomManager); } public void Init() { this._bfsManager.Init(); this._mouseInputManager.Init(); this._bossManager.Init(); this._playerManager.Init(); this._roomManager.Init(); this._robotManager.Init(); } public void StartGame() { this.isInBalance = false; this.isPlaying = true; this.currentTime = 0; // this.LoadGameSceneAsync().Forget(); EventManager.Instance.Subscribe(InputObjectFinishEventArgs.EventId, InputObjectFinishEvent); sceneMainUI = Game.uiManager.GetUI(UIType.GameSceneMainUI); } #region StartGame async UniTask LoadGameSceneAsync() { await Game.resourceManager.LoadSceneAsync(AssetConstPath.Assets_GameRes_Scene_Game, LoadSceneMode.Additive); EventManager.Instance.FireNow(this, new LoadingGameSceneFinishEventArgs(true)); var player = this._playerManager.CreatePlayer(Game.currentPlayerData.name, Game.currentPlayerData.jinBei); this._playerManager.SetCurrentPlayer(player); EventManager.Instance.FireNow(this, new InitCurrentPlayerDataEventArgs(player)); player.self.transform.position = new Vector3(-9.6f, -10.3f); Game.uiManager.ShowUI(UIType.GameSceneMainUI); await this.CreateRoomAsync(); } async UniTask CreateRoomAsync() { var room = this._roomManager.CreateRoom(RoomType.出生点, AssetConstPath.Assets_GameRes_Prefabs_Room_出生点); this._roomManager.CreateRoom(RoomType.伏龙阁, AssetConstPath.Assets_GameRes_Prefabs_Room_伏龙阁); this._roomManager.CreateRoom(RoomType.杂物室, AssetConstPath.Assets_GameRes_Prefabs_Room_杂物室); this._roomManager.CreateRoom(RoomType.训练堂, AssetConstPath.Assets_GameRes_Prefabs_Room_训练堂); this._roomManager.CreateRoom(RoomType.先祖大厅, AssetConstPath.Assets_GameRes_Prefabs_Room_先祖大厅); this._roomManager.CreateRoom(RoomType.圣龙残骸, AssetConstPath.Assets_GameRes_Prefabs_Room_圣龙残骸); this._roomManager.CreateRoom(RoomType.天池遗址, AssetConstPath.Assets_GameRes_Prefabs_Room_天池遗址); this._roomManager.CreateRoom(RoomType.沙慕龙阁, AssetConstPath.Assets_GameRes_Prefabs_Room_沙慕龙阁); this._roomManager.CreateRoom(RoomType.英雄圣殿, AssetConstPath.Assets_GameRes_Prefabs_Room_英雄圣殿); var player = this._playerManager.currentPlayer; await player.WaitMoveRoomAsync(room, default); this.CreateOtherPlayer(); // Game.procedureManager.ChangeProcedure(ProcedureType.GameSceneLogicProcedure); } void CreateOtherPlayer() { } #endregion public void UpdateGame(float time) { this._bfsManager.Update(time); this._mouseInputManager.Update(time); this._bossManager.Update(time); this._playerManager.Update(time); this._roomManager.Update(time); this._robotManager.Update(time); if (this.isInBalance || !isPlaying) return; WaitTimeGoNext(); } void WaitTimeGoNext() { this.currentTime += Time.deltaTime; string content = $"({(int)(this.bossRefreshTime - currentTime)}) 恐龙即将出现!"; sceneMainUI.UpdateMessage(content); if (this.currentTime >= this.bossRefreshTime) { this.WaitBalance().Forget(); return; // Game.procedureManager.ChangeProcedure(ProcedureType.GameSceneKillPlayerProcedure); } } async UniTask WaitBalance() { this.isInBalance = true; string content = $"恐龙出没!"; sceneMainUI.UpdateMessage(content); var roomData = this._roomManager.GetAllRandomRoom(); await this._bossManager.MoveToKillPlayerAsync(roomData.killRoom, default); this._bossManager.DeleteBoss(); float jinBei = 0; foreach (var room in roomData.killRoom) { jinBei += room.roomData.jinBeiCount; } Debug.Log($"杀掉了随机房间玩家,金贝数量总和为:{jinBei}"); List players = new List(); foreach (var room in roomData.survivorRoom) { foreach (var roomPlayer in room.players) { Debug.Log($"幸存者:{roomPlayer.playerName}"); players.Add(roomPlayer); } } float roleJinBei = 0; if (players.Count > 0) roleJinBei = jinBei / players.Count; // Debug.Log($"胜利总金贝: is {jinBei}"); // EventManager.Instance.FireNow(this, new JinBeiSettlementEventArgs(players, jinBei)); CentsJinBei(players, roleJinBei); var resultUI = Game.uiManager.GetUI(UIType.GameSceneResultUI); if (players.Contains(this._playerManager.currentPlayer)) resultUI.SetResult($"恭喜你躲避成功,胜利总金贝:{jinBei},你得到的金贝:{roleJinBei}", true); else resultUI.SetResult($"躲避失败,胜利总金贝:{jinBei},你得到的金贝:0", false); //TODO: UniTask.Create(async () => { await this._roomManager.QuitAllRoomAsync(default); }); this.currentTime = 0; this.isInBalance = false; await this.WaitShowResultAsync(); } async UniTask WaitShowResultAsync() { var showUI = Game.uiManager.ShowUI(UIType.GameSceneResultUI); var resultUI = showUI as GameSceneResultUI; await resultUI.WaitShowAndCloseResultAsync(default); Game.uiManager.CloseLast(); // this._robotManager.EndOfTurnAuto(); } void CentsJinBei(List players, float f) { foreach (var player in players) { EventManager.Instance.FireNow(this, new PlayerJinBeiChange_VictoryEventArgs(player, f)); } } public void PauseGame() { this.isPlaying = false; this._bfsManager.Pause(); this._mouseInputManager.Pause(); this._bossManager.Pause(); this._playerManager.Pause(); this._roomManager.Pause(); this._robotManager.Pause(); } public void ResumeGame() { this.isPlaying = true; this._bfsManager.Resume(); this._mouseInputManager.Resume(); this._bossManager.Resume(); this._playerManager.Resume(); this._roomManager.Resume(); this._robotManager.Resume(); } public void StopGame() { this._mouseInputManager.Dispose(); this._bossManager.Dispose(); this._playerManager.Dispose(); this._roomManager.Dispose(); this._robotManager.Dispose(); } public void Dispose() { EventManager.Instance.Unsubscribe(InputObjectFinishEventArgs.EventId, InputObjectFinishEvent); this._bfsManager.Dispose(); this._mouseInputManager.Dispose(); this._bossManager.Dispose(); this._playerManager.Dispose(); this._roomManager.Dispose(); this._robotManager.Dispose(); this._bfsManager = null; this._mouseInputManager = null; this._bossManager = null; this._playerManager = null; this._roomManager = null; this._robotManager = null; } private void InputObjectFinishEvent(object sender, GameEventArgs e) { if (this._playerManager.currentPlayer.isMoving) { Debug.Log("Player is moveing"); return; } if (this.isInBalance) { Debug.Log("in balanceing !"); return; } if (!this.isPlaying) { Debug.Log("the game is paused !"); return; } var args = e as InputObjectFinishEventArgs; var inputData = args.data as MouseInputData; var roomInfo = inputData.go.GetComponent(); this._roomManager.SetCurrentRoom(roomInfo.roomType); UniTask.Create(async () => { await this._roomManager.JoinRoomAsync(roomInfo.roomType, this._playerManager.currentPlayer, default); }); } } }