using Assets.MyGame.Scripts.Net; using Assets.MyGame.Scripts.Net.WebResponses; using System; using System.Collections; using System.Collections.Generic; using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.Rendering.Universal; using UnityEngine.UI; public enum GameType { JQQD = 0, defaultPanel =999, FLZY = 1, YYSC = 2, ZGXQ = 3, XJMH = 4, HHWK = 5, } public class UIHome_BY_SelectRoomLevelPanel : SubUIBase { [Header("DefaultGame")] [Header("快速进入")] public Button SelectRoom1; public Button SelectRoom2; public Button SelectRoom3; [Header("手动选择")] public Button MySelectRoom1; public Button MySelectRoom2; public Button MySelectRoom3; public GameObject ui_Default; SelectGameLeave_DefaultUIItem currUIDefault; public UIHome_BY_MySelectRoomPanel panel_UIHome_BY_MySelectRoomPenel; public GameType currGameType; public int leave = 1; public bool isMySelectRoom=false; public List subCameras; [Header("提示")] public GameObject tiShi; public TextMeshProUGUI tmpText_Label; public Button btn_CloseTiShi; public Button btn_QuXiao; public Button btn_ChongZhi; private Vector3 _tiShiStandardSize; /// 检查当前用户是否有手动选座权限 private bool CanSelectRoom() { var limit = GameManager.Instance?.gameConfig?.fishRoomConfig?.seatSelectLimit; if (limit == null || limit.Count == 0) return true; // 没配限制,默认允许 // 用户身份:vipLevel > 0 → 1(VIP),否则 3(普通) int userType = GameManager.Instance.user.assets.vipLevel > 0 ? 1 : 3; return limit.Contains(userType); } public override void Awake() { base.Awake(); //foreach (var item in subCameras) //{ // UniversalAdditionalCameraData mainCameraData = GameManager.Instance.ZhuCam.GetUniversalAdditionalCameraData(); // //mainCameraData.renderType = CameraRenderType.Overlay; // mainCameraData.cameraStack.Add(item); //} WebSocketManager.Instance.Connect(SocketType.room); // 提示窗口:确认/关闭效果一致(关闭提示),充值跳转商城 if (tiShi != null) { tiShi.SetActive(false); _tiShiStandardSize = tiShi.transform.GetChild(0).localScale; } if (btn_CloseTiShi != null) btn_CloseTiShi.onClick.AddListener(HideTiShi); if (btn_QuXiao != null) btn_QuXiao.onClick.AddListener(HideTiShi); if (btn_ChongZhi != null) btn_ChongZhi.onClick.AddListener(() => { HideTiShi(); UIManager.Instance.Get(UIPanel.HomeMainPanel) .subUIManager.ShowAsync(UIPanel.ShopPanel, ShopTab.VipExp); }); } /// 显示提示窗口(弹窗出现动画) private void ShowTiShi(string msg) { if (tiShi == null) return; if (tmpText_Label != null) tmpText_Label.text = msg; tiShi.SetActive(true); var t = tiShi.transform.GetChild(0); t.localScale = Vector3.zero; t.DOKill(); t.DOScale(_tiShiStandardSize, 0.55f).SetEase(Ease.OutElastic, 0.7f, 0.35f); } /// 隐藏提示窗口(缩放消失动画) private void HideTiShi() { if (tiShi == null || !tiShi.activeSelf) return; var t = tiShi.transform.GetChild(0); t.DOKill(); t.DOScale(0, 0.3f).SetEase(Ease.InBack).onComplete += () => { if (tiShi != null) tiShi.SetActive(false); }; } public void OnSelectRoom(int leave) { if (isMySelectRoom) { // 手动选座:走原 WebSocket 流程(GetRoomList → MySelectRoomPanel 显示列表) WebSocketSendList.GetRoomListFish(leave, 1); } else { // ⭐ 快速加入:调 /api/Room/QuickJoin 拿 roomId + webSocketUrl → 连 socket → JoinRoom(-1) // leave: 1=初级场 / 2=中级场 / 3=高级场 (-1=全场次快速进入,暂未实现) int gameType = (int)GameManager.Instance.gameData.currGameType; APIRequestList.RoomQuickJoin(gameType, leave, (resp) => { if (resp == null || string.IsNullOrEmpty(resp.roomId)) { UIManager.Instance.ShowBoardError("快速加入失败,请稍后重试"); return; } // 用 QuickJoin 返回的 webSocketUrl 直接连接 game socket,然后 JoinRoom(-1) 让服务器分配座位 GameManager.Instance.StartGameQuickJoin(resp.webSocketUrl, () => { WebSocketSendList.JoinRoom(resp.roomId, GameManager.Instance.user.id, -1); }); }); } } /// 快速开始:按金币从高级场到低级场匹配,能进高级场就不进低级场,都不满足进初级场 private int GetQuickStartLeaveByGold() { long gold = GameManager.Instance.user.assets.gold; var roomConfigs = GameManager.Instance?.gameConfig?.roomConfigs; if (roomConfigs == null || roomConfigs.Count == 0) return 1; string gameTypeStr = ((int)currGameType).ToString(); for (int level = 3; level >= 2; level--) { var cfg = roomConfigs.Find(r => r.gameType.ToString() == gameTypeStr && r.roomLevel == level); if (cfg != null && (cfg.roomGoldLimit <= 0 || gold >= cfg.roomGoldLimit)) return level; } return 1; } public static void StartGame(RoomChangeResponse o) { Dictionary keyValuePairs = new Dictionary(); for (int i = 0; i < o.maxPlayerCount; i++) { keyValuePairs.Add(i, true); } foreach (var item in o.players) { keyValuePairs[item.position] = false; } foreach(var item in keyValuePairs) { if (item.Value) { GameManager.Instance.StartGame(() => { WebSocketSendList.JoinRoom(o.roomId, GameManager.Instance.user.id, item.Key); }); break; } } //这里写判断条件 } public AudioClip audioClipHHWK; public override void Show(object args = null) { base.Show(args); if (args != null && args is GameType) { currGameType = (GameType)args; GameManager.Instance.gameData.currGameType = currGameType; switch (currGameType) { case GameType.JQQD: break; case GameType.defaultPanel: break; case GameType.FLZY: AudioManager.Instance.ChangeBG(62025); break; case GameType.YYSC: break; case GameType.ZGXQ: break; case GameType.XJMH: AudioManager.Instance.ChangeBG(60001); break; case GameType.HHWK: AudioManager.Instance.ChangeBG(61001); AudioManager.Instance.ChangeBG(audioClipHHWK); break; default: break; } if (currGameType!= GameType.JQQD) { // ⭐ 预载该玩法的主游戏面板(纯 UI 资源、异步后台加载):选场页停留的几秒足够加载完, // 点场次进房时 ShowAsync 命中缓存直接秒开——"第一步只加载 UI,先把 UI 展示出来, // 显得加载快",其它资源(场景/鱼/音频)等 UI 出来后再加载 switch (currGameType) { case GameType.FLZY: UIManager.Instance.PreloadPanel(UIPanel.MainGamePanelFLZY); break; case GameType.YYSC: UIManager.Instance.PreloadPanel(UIPanel.MainGamePanelYYSC); break; case GameType.XJMH: UIManager.Instance.PreloadPanel(UIPanel.MainGamePanelXJMH); break; case GameType.HHWK: UIManager.Instance.PreloadPanel(UIPanel.MainGamePanelHHWK); break; } GameObject LV1 = SelectRoom1.transform.GetChild(((int)currGameType)).gameObject; LV1.SetActive(true); var Lv1Item = LV1.GetComponent(); if (Lv1Item.txt_VenueInfo != null) Lv1Item.txt_VenueInfo.text = "初级场"; MySelectRoom1 = Lv1Item.btn_SelectGameRoom; MySelectRoom1.onClick.RemoveAllListeners(); GameObject LV2 = SelectRoom2.transform.GetChild(((int)currGameType) ).gameObject; LV2.SetActive(true); var Lv2Item = LV2.GetComponent(); if (Lv2Item.txt_VenueInfo != null) Lv2Item.txt_VenueInfo.text = "中级场"; MySelectRoom2 = Lv2Item.btn_SelectGameRoom; MySelectRoom2.onClick.RemoveAllListeners(); GameObject LV3 = SelectRoom3.transform.GetChild(((int)currGameType)).gameObject; LV3.SetActive(true); var Lv3Item = LV3.GetComponent(); if (Lv3Item.txt_VenueInfo != null) Lv3Item.txt_VenueInfo.text = "高级场"; MySelectRoom3 = Lv3Item.btn_SelectGameRoom; // 入场条件:从 RoomConfig 读取 roomGoldLimit var gameConfig = GameManager.Instance?.gameConfig; var roomConfigs = gameConfig?.roomConfigs; if (roomConfigs != null && roomConfigs.Count > 0) { string gameTypeStr = ((int)currGameType).ToString(); var lv1Cfg = roomConfigs.Find(r => r.gameType.ToString() == gameTypeStr && r.roomLevel == 1); var lv2Cfg = roomConfigs.Find(r => r.gameType.ToString() == gameTypeStr && r.roomLevel == 2); var lv3Cfg = roomConfigs.Find(r => r.gameType.ToString() == gameTypeStr && r.roomLevel == 3); if (lv1Cfg != null && Lv1Item.txt_EntryCondition != null) Lv1Item.txt_EntryCondition.text = string.Format("入场: {0:N0} 金币", lv1Cfg.roomGoldLimit); if (lv2Cfg != null && Lv2Item.txt_EntryCondition != null) Lv2Item.txt_EntryCondition.text = string.Format("入场: {0:N0} 金币", lv2Cfg.roomGoldLimit); if (lv3Cfg != null && Lv3Item.txt_EntryCondition != null) Lv3Item.txt_EntryCondition.text = string.Format("入场: {0:N0} 金币", lv3Cfg.roomGoldLimit); } MySelectRoom1.onClick.AddListener(() => { if (!CanSelectRoom()) { ShowTiShi("手动选座需要充值VIP"); return; } isMySelectRoom = true; leave = 1; OnSelectRoom(leave); }); MySelectRoom2.onClick.AddListener(() => { if (!CanSelectRoom()) { ShowTiShi("手动选座需要充值VIP"); return; } isMySelectRoom = true; leave = 2; OnSelectRoom(leave); }); MySelectRoom3.onClick.AddListener(() => { if (!CanSelectRoom()) { ShowTiShi("手动选座需要充值VIP"); return; } isMySelectRoom = true; leave = 3; OnSelectRoom(leave); }); Lv1Item.btn_JoinGame.onClick.RemoveAllListeners(); Lv2Item.btn_JoinGame.onClick.RemoveAllListeners(); Lv3Item.btn_JoinGame.onClick.RemoveAllListeners(); Lv1Item.btn_JoinGame.onClick.AddListener(() => { //StartGame(currGameType); isMySelectRoom = false; leave = 1; OnSelectRoom(leave); }); Lv2Item.btn_JoinGame.onClick.AddListener(() => { isMySelectRoom = false; leave = 2; OnSelectRoom(leave); }); Lv3Item.btn_JoinGame.onClick.AddListener(() => { isMySelectRoom = false; leave = 3; OnSelectRoom(leave); }); currUIDefault = ui_Default.transform.GetChild(((int)currGameType)).GetComponent(); currUIDefault.gameObject.SetActive(true); btn_Close = currUIDefault.btn_FanHui; btn_Close.onClick.RemoveAllListeners(); btn_Close.onClick.AddListener(() => { uIManager.Hide(this); }); currUIDefault.btn_SheZhi.onClick.RemoveAllListeners(); currUIDefault.btn_SheZhi.onClick.AddListener(() => { UIManager.Instance.Get(UIPanel.HomeMainPanel).subUIManager.ShowAsync(UIPanel.SettingPanel); }); currUIDefault.btn_StartQuickly.onClick.RemoveAllListeners(); currUIDefault.btn_StartQuickly.onClick.AddListener(() => { isMySelectRoom = false; leave = GetQuickStartLeaveByGold(); OnSelectRoom(leave); }); currUIDefault.UpdateData(GameManager.Instance.user.BaseInfo.userName, GameManager.Instance.user.assets.gold.ToString(), GameManager.Instance.user.assets.diamond.ToString()); // 头像/头像框:初始加载 + 之后由事件自动刷新 GameManager.Instance.user.BaseInfo.UpdateAvatar((a) => { if (a != null) currUIDefault.sprite_Avatar.sprite = a; }); var frameSprite = GameManager.Instance.GetAvatarFrameSprite(GameManager.Instance.user.BaseInfo.avatarFrame); if (currUIDefault.sprite_AvatarFrame != null && frameSprite != null) currUIDefault.sprite_AvatarFrame.sprite = frameSprite; } } } public override void Hide() { base.Hide(); AudioManager.Instance.ChangeBG(69001); //img_BG.color = new Color(1,1,1,0); if (currGameType != GameType.JQQD) { SelectRoom1.transform.GetChild((int)currGameType).gameObject.SetActive(false); SelectRoom2.transform.GetChild((int)currGameType).gameObject.SetActive(false); SelectRoom3.transform.GetChild((int)currGameType).gameObject.SetActive(false); ui_Default.transform.GetChild((int)currGameType).gameObject.SetActive(false); currGameType = GameType.JQQD; } } }