using System; using System.Collections.Generic; using System.Linq; using DG.Tweening; using FairyGUI; using FGUI.LG_secretAlbums; using SGModule.Common.Helper; using SGModule.NetKit; using UnityEngine; namespace BallKingdomCrush { public class SecretAlbumsNextUI : BaseUI { private SecretAlbumsNextUICtrl ctrl; private SecretAlbumsNextModel model; private FGUI.LG_secretAlbums.com_scAlbumPreview ui; public SecretAlbumsNextUI(SecretAlbumsNextUICtrl ctrl) : base(ctrl) { uiName = UIConst.SecretAlbumsNextUI; this.ctrl = ctrl; } protected override void SetUIInfo(UIInfo uiInfo) { uiInfo.packageName = "LG_secretAlbums"; uiInfo.assetName = "com_scAlbumPreview"; uiInfo.layerType = UILayerType.Popup; uiInfo.isNeedOpenAnim = false; uiInfo.isNeedCloseAnim = false; uiInfo.isNeedUIMask = true; } #region 生命周期 protected override void OnInit() { //model = ModuleManager.Instance.GetModel(ModelConst.SecretAlbumsModel) as SecretAlbumsModel; } protected override void OnClose() { HallManager.Instance.UpdateSecondEvent -= UpWatchAdsBtn; // 清理 Loader 的材质和贴图 foreach (var loader in loader_list) { if (loader == null || loader.isDisposed) continue; // 释放材质到材质池 if (loader.material != null) { TextureHelper.CancelImageBlur(loader); // 自动返回材质池 loader.material = null; } // 清理 NTexture if (loader.texture != null) { if (loader.texture.destroyMethod == DestroyMethod.Destroy) loader.texture.Dispose(); // 销毁 NTexture 对象 loader.texture = null; } } loader_list.Clear(); // 强制卸载未使用的资源 // Resources.UnloadUnusedAssets(); } protected override void OnBind() { ui = baseUI as FGUI.LG_secretAlbums.com_scAlbumPreview; } private AlbumPreviewData _albumPreviewData; protected override void OnOpenBefore(object args) { if (args == null) return; _albumPreviewData = (AlbumPreviewData)args; InitView(); var event_names = ADEventTrack.Property.secret_albums_show + (_albumPreviewData.Index + 1); var event_type = _albumPreviewData.PayType == (int)UnlockPayType.Ad ? ADEventTrack.AD_Event : ADEventTrack.MaxPayEvent; TrackKit.SendEvent(event_type, event_names); } protected override void OnOpen(object args) { } protected override void OnHide() { } protected override void OnDisplay(object args) { } #endregion #region 消息 protected override void AddListener() { GameDispatcher.Instance.AddListener(GameMsg.IAP_PAY_SUCCESS, pay_success); GameDispatcher.Instance.AddListener(GameMsg.BuyVip, InitView); } protected override void RemoveListener() { GameDispatcher.Instance.RemoveListener(GameMsg.IAP_PAY_SUCCESS, pay_success); GameDispatcher.Instance.RemoveListener(GameMsg.BuyVip, InitView); } #endregion void pay_success(object str) { string type = (string)str; string purch_number = ""; if (type.StartsWith("secret_albnums")) { int startIndex = "secret_albnums".Length; string suffix = type[startIndex..]; // 截取 "gold" 后的所有字符 int suffix_num = int.Parse(suffix); Log.Info("Secret_pay_success", $"index================:{suffix_num}"); // 判断是否已存在,避免重复添加 if (!DataMgr.SecretUnlockList.Value.Contains(suffix_num)) { DataMgr.SecretUnlockList.Value.Add(suffix_num); DataMgr.SecretUnlockList.Save(); GameDispatcher.Instance.Dispatch(GameMsg.UnlockSecretSuccess); } GameHelper.ShowTips("purchase_succ", true); InitView(); } } private List _secretData; private bool is_unlock = false; //当前专辑是否解锁 private List loader_list = new List(); //初始化页面逻辑 private void InitView(object a = null) { // 先清理上一次的 loader 和任务 foreach (var l in loader_list) { if (l != null && !l.isDisposed) { TextureHelper.CancelImageBlur(l); // 放回材质池 if (l.texture != null) { l.texture.Dispose(); l.texture = null; } if (l.material != null) l.material = null; } } loader_list.Clear(); _tasks.Clear(); //专辑解锁状态 is_unlock = DataMgr.SecretUnlockList.Value.Contains(_albumPreviewData.Index); UpWatchAdsBtn(); // if (_albumPreviewData.PayType == (int)UnlockPayType.Ad && // DataMgr.SecretUnlockCd.Value.TryGetValue(_albumPreviewData.Index, out var unlockCdValue) && // unlockCdValue > 0) // { // } HallManager.Instance.UpdateSecondEvent += UpWatchAdsBtn; ui.btn_close.SetClick(CtrlCloseUI); // ui.text_original_price.text = _albumPreviewData.Price.ToString(); ui.old_price.text = GameHelper.getPrice((decimal)_albumPreviewData.Price); ui.btn_pay.title = GameHelper.getPrice((decimal)_albumPreviewData.DiscountPrice); _secretData = SplitStringToList(_albumPreviewData.Name2); ui.list.itemRenderer = ItemRender; ui.list.numItems = _secretData.Count; ui.pay_type.selectedIndex = !is_unlock ? _albumPreviewData.PayType : (int)UnlockPayType.None; if (is_unlock) { ui.pay_type.selectedIndex = (int)UnlockPayType.None; } else { if (_albumPreviewData.SubscribeUnlock == 1) { ui.vip.selectedIndex = 1; if (GameHelper.GetVipLevel() >= 1) { ui.has_vip.selectedIndex = 1; } else { ui.has_vip.selectedIndex = 0; } } else { ui.vip.selectedIndex = 0; } ui.pay_type.selectedIndex = _albumPreviewData.PayType; } var _type = "secret_albnums" + _albumPreviewData.Index; ui.btn_pay.SetClick(() => { ApplePayClass maxPayData = new ApplePayClass { amount = (int)Math.Round(_albumPreviewData.DiscountPrice * 100), sku = _type, currency = "USD" }; MaxPayManager.Instance.Buy(maxPayData); }); ui.btn_gold.title = _albumPreviewData.GoldCoins.ToString(); ui.btn_gold.SetClick(() => { if (GameHelper.Get101() >= _albumPreviewData.GoldCoins) { GameHelper.AddGold(-_albumPreviewData.GoldCoins); GameDispatcher.Instance.Dispatch(GameMsg.IAP_PAY_SUCCESS, _type); string eventName = ADEventTrack.Property.secret_albums_success_ + (_albumPreviewData.Index + 1); TrackKit.SendEvent(ADEventTrack.SecretAlbums, eventName); GameDispatcher.Instance.Dispatch(GameMsg.Update101); TrackKit.SendEvent(ADEventTrack.Coinsbuy, ADEventTrack.Property.unlock_secretAlbums_resources); } else { GameHelper.ShowTips("no_enough_gold", true); uiCtrlDispatcher.Dispatch(UICtrlMsg.BuygoldUI_Open); } }); var AdCount = DataMgr.SecretUnlockADs.Value.GetValueOrDefault(_albumPreviewData.Index, 0); ui.btn_watch.ads.SetVar("ads", AdCount + "/" + _albumPreviewData.AD).FlushVars(); ui.btn_watch.SetClick(() => { if (AdCount >= _albumPreviewData.AD) { GameDispatcher.Instance.Dispatch(GameMsg.IAP_PAY_SUCCESS, _type); } else { GameHelper.ShowVideoAd("UnlockSecretAlbums", (isSuccess) => { if (isSuccess) { var adTimes = Convert.ToInt32(GameHelper.GetNowTime()); DataMgr.SecretUnlockCd.Value[_albumPreviewData.Index] = adTimes + _albumPreviewData.CD; DataMgr.SecretUnlockCd.Save(); var currentAdCount = DataMgr.SecretUnlockADs.Value.GetValueOrDefault(_albumPreviewData.Index, 0); DataMgr.SecretUnlockADs.Value[_albumPreviewData.Index] = currentAdCount + 1; DataMgr.SecretUnlockADs.Save(); string eventName = ADEventTrack.Property.secret_albums_success_ + (_albumPreviewData.Index + 1); TrackKit.SendEvent(ADEventTrack.AD_Event, eventName); InitView(); } }); } }); ui.btn_vip.SetClick(() => { TrackKit.SendEvent(ADEventTrack.SecretAlbums, ADEventTrack.Property.secret_albums_click_ + (_albumPreviewData.Index + 1)); if (GameHelper.GetVipLevel() >= 1) { GameHelper.isVipUnlock = true; GameDispatcher.Instance.Dispatch(GameMsg.IAP_PAY_SUCCESS, _type); string eventName = ADEventTrack.Property.vip_secret_albums_unclock_ + (_albumPreviewData.Index + 1); TrackKit.SendEvent(ADEventTrack.VipSecretAlbums, eventName); } else { uiCtrlDispatcher.Dispatch(UICtrlMsg.VipClubViewUI_Open, 2); TrackKit.SendEvent(ADEventTrack.VipSecretAlbums, ADEventTrack.Property.vip_secret_albums_unclock); } }); } private List<(GLoader loader, string fileName, Action callback, string folder, string localFolder)> _tasks = new(); private void ItemRender(int index, GObject obj) { var item = (item_scAlbumPreview)obj; var picture = (GLoader)item.com_pic_in.GetChild("picture"); if (!loader_list.Contains(picture)) loader_list.Add(picture); var state = GetSafe(_albumPreviewData.State, index); item.state.selectedIndex = is_unlock ? 0 : state; var task = (picture, _secretData[index], (Action)(s => { if (picture != null && !picture.isDisposed) { if (!is_unlock && state == 1) TextureHelper.SetImageBlur(picture); else TextureHelper.CancelImageBlur(picture); } }), $"SecretAlbums/{_albumPreviewData.Name}/", FolderNames.SecretName); _tasks.Add(task); item.btn_detail.SetClick(() => { if (is_unlock) { var data = new DetailData { Name = _secretData[index], Name1 = $"SecretAlbums/{_albumPreviewData.Name}/" }; UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.SecretDetailUI_Open, data); } else { GameHelper.ShowTips("not_unlocked", true); } }); if (index == _secretData.Count - 1) { TextureHelper.SetImgLoaders(_tasks); } } private void UpWatchAdsBtn() { DataMgr.SecretUnlockCd.Value.TryGetValue(_albumPreviewData.Index, out var lastTimes); if (DataMgr.SecretUnlockADs.Value.TryGetValue(_albumPreviewData.Index, out var unlockAdValue) && unlockAdValue >= _albumPreviewData.AD) { ui.btn_watch.can_buy.selectedIndex = 1; } else { ui.btn_watch.can_buy.selectedIndex = 0; if (GameHelper.GetNowTime() < lastTimes) { ui.btn_watch.enabled = false; ui.btn_watch.CD.selectedIndex = 1; ui.btn_watch.watch_cd.text = CommonHelper.TimeFormat(lastTimes - Convert.ToInt32(GameHelper.GetNowTime()), CountDownType.Hour); } else { ui.btn_watch.enabled = true; ui.btn_watch.CD.selectedIndex = 0; } } } // 拆分字符串为列表 public static List SplitStringToList(string input) { if (string.IsNullOrWhiteSpace(input)) return new List(); // 支持英文逗号, 中文逗号,空格 char[] separators = new char[] { ',', ',', ' ' }; return input .Split(separators, StringSplitOptions.RemoveEmptyEntries) .Select(s => s.Trim()) // 去掉前后空白 .ToList(); } /// /// 安全获取列表或数组中的元素,如果越界则返回最后一个元素;如果为空则返回默认值。 /// public static T GetSafe(IList list, int index, T defaultValue = default) { if (list == null || list.Count == 0) return defaultValue; if (index < 0) return list[0]; if (index >= list.Count) return list[list.Count - 1]; return list[index]; } } public class DetailData { public string Name; public string Name1; } }