using System.Collections.Generic; using System.Linq; using System.Threading; using Cysharp.Threading.Tasks; using Game.Player; using UnityEngine; namespace Game.Room; public interface IRoomManager { IRoom CreateRoom(RoomType roomType); IRoom GetRoom(RoomType roomType); List GetAllRoom(); UniTask JoinRoomAsync(RoomType roomType, IPlayer player, CancellationToken token); bool QuitRoom(RoomType roomType, IPlayer player); void DeleteRoom(RoomType roomType); } public class RoomManager : ManagerBase, IRoomManager { private Dictionary _rooms = new Dictionary(); public IRoom CreateRoom(RoomType roomType) { if (this._rooms.TryGetValue(roomType, out var room)) return room; var gameObject = Game.resourceManager.LoadGameObjectSync(roomType.ToString()); room = new Room(roomType, gameObject); this._rooms.Add(roomType, room); return room; } public IRoom GetRoom(RoomType roomType) { return this._rooms.GetValueOrDefault(roomType); } public List GetAllRoom() { return this._rooms.Values.ToList(); } public async UniTask JoinRoomAsync(RoomType roomType, IPlayer player, CancellationToken token) { if (!player.isMoving) return false; foreach (IRoom roomsValue in this._rooms.Values) { var roomInfo = roomsValue.roomInfo; roomInfo.SetSelect(false); } if (this._rooms.TryGetValue(roomType, out var room)) { room.roomInfo.SetSelect(true); await room.JoinAsync(player, token); return true; } return false; } public bool QuitRoom(RoomType roomType, IPlayer player) { if (this._rooms.TryGetValue(roomType, out var room)) { room.Quit(player); return true; } return false; } public void DeleteRoom(RoomType roomType) { if (this._rooms.TryGetValue(roomType, out var room)) room.Dispose(); } }