//header // Disco Party 活动 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using asap.core; using DataCenter; using game; using GameCore; using Spine.Unity; using TMPro; using UniRx; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Playables; using UnityEngine.UI; public class OfferDiscoPartyRefreshEvent { } namespace UI.OfferDiscoParty { internal struct DiscoPartyReward { public RewardItemNew RewardItem; public Transform RewardTrans; // public Transform ChainTrans; // public Transform Chest; // public int Status; } public class OfferDiscoPartyPanel : BasePanel { // 管理 private OfferDiscoPartyManager _manager; private readonly PlayerItemData _playerItemData = GContext.container.Resolve(); // private Timer _timer; private List _rewardEntities; private List _validIds; private int _purchasedId; private int _purchasedIndex; private bool _isRunning = false; private int _currentIndex = -1; // 当前高亮的索引 private List _buyItems; private TaskCompletionSource _rewardGetTask; // 谷歌动画 private SkeletonGraphic _djSkeletonGraphic; // skeletonGraphic.AnimationState.SetAnimation(0, "Idle01", true); #region UIElement private TMP_Text _textTime; // private Button _btnDance; private Transform _btnDanceTrans; private Transform _btnDanceGrayTrans; private Button _btnDanceGray; private Button _btnBuyGreen; private Transform _btnBuyTrans; private CanvasGroup _canvasGroup; // private TMP_Text _btnBuyTextInfo; private TMP_Text _btnBuyGreenPText; private Transform _done; private Button _btnProbability; // 特效 private Transform _fxUIDiscoBgLight; // DONOthing private Transform _fxUIDiscoDjPlay; private Transform _fxUIDiscoDjSelected; private Transform _fxUIDiscoDjPlayKeyboard; private Transform _fxUIDiscoBallLight; #endregion #region 运动参数 [Space] [Header("奖励组件")] public Transform[] rewardTransGroups; [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 microPauseForTwo = true; [Tooltip("n=2:微悬停(秒)范围最小值")] public float microPauseTwoMin = 0.1f; [Tooltip("n=2:微悬停(秒)范围最大值")] public float microPauseTwoMax = 0.15f; private System.Random rng = new(); #endregion #region 生命周期 private void Awake() { _manager = GContext.container.Resolve(); _canvasGroup = transform.Find("root").GetComponent(); _textTime = transform.Find("root/text_time").GetComponent(); _btnBuyTrans = transform.Find("root/btn_buy"); _done = transform.Find("root/done"); _btnBuyGreen = transform.Find("root/btn_buy/btn_green").GetComponent