Main/Config/Configs/TimingGiftConfig.cs
@@ -1,6 +1,6 @@ //-------------------------------------------------------- // [Author]: YYL // [ Date ]: 2026年2月5日 // [ Date ]: 2026年2月7日 //-------------------------------------------------------- using System.Collections.Generic; @@ -20,6 +20,9 @@ public string GiftName; public int GiftType; public int[] CTGIDs; public int[] TopColor; public int[] BottomColor; public int[] OutlineColor; public override int LoadKey(string _key) { @@ -50,6 +53,48 @@ int.TryParse(CTGIDsStringArray[i],out CTGIDs[i]); } } if (tables[4].Contains("[")) { TopColor = JsonMapper.ToObject<int[]>(tables[4]); } else { string[] TopColorStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); TopColor = new int[TopColorStringArray.Length]; for (int i=0;i<TopColorStringArray.Length;i++) { int.TryParse(TopColorStringArray[i],out TopColor[i]); } } if (tables[5].Contains("[")) { BottomColor = JsonMapper.ToObject<int[]>(tables[5]); } else { string[] BottomColorStringArray = tables[5].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); BottomColor = new int[BottomColorStringArray.Length]; for (int i=0;i<BottomColorStringArray.Length;i++) { int.TryParse(BottomColorStringArray[i],out BottomColor[i]); } } if (tables[6].Contains("[")) { OutlineColor = JsonMapper.ToObject<int[]>(tables[6]); } else { string[] OutlineColorStringArray = tables[6].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); OutlineColor = new int[OutlineColorStringArray.Length]; for (int i=0;i<OutlineColorStringArray.Length;i++) { int.TryParse(OutlineColorStringArray[i],out OutlineColor[i]); } } } catch (Exception exception) { Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs
New file @@ -0,0 +1,22 @@ using UnityEngine; using System.Collections; // A1 31 前端自定义保存设置内容 #tagCSSettingData public class CA131_tagCSSettingData : GameNetPackBasic { public byte KeyNum; // 自定义key编号,后端使用数字key存储,前端自行进行转换定义,限制100个 public byte DataLen; public string SetData; //自定义保存的内容 public CA131_tagCSSettingData () { combineCmd = (ushort)0x03FE; _cmd = (ushort)0xA131; } public override void WriteToBytes () { WriteBytes (KeyNum, NetDataType.BYTE); WriteBytes (DataLen, NetDataType.BYTE); WriteBytes (SetData, NetDataType.Chars, DataLen); } } Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: f237c6f43939ca64894d301a44913fa7 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs
New file @@ -0,0 +1,12 @@ using UnityEngine; using System.Collections; // A1 31 前端自定义保存的设置内容信息 #tagSCSettingDataInfo public class DTCA131_tagSCSettingDataInfo : DtcBasic { public override void Done(GameNetPackBasic vNetPack) { base.Done(vNetPack); HA131_tagSCSettingDataInfo vNetData = vNetPack as HA131_tagSCSettingDataInfo; SettingDataManager.Instance.UpdateSettingData(vNetData); } } Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 0eed7575356cfc54f9665f3f7653c520 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -150,6 +150,7 @@ Register(typeof(HB163_tagSCBatPresetSwitchInfo), typeof(DTCB163_tagSCBatPresetSwitchInfo)); Register(typeof(HA001_tagBroadCastInfo), typeof(DTCA001_tagBroadCastInfo)); Register(typeof(HA519_tagSCTagFamilyInfo), typeof(DTCA519_tagSCTagFamilyInfo)); Register(typeof(HA131_tagSCSettingDataInfo), typeof(DTCA131_tagSCSettingDataInfo)); } //主工程注册封包 Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs
New file @@ -0,0 +1,31 @@ using UnityEngine; using System.Collections; // A1 31 前端自定义保存的设置内容信息 #tagSCSettingDataInfo public class HA131_tagSCSettingDataInfo : GameNetPackBasic { public ushort DataCnt; public tagSCSettingData[] SettingDataList; public HA131_tagSCSettingDataInfo () { _cmd = (ushort)0xA131; } public override void ReadFromBytes (byte[] vBytes) { TransBytes (out DataCnt, vBytes, NetDataType.WORD); SettingDataList = new tagSCSettingData[DataCnt]; for (int i = 0; i < DataCnt; i ++) { SettingDataList[i] = new tagSCSettingData(); TransBytes (out SettingDataList[i].KeyNum, vBytes, NetDataType.BYTE); TransBytes (out SettingDataList[i].DataLen, vBytes, NetDataType.BYTE); TransBytes (out SettingDataList[i].SetData, vBytes, NetDataType.Chars, SettingDataList[i].DataLen); } } public class tagSCSettingData { public byte KeyNum; // 自定义key编号,后端使用数字key存储,前端自行进行转换定义,限制100个 public byte DataLen; public string SetData; //自定义保存的内容 } } Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 19c12567a8e6d994b823f21885a07bc2 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Main.cs
@@ -105,6 +105,7 @@ managers.Add(FuncPresetManager.Instance); managers.Add(GMNotifyManager.Instance); managers.Add(TimingGiftManager.Instance); managers.Add(SettingDataManager.Instance); foreach (var manager in managers) { Main/System/TimingGift/SettingDataManager.cs
New file @@ -0,0 +1,75 @@ using System; using System.Collections.Generic; using UnityEngine; public class SettingDataManager : GameSystemManager<SettingDataManager> { public override void Init() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin; } public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin; } private void OnBeforePlayerDataInitializeEventOnRelogin() { settingDataDict.Clear(); } public event Action OnUpdateSettingDataEvent; Dictionary<int, string> settingDataDict = new Dictionary<int, string>(); public bool TryGetSettingData(int keyNum, out string setData) { return settingDataDict.TryGetValue(keyNum, out setData); } public Dictionary<int, string> GetSettingData() { return settingDataDict; } public void UpdateSettingData(HA131_tagSCSettingDataInfo pack) { if (pack == null || pack.SettingDataList.IsNullOrEmpty()) return; for (int i = 0; i < pack.SettingDataList.Length; i++) { var info = pack.SettingDataList[i]; settingDataDict[info.KeyNum] = info.SetData; } OnUpdateSettingDataEvent?.Invoke(); } public void ClearSettingData(int keyNum) { SendSettingData(keyNum, string.Empty); } public void SendSettingData(SettingDataKeyNum keyNum, string setData) { SendSettingData((int)keyNum, setData); } public void SendSettingData(int keyNum, string setData) { // 检查数据长度是否超过byte最大值 if (setData.Length > byte.MaxValue) { Debug.LogError($"设置数据长度({setData.Length})超过byte最大值({byte.MaxValue})"); return; } CA131_tagCSSettingData pack = new CA131_tagCSSettingData(); pack.KeyNum = (byte)keyNum; pack.SetData = setData; pack.DataLen = (byte)setData.Length; GameNetSystem.Instance.SendInfo(pack); } } public enum SettingDataKeyNum { TimingGiftType = 1, } Main/System/TimingGift/SettingDataManager.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 11efe5307ce944149977d11036bcd76a MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/TimingGift/TimingGiftCell.cs
@@ -106,7 +106,7 @@ { int times = manager.GetRemainingSecondsByType(type); time.text = times <= 0 ? Language.Get("TimingGift04") : TimeUtility.SecondsToHMS(times); time.colorType = times <= 0 ? TextColType.Red : TextColType.DarkGreen; time.colorType = times <= 0 ? TextColType.Red : TextColType.LightGreen; } } Main/System/TimingGift/TimingGiftCtgIdCell.cs
@@ -17,11 +17,15 @@ bool isChoose = manager.selectCtgIdIndex == index; tabIcon.SetSprite(isChoose ? "TimingGiftTab2_Select" : "TimingGiftTab2_UnSelect"); moneyText.colorType = isChoose ? TextColType.NavyBrown : TextColType.LightWhite; moneyButton.SetListener(() => { manager.selectCtgId = ctgId; if (!CTGConfig.HasKey(manager.selectCtgId)) return; CTGConfig ctgConfig = CTGConfig.Get(manager.selectCtgId); manager.selectGainItemList = ctgConfig.GainItemList; manager.selectCtgIdIndex = index; }); } } Main/System/TimingGift/TimingGiftManager.cs
@@ -54,10 +54,13 @@ GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; } private void OnBeforePlayerDataInitializeEventOnRelogin() { showGiftIdList.Clear(); lastTriggerTimeDict.Clear(); } private void OnPlayerLoginOk() @@ -68,6 +71,19 @@ private void OnSecondEvent() { RemoveExpired(); } public Color32 GetColor32(int[] colorArr) { if (colorArr == null || colorArr.Length < 3) return Color.white; return new Color32() { r = (byte)(colorArr.Length > 0 ? colorArr[0] : 0), g = (byte)(colorArr.Length > 1 ? colorArr[1] : 0), b = (byte)(colorArr.Length > 2 ? colorArr[2] : 0), a = (byte)(colorArr.Length > 3 ? colorArr[3] : 255), }; } public static bool TryGetTimingGiftTypeConfig(int giftType, out TimingGiftTypeConfig config) @@ -151,6 +167,18 @@ public void TryAdd(int type) { if (NewBieCenter.Instance.inGuiding) { #if UNITY_EDITOR if (isLogShow) { Debug.Log($"[TimingGift] TryPop:触发Return,正在引导中"); } #endif return; } if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.TimingGift)) { @@ -437,22 +465,22 @@ #endregion #region 数据保存 private string saveKey { get { return StringUtility.Concat("TimingGift_LastTriggerTimeDict_", PlayerDatas.Instance.PlayerId.ToString()); } } private void LoadData() { lastTriggerTimeDict.Clear(); // 使用 LocalSave 读取 JSON 字符串 string jsonStr = LocalSave.GetString(saveKey); if (string.IsNullOrEmpty(jsonStr) || jsonStr == "{}") if (!SettingDataManager.Instance.TryGetSettingData((int)SettingDataKeyNum.TimingGiftType, out string data)) return; Dictionary<int, int> loadDict = ConfigParse.ParseIntDict(jsonStr); // 使用 LocalSave 读取 JSON 字符串 if (string.IsNullOrEmpty(data) || data == "{}") return; Dictionary<int, int> loadDict = ConfigParse.ParseIntDict(data); if (loadDict == null) return; lastTriggerTimeDict = loadDict; InitCurrectTimingGiftIdList(new List<int>(loadDict.Keys)); #if UNITY_EDITOR if (isLogShow) { @@ -464,7 +492,7 @@ private void SaveData() { string jsonStr = JsonMapper.ToJson(lastTriggerTimeDict); LocalSave.SetString(saveKey, jsonStr); SettingDataManager.Instance.SendSettingData(SettingDataKeyNum.TimingGiftType, jsonStr); #if UNITY_EDITOR if (isLogShow) { Main/System/TimingGift/TimingGiftTabCell.cs
@@ -2,9 +2,12 @@ public class TimingGiftTabCell : MonoBehaviour { [SerializeField] Color selectColor; [SerializeField] Color unSelectColor; [SerializeField] TextEx tabNameText; [SerializeField] ButtonEx tabButton; [SerializeField] ImageEx tabIcon; [SerializeField] Transform line; TimingGiftManager manager { get { return TimingGiftManager.Instance; } } public void Display(int index) { @@ -14,12 +17,13 @@ int id = currectTimingGiftIdList[index]; if (!TimingGiftConfig.HasKey(id)) return; line.SetActive(currectTimingGiftIdList.Count > 1 && index < currectTimingGiftIdList.Count - 1); TimingGiftConfig config = TimingGiftConfig.Get(id); tabNameText.text = config.GiftName; bool isChoose = manager.selectTabIndex == index; tabIcon.SetSprite(isChoose ? "TimingGiftTab1_Select" : "TimingGiftTab1_UnSelect"); tabNameText.colorType = isChoose ? TextColType.NavyBrown : TextColType.LightWhite; tabIcon.SetNativeSize(); tabNameText.color = isChoose ? selectColor : unSelectColor; tabButton.SetListener(() => { manager.selectTabGiftId = id; Main/System/TimingGift/TimingGiftWin.cs
@@ -5,18 +5,24 @@ public class TimingGiftWin : UIBase { [SerializeField] ScrollerController tabScroller; [SerializeField] ScrollerController ctgIdScroller; [SerializeField] ScrollerController awardScroller; [SerializeField] TimingGiftCtgIdCell[] ctgIdCells; [SerializeField] TextEx timeText; [SerializeField] TextEx rateText; [SerializeField] ImageEx bgImage; [SerializeField] ImageEx IconImage; [SerializeField] TextEx giftNameText; [SerializeField] GradientText giftText; //"礼包" [SerializeField] OutlineEx giftTextOutline; [SerializeField] GradientText giftNameText; [SerializeField] TextEx rateText; [SerializeField] GradientText rateNameText; //充值返利 [SerializeField] ButtonEx buyButton; [SerializeField] ImageEx buyImage; [SerializeField] TextEx buyText; [SerializeField] ButtonEx leftButton; [SerializeField] ButtonEx rightButton; [SerializeField] ButtonEx closeButton; TimingGiftManager manager { get { return TimingGiftManager.Instance; } } int type; @@ -30,6 +36,7 @@ }); leftButton.SetListener(() => UpdateTabSelection(-1)); rightButton.SetListener(() => UpdateTabSelection(1)); closeButton.SetListener(CloseWindow); } protected override void OnPreOpen() @@ -42,7 +49,6 @@ } #endif tabScroller.OnRefreshCell += OnRefreshTabCell; ctgIdScroller.OnRefreshCell += OnRefreshCtgIdCell; awardScroller.OnRefreshCell += OnRefreshAwardCell; manager.OnSelectTabIndexChangeEvent += OnSelectTabIndexChangeEvent; manager.OnSelectCtgIdIndexChangeEvent += OnSelectCtgIdIndexChangeEvent; @@ -55,7 +61,6 @@ protected override void OnPreClose() { tabScroller.OnRefreshCell -= OnRefreshTabCell; ctgIdScroller.OnRefreshCell -= OnRefreshCtgIdCell; awardScroller.OnRefreshCell -= OnRefreshAwardCell; manager.OnSelectTabIndexChangeEvent -= OnSelectTabIndexChangeEvent; manager.OnSelectCtgIdIndexChangeEvent -= OnSelectCtgIdIndexChangeEvent; @@ -88,21 +93,21 @@ private void OnSelectTabIndexChangeEvent() { InitializeSelectedCtgConfig(manager.selectTabGiftId); InitializeSelectedCtgConfig(); tabScroller.m_Scorller.RefreshActiveCellViews(); CreateCtgIdScroller(); DisplayCtgIdCells(); CreateAwardScroller(); DisplayGift(); } private void OnSelectCtgIdIndexChangeEvent() { ctgIdScroller.m_Scorller.RefreshActiveCellViews(); DisplayCtgIdCells(); CreateAwardScroller(); DisplayGift(); } private void InitializeSelectedCtgConfig(int giftId) private void InitializeSelectedCtgConfig() { if (!TimingGiftConfig.TryGetTimingGiftConfig(manager.selectTabGiftId, out TimingGiftConfig config)) return; @@ -127,14 +132,14 @@ manager.selectTabIndex = realIndex; tabScroller.JumpIndex(manager.selectTabIndex); InitializeSelectedCtgConfig(manager.selectTabGiftId); InitializeSelectedCtgConfig(); } private void RefreshTime() { int times = manager.GetRemainingSeconds(manager.selectTabGiftId); timeText.text = times <= 0 ? Language.Get("TimingGift04") : Language.Get("TimingGift03", TimeUtility.SecondsToHMS(times)); timeText.colorType = times <= 0 ? TextColType.Red : TextColType.DarkGreen; timeText.colorType = times <= 0 ? TextColType.Red : TextColType.LightGreen; } private int FindTypeIndex(int type) @@ -157,12 +162,12 @@ int index = FindTypeIndex(type); manager.selectTabGiftId = manager.GetListValue(index, currectTimingGiftIdList); manager.selectTabIndex = index; InitializeSelectedCtgConfig(manager.selectTabGiftId); InitializeSelectedCtgConfig(); CreateTabScroller(); tabScroller.JumpIndex(manager.selectTabIndex); CreateCtgIdScroller(); DisplayCtgIdCells(); CreateAwardScroller(); DisplayGift(); } @@ -184,19 +189,6 @@ tabScroller.Restart(); } private void CreateCtgIdScroller() { ctgIdScroller.Refresh(); if (!manager.selectCtgIds.IsNullOrEmpty()) { for (int i = 0; i < manager.selectCtgIds.Length; i++) { ctgIdScroller.AddCell(ScrollerDataType.Header, i); } } ctgIdScroller.Restart(); } private void CreateAwardScroller() { awardScroller.Refresh(); @@ -209,7 +201,30 @@ } awardScroller.Restart(); } public void DisplayCtgIdCells() { if (manager.selectCtgIds.IsNullOrEmpty()) { for (int i = 0; i < ctgIdCells.Length; i++) { ctgIdCells[i].SetActive(false); } return; } for (int i = 0; i < ctgIdCells.Length; i++) { if (i < manager.selectCtgIds.Length) { ctgIdCells[i].SetActive(true); ctgIdCells[i].Display(i, manager.selectCtgIds); } else { ctgIdCells[i].SetActive(false); } } } private void DisplayGift() { if (!TimingGiftConfig.TryGetTimingGiftConfig(manager.selectTabGiftId, out TimingGiftConfig config)) @@ -225,12 +240,16 @@ bgImage.SetSprite($"TimingGiftBg_{manager.selectTabGiftId}"); IconImage.SetSprite($"TimingGiftIcon_{manager.selectTabGiftId}"); giftNameText.text = Language.Get("TimingGift01", config.GiftName); giftNameText.text = config.GiftName; rateText.text = Language.Get("TimingGift02", ctgConfig.Percentage); rateNameText.text = Language.Get("TimingGift05"); giftText.text = Language.Get("TimingGift01"); giftText.SetVerticalGradient(manager.GetColor32(config.TopColor), manager.GetColor32(config.BottomColor)); giftTextOutline.OutlineColor = manager.GetColor32(config.OutlineColor); bool isBuy = manager.IsBuy(manager.selectCtgId); buyText.text = !isBuy ? Language.Get("PayMoneyNum", orderInfoConfig.PayRMBNumOnSale) : Language.Get("storename11"); buyButton.interactable = !isBuy; buyText.text = !isBuy ? Language.Get("PayMoneyNum", orderInfoConfig.PayRMBNumOnSale) : Language.Get("L1133"); buyImage.SetSprite(isBuy ? "TimingGiftBuy" : "TimingGiftNoBuy"); buyImage.raycastTarget = !isBuy; RefreshTime(); } @@ -239,13 +258,6 @@ var _cell = cell.GetComponent<TimingGiftTabCell>(); _cell?.Display(cell.index); } private void OnRefreshCtgIdCell(ScrollerDataType type, CellView cell) { var _cell = cell.GetComponent<TimingGiftCtgIdCell>(); _cell?.Display(cell.index, manager.selectCtgIds); } private void OnRefreshAwardCell(ScrollerDataType type, CellView cell) { var _cell = cell.GetComponent<TimingGiftAwardCell>();