using System; using System.Collections.Generic; using System.Threading.Tasks; using asap.core; using cfg; using DataCenter; using game; using GameCore; using TMPro; using UniRx; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Playables; using UnityEngine.Serialization; using UnityEngine.UI; public class OfferChainsRefreshEvent {} namespace OfferChainsChest { public class OfferChainsChestPanel : MonoBehaviour { private OfferChainsChestManager _offerChainsChestManager; private Timer _timer; private CompositeDisposable _disposable = new(); // 获得商品结束逻辑 private TaskCompletionSource _rewardGetTask; // private struct MyReward { public RewardItemNew RewardItem; public Transform RewardTrans; public Transform ChainTrans; public Transform Chest; // public int Status; } private List _rewardEntities; // 有效的数据,随机的时候从这里选 private List _validIds; private int _purchasedId; private int _purchasedIndex; // UI private TMP_Text _textTime; private TMP_Text _textTitle; private Button _btnBuyGreen; private TMP_Text _textBuyGreen; // private Button _btnClose; private Button _btnProbability; private Transform _reward; private CanvasGroup _canvasGroup; private Transform _rewardMain; private RewardItemNew _mainRewardItemNew; [Space] [Header("奖励组件")] public Transform[] rewardTransGroups; [Header("播放动画")] public string aniChestNml; public string aniChestLocked; public string aniChestUnlock; [Header("中间播放解锁动画")] public string aniChestChanged; [Header("解锁动画时长")] public float lotteryUnlockTime = 1.5f; [Header("抽将到最终奖的间隔")] public float unlockToFinalDelay = 1.0f; [Header("最终奖到弹出结算(播放中间箱子解锁的动画)")] public float finalTimeToPopup = 1.0f; [Header("—— 基础时长(秒) ——")] [Tooltip("总时长基础项:T = baseTime + perItemTime * n + 随机抖动")] public float baseTime = 0.80f; // 可调:0.72~0.90 [Tooltip("每个剩余格带来的时长增量")] public float perItemTime = 0.1f; // 可调:0.055~0.08 [Tooltip("时长随机抖动幅度(±)")] public float timeJitter = 0.12f; [Header("—— 步数估计 ——")] [Tooltip("期望步数:S_desired ≈ stepK * n + stepB ± stepRand")] public float stepK = 1.5f; // 可调:1.5~1.6 public int stepB = 8; // 可调:8~10 public int stepRandNeg = -2; // 随机下限 public int stepRandPos = +2; // 随机上限 [Header("—— 步间隔系数(相对 T/S)——")] [Tooltip("最短步间隔系数(dt_min = minFactor * (T/S))")] public float minFactor = 0.35f; // 原建议 0.35(更快);保守 0.5 [Tooltip("最长步间隔系数(dt_max = maxFactor * (T/S))")] public float maxFactor = 3.0f; // 原建议 2.10;保守 2.50 [Header("—— 安全下限(避免卡慢/频闪)——")] [Tooltip("大池子(n≥8)最短步间隔下限(秒)")] public float hardMinLargePool = 0.035f; // 35ms,保守 0.040 [Tooltip("双格(n=2)最短步间隔下限(秒)")] public float hardMinTwoPool = 0.075f; // 75ms,可 0.070~0.090 之间微调 [Header("—— 仪式感的最小整圈数 ——")] [Tooltip("n≥6 时的最小整圈数 L_min")] public int minLapsLarge = 2; // 2 圈 [Tooltip("3≤n≤5 时的最小整圈数 L_min")] public int minLapsMid = 1; // 1 圈 [Tooltip("n=2 时的最小整圈数 L_min(建议更高以打散可预测)")] public int minLapsTwo = 3; // 3 圈 [Header("—— 起步爆发与快段占比 ——")] [Tooltip("起步爆发的步数(前几步更快),0 关闭")] public int burstSteps = 2; [Tooltip("快段占比(0~1),剩余为减速段")] [Range(0.4f, 0.9f)] public float fastPhaseRatio = 0.70f; [Header("—— n=2 特化 ——")] [Tooltip("n=2:是否进行奇偶反制(避免可预测)")] public bool antiParityForTwo = true; [Tooltip("n=2:落点前是否微悬停(只加时间,不加步)")] public bool microPauseForTwo = true; [Tooltip("n=2:微悬停(秒)范围最小值")] public float microPauseTwoMin = 0.1f; [Tooltip("n=2:微悬停(秒)范围最大值")] public float microPauseTwoMax = 0.15f; private System.Random rng = new (); //是否再抽奖 private bool _isRunning = false; private int _currentIndex = -1; // 当前高亮的索引 private List _buyItems; private void Awake() { _offerChainsChestManager = GContext.container.Resolve(); // _canvasGroup = transform.Find("root").GetComponent(); // _btnClose = transform.Find("root/btn_close").GetComponent