| | |
| | | using System.Collections.Generic; |
| | | using DG.Tweening; |
| | | using UnityEngine; |
| | | |
| | | public class TimeRushTaskCell : MonoBehaviour |
| | |
| | | [SerializeField] TextEx sliderText; |
| | | [SerializeField] ItemCell[] itemCells; |
| | | [SerializeField] ImageEx[] grays; |
| | | [SerializeField] RotationTween[] tweens; |
| | | |
| | | [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 tabType; |
| | | TimeRushManager manager { get { return TimeRushManager.Instance; } } |
| | | |
| | | private void OnEnable() |
| | | { |
| | | manager.PlayAnimationSync += OnPlaySyncAnimation; |
| | | for (int i = 0; i < tweens.Length; i++) |
| | | { |
| | | tweens[i].Stop(); |
| | | tweens[i].SetStartState(); |
| | | } |
| | | |
| | | 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 < tweens.Length; i++) |
| | | { |
| | | if (i < awardInfo.AwardItemList.Length) |
| | | { |
| | | if (state == 1) |
| | | { |
| | | tweens[i].Play(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | private void OnDisable() |
| | | { |
| | | manager.PlayAnimationSync -= OnPlaySyncAnimation; |
| | | } |
| | | |
| | | private void OnPlaySyncAnimation() |
| | | { |
| | | if (tabType != 1) |
| | | return; |
| | | for (int i = 0; i < tweens.Length; i++) |
| | | { |
| | | tweens[i].Stop(); |
| | | tweens[i].SetStartState(); |
| | | } |
| | | 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 < tweens.Length; i++) |
| | | { |
| | | if (tweens[i].isActiveAndEnabled && state == 1) |
| | | { |
| | | tweens[i].Play(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public void Display(int index, CellView cell, List<HAA88_tagMCActLunhuidianInfo.tagMCActLunhuidianAward> 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); |
| | |
| | | }); |
| | | } |
| | | |
| | | 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); |
| | | } |
| | | } |