using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Activity; using asap.core; using Capsule.Pack.Manager; using Capsule.Reward; using DG.Tweening; using game; using Game; using GameCore; using Newtonsoft.Json.Linq; using TimeManager; using TMPro; using UniRx; using UnityEngine; using UnityEngine.Playables; using UnityEngine.UI; using Random = UnityEngine.Random; namespace Capsule.Pack.UIPanel { public class CapsulePackPanel : BasePanel { #region public private CapsulePackManager _manager; private CapsulePackManager Manager => _manager ??= ActivityResolver.Resolve(); private CapsulePackData Data => Manager?.LoadData(); public void SetData(CapsulePackManager manager) { _manager = manager; } #endregion #region UI_ELEMENTS private CapsuleRewardCell[] _rewardItems; private TextMeshProUGUI _textTime; private Button btn_buy; private Button btn_probability; private Button btn_close; private TextMeshProUGUI p_text; private RewardFlyBatchController RewardFlyBatchCtrl; private PlayableDirector _panelDirector; private Transform _knobAni; private CapsuleRewardCell _dropReward; #endregion UI_ELEMENTS #region SerializeField [Header("UI")][SerializeField] private PlayableAsset showFirstTimeline; [SerializeField] private PlayableAsset showTimeline; [SerializeField] private PlayableAsset outTimeline; [SerializeField][Min(0)] private float knobAniTime = 0.3f; [SerializeField] [Min(0)] [Tooltip("等待多久播放小球进场动画")] private float showFirstDelayTime = 0.3f; [SerializeField] [Min(0)] [Tooltip("小球入场的间隔时间")] private float capsuleShowTime = 0.05f; [SerializeField] [Min(0)] [Tooltip("奖励界面显示时间")] private float showRewardPanelTime = 0.05f; [SerializeField] [Min(0)] [Tooltip("等待小球掉落然后播回正动画")] private float delayRevertDropTime = 0.5f; [SerializeField] [Min(0)] [Tooltip("等待多长时间开始回正旋钮(由于奖励界面打开比较慢)")] private float delayRevertKnobTime = 0.5f; [Header("capsule rotation effect ")] [SerializeField] private float force; [SerializeField] private Vector2 forceCenter; [SerializeField] private ForceMode2D forceMode = ForceMode2D.Impulse; [SerializeField] private float rotationAngle = 0.5f; [SerializeField] private float gravityInRotation = 10f; [SerializeField] private float gravityOnEnd = 100f; [SerializeField] private Vector2 sizeInRotation = new Vector2(150f, 150f); [SerializeField] private Vector2 sizeOnEnd = new Vector2(175f, 175f); [SerializeField] [Tooltip("小球回正花费的时间")] private float revertZeroMinTime = 0.1f; [SerializeField] [Tooltip("小球回正花费的时间")] private float revertZeroMaxTime = 0.1f; [SerializeField] [Tooltip("小球速度小于多少播回正动画")] private float speedThreshold = 0.1f; [Header("capsule timeline effect ")] [SerializeField] private PlayableAsset rewardTimeline; [SerializeField] private PlayableAsset rewardLastTimeline; [SerializeField] [Tooltip("delay Play reward Timeline Time rewardDelayTime+rotationTime的时间是总的旋转时间")] private float rewardDelayTime = 0.2f; [SerializeField] [Tooltip("remain rotation time rewardDelayTime+rotationTime的时间是总的旋转时间")] private float rotationTime = 0.2f; [SerializeField] [Tooltip("delay Play reward Timeline Time On last rewardDelayTime+rotationTime的时间是总的旋转时间")] private float lastRewardDelayTime = 0.2f; [SerializeField] [Tooltip("remain rotation time On last rewardDelayTime+rotationTime的时间是总的旋转时间")] private float lastRotationTime = 0.2f; #endregion private bool _isRotating = false; private bool _isEnterAniPlaying = false; private bool _isRoundCompleted = false; private CancellationTokenSource _enterAniCancellationTokenSource; private HashSet _rotationCells = new HashSet(); private ITimeTickService _tickService; private void Awake() { _tickService = GContext.container.Resolve(); _textTime = gameObject.FindChildGameObject("text_time").GetComponent(); _rewardItems = gameObject.FindChildGameObject("rewardContainer") .GetComponentsInChildren(); btn_buy = gameObject.FindChildGameObject(nameof(btn_buy)).GetComponentInChildren