lcy
4 天以前 fa401262d2ca2891aa9c88b9667f66aa1175736c
461 限时冲刺-客户端 修改可领取物品摇动动画
1个文件已修改
137 ■■■■■ 已修改文件
Main/System/TimeRush/TimeRushTaskCell.cs 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/TimeRush/TimeRushTaskCell.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
public class TimeRushTaskCell : MonoBehaviour
@@ -10,7 +11,18 @@
    [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;
@@ -18,76 +30,24 @@
    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);
@@ -133,4 +93,67 @@
        });
    }
    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);
    }
}