using TMPro; using UnityEngine.UI; using UnityEngine; using asap.core; using UniRx; public class GeneralMultiplierButton : MonoBehaviour { [SerializeField] private Button btn; [SerializeField] private TMP_Text text; [SerializeField] private GameObject max = null; [SerializeField] private PinballUncountableMultiplierPopupView popupMultiplier; private IHasMultiplier _data; /// /// 获取当前倍率, 如果没有数据返回-1 /// public int Multiplier => _data.GetMultiplier(); private void Start() { btn.onClick.AddListener(OnClick); var manager = GContext.container.Resolve(); manager.EventAggregator.GetEvent() .Subscribe(_ => DetermineMax()) .AddTo(this); } private void OnDestroy() { btn.onClick.RemoveListener(OnClick); } /// /// 初始化 /// /// 满足条件的数据结构 public void Init(IHasMultiplier data) { _data = data; var multipliers = data.GetMultiplierArray(); var num = _data.GetMultiplier(); if (multipliers.Length <= 0) { Debug.LogError("[General Multiplier Button] No multiplier data found.", this); text.text = "x1"; DetermineMax(); return; } if (num == -1) _data.SetMultiplier(multipliers[0]); text.text = GetText(); DetermineMax(); } public void SetToCurrentMax() { _data.SetMultiplier(GetCurrentMaxMultiplier()); text.text = GetText(); } private string GetText() { return $"x{_data.GetMultiplier()}"; } private void OnClick() { if (_data == null) return; if (_data.GetTicketCount() < _data.GetMultiplier()) { SetToCurrentMax(); ShowMax(); popupMultiplier.Show(_data.GetMultiplier(), true); return; } var (isMax, multiplier) = GetNextMultiplier(); _data.SetMultiplier(multiplier); popupMultiplier.Show(_data.GetMultiplier(), isMax); if (isMax) ShowMax(); else HideMax(); text.text = GetText(); } private int GetCurrentMaxMultiplier() { var multipliers = _data.GetMultiplierArray(); if (multipliers.Length <= 0) { Debug.LogError("[General Multiplier Button] No multiplier data found.", this); return 1; } for (int i = multipliers.Length - 1; i >= 0; i--) { if (multipliers[i] > _data.GetTicketCount()) continue; return multipliers[i]; } return multipliers[0]; } private (bool isMax, int multiplier) GetNextMultiplier() { var multipliers = _data.GetMultiplierArray(); if (multipliers.Length <= 0) { Debug.LogError("[General Multiplier Button] No multiplier data found.", this); return (false, 0); } var idx = 0; var cur = _data.GetMultiplier(); while (idx < multipliers.Length) { if (multipliers[idx] == cur) break; idx++; } if (idx >= multipliers.Length) { Debug.LogError($"[General Multiplier Button] Multiplier {cur} not found in array.", this); Debug.LogError($"[General Multiplier Button] Array: {string.Join(",", multipliers)}", this); return (false, multipliers[0]); } idx++; idx %= multipliers.Length; if (multipliers[idx] > _data.GetTicketCount()) idx = 0; // UGLY HACK: 判断是否显示最大倍率 var nextIdx = (idx + 1) % multipliers.Length; bool isMax; if (multipliers[nextIdx] > _data.GetTicketCount() || nextIdx == 0) { isMax = true; } else { isMax = false; } return (isMax, multipliers[idx]); } private void DetermineMax() { var idx = 0; var cur = _data.GetMultiplier(); var multipliers = _data.GetMultiplierArray(); while (idx < multipliers.Length) { if (multipliers[idx] == cur) break; idx++; } var nextIdx = (idx + 1) % multipliers.Length; if (multipliers[nextIdx] > _data.GetTicketCount() || nextIdx == 0) ShowMax(); else HideMax(); } public void ShowMax() { if (max != null) max.SetActive(true); } private void HideMax() { if (max != null) max.SetActive(false); } } public interface IHasMultiplier { /// /// 当前有多少代币 /// /// 代币数量 public int GetTicketCount(); /// /// 获取此活动的倍率列表 /// /// 倍率列表 public int[] GetMultiplierArray(); /// /// 获取当前倍率,如果没有数据返回-1 /// /// 当前倍率,没有存过则返回-1 public int GetMultiplier(); /// /// 设置当前倍率,并存储(如果需要的话) /// /// 倍率 public void SetMultiplier(int multiplier); }