using System.Collections.Generic; using DG.Tweening; using UnityEngine; public class TimeRushTaskCell : MonoBehaviour { [SerializeField] ButtonEx clickButton; [SerializeField] TextEx titleText; [SerializeField] ImageEx sliderImage; [SerializeField] ImageEx maskImage; [SerializeField] TextEx sliderText; [SerializeField] ItemCell[] itemCells; [SerializeField] ImageEx[] grays; [SerializeField] RectTransform[] tweenTargets; [SerializeField, Tooltip("单边摆动的基础耗时(秒)")] float timeMultiplier = 0.5f; [SerializeField, Tooltip("一轮摆动结束后的停顿秒数")] float pauseDuration = 0.2f; [SerializeField, Tooltip("左右摇摆的最大旋转角度")] float shakeAngle = 15f; [SerializeField] UIEffectPlayer uiEffectPlayer; int awardIndex; int roundType; int tabType; TimeRushManager manager { get { return TimeRushManager.Instance; } } public void Display(int index, CellView cell, List taskList) { roundType = cell.info.Value.infoInt1; tabType = cell.info.Value.infoInt2; if (taskList.IsNullOrEmpty() || index < 0 || index >= taskList.Count) return; var task = taskList[index]; awardIndex = task.AwardIndex; if (!manager.TryGetOperationInfo(out var act)) return; if (!act.TryGetRound(roundType, out var round)) return; if (!manager.TryGetPlayerInfo(roundType, out var playerInfo)) return; RefreshAnimations(); int state = manager.GetAwardState(roundType, awardIndex); maskImage.SetActive(state == 2); uiEffectPlayer.SetActive(state == 1); titleText.text = Language.Get($"TimeRushTaskTitle_{round.AwardType}_{round.AwardTypeValue}", task.NeedValue); sliderImage.fillAmount = playerInfo.CurValue / (float)task.NeedValue; sliderText.text = Language.Get("BoneField09", playerInfo.CurValue, task.NeedValue); for (int i = 0; i < itemCells.Length; i++) { var itemBaisc = itemCells[i]; if (i < task.AwardItemList.Length) { var itemInfo = task.AwardItemList[i]; itemBaisc.SetActive(true); grays[i].SetActive(state == 2); ItemCellModel cellModel = new ItemCellModel((int)itemInfo.ItemID, false, itemInfo.ItemCount); itemBaisc.Init(cellModel); itemBaisc.button.AddListener(() => { if (state == 1) { manager.HaveAllMissionAward(roundType); } else { ItemTipUtility.Show((int)itemInfo.ItemID); } }); } else { itemBaisc.SetActive(false); grays[i].SetActive(false); } } clickButton.SetListener(() => { if (state == 1) { manager.HaveAllMissionAward(roundType); } }); } private void OnEnable() { manager.PlayAnimationSync += OnPlaySyncAnimation; RefreshAnimations(); } private void OnDisable() { manager.PlayAnimationSync -= OnPlaySyncAnimation; StopAllTweens(); } private void OnPlaySyncAnimation() { if (tabType != 1) return; RefreshAnimations(); } // 统一处理动画的刷新和启动 private void RefreshAnimations() { StopAllTweens(); if (!manager.TryGetOperationInfo(out var act)) return; if (!act.TryGetRoundInfoByIndex(roundType, awardIndex, out var awardInfo, out int listIndex) || awardInfo.AwardItemList == null) return; int state = manager.GetAwardState(roundType, awardIndex); for (int i = 0; i < tweenTargets.Length; i++) { if (i < awardInfo.AwardItemList.Length && tweenTargets[i].gameObject.activeInHierarchy && state == 1) { PlayShakeAnimation(tweenTargets[i]); } } } // 安全停止所有动画并重置状态 private void StopAllTweens() { // 彻底清理 DOTween 状态并回正 for (int i = 0; i < tweenTargets.Length; i++) { if (tweenTargets[i] != null) { tweenTargets[i].DOKill(); tweenTargets[i].localEulerAngles = Vector3.zero; } } } private void PlayShakeAnimation(RectTransform target) { Sequence shakeSequence = DOTween.Sequence(); shakeSequence.Append(target.DOLocalRotate(new Vector3(0, 0, -shakeAngle), timeMultiplier * 1).SetEase(Ease.Linear)) .Append(target.DOLocalRotate(new Vector3(0, 0, shakeAngle), timeMultiplier * 2).SetEase(Ease.Linear)) .Append(target.DOLocalRotate(new Vector3(0, 0, -shakeAngle), timeMultiplier * 2).SetEase(Ease.Linear)) .Append(target.DOLocalRotate(Vector3.zero, timeMultiplier * 1).SetEase(Ease.Linear)) .AppendInterval(pauseDuration); // 添加停顿 shakeSequence.SetLoops(-1); shakeSequence.SetTarget(target); } }