using DG.Tweening; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; namespace vnxbqy.UI { public class BestXBWin : Window { [SerializeField] Transform horTopContent; [SerializeField] Transform horBottomContent; [SerializeField] Transform verLeftContent; [SerializeField] Transform verRightContent; [SerializeField] Button xbBtn; [SerializeField] Text xbBtnText; [SerializeField] Text xbBtnMoneyText; [SerializeField] Text xbOneDesText; [SerializeField] Button xbManyBtn; [SerializeField] Text xbManyBtnText; [SerializeField] Text xbManyMoneyText; [SerializeField] Text xbManyDesText; [SerializeField] Button freeXbBtn; [SerializeField] Text luckText; [SerializeField] GameObject luckDesObj; [SerializeField] Transform getXBItemParent; [SerializeField] GameObject xbResultObj; [SerializeField] GameObject maskObj; [SerializeField] GameObject toolXBShowObj; [SerializeField] Image toolImg1; [SerializeField] Image toolImg2; [SerializeField] Text toolNumText; [SerializeField] Button skipBtn; [SerializeField] GameObject skipImg; [Header("单次寻宝圈数")] [SerializeField] int cycleTimes = 1; [Header("开始圈时间间隔")] [SerializeField] float startDelayTime = 0.15f; [Header("结束圈时间间隔")] [SerializeField] float endDelayTime = 0.005f; [Header("其他圈时间间隔")] [SerializeField] float otherDelayTime = 0.1f; [Header("开始圈初始加速度")] [SerializeField] float a1 = 0.3f; [Header("结束圈初始减速度")] [SerializeField] float a2 = 2f; [Header("其他圈初始加速度")] [SerializeField] float a3 = 0.5f; [Header("最大时间间隔")] [SerializeField] float maxTimeInter = 0.6f; [Header("最小时间间隔")] [SerializeField] float minTimeInter = 0.005f; [Header("闪烁次数")] [SerializeField] public int flashingTimes = 10; [Header("单次闪烁时间")] [SerializeField] public float flashingTime = 0.2f; [Header("得到物品停留时间")] [SerializeField] float stopTime = 2f; [Header("寻宝得到物品动画时间")] [SerializeField] float scaleTime = 0.2f; [Header("音效播放最短时间")] [SerializeField] float minPlayeAudioTime = 0.1f; [SerializeField] TextEx todayMaxText; List xbItemlist = new List(); List targetIndexs; List getItemlist; int xbOneMoney = 0; int xbManyMoney = 0; List xbResultObjlist = new List(); List xbResultItemBasiclist = new List(); HappyXBModel XBModel { get { return ModelCenter.Instance.GetModel(); } } PackModel playerPack { get { return ModelCenter.Instance.GetModel(); } } XBFuncSet funcSet; float coolTime = 3; private bool IsStartPlayAudio = false; private float playeAudioTime = 0; private Clock animationTimeoutClock; protected override void BindController() { xbItemlist.Clear(); int length = horTopContent.childCount; for (int i = 0; i < length; i++) { XBItemCell xbItem = horTopContent.GetChild(i).GetComponent(); xbItemlist.Add(xbItem); } length = verRightContent.childCount; for (int i = 0; i < length; i++) { XBItemCell xbItem = verRightContent.GetChild(i).GetComponent(); xbItemlist.Add(xbItem); } length = horBottomContent.childCount; for (int i = length - 1; i > -1; i--) { XBItemCell xbItem = horBottomContent.GetChild(i).GetComponent(); xbItemlist.Add(xbItem); } length = verLeftContent.childCount; for (int i = length - 1; i > -1; i--) { XBItemCell xbItem = verLeftContent.GetChild(i).GetComponent(); xbItemlist.Add(xbItem); } } protected override void AddListeners() { xbBtn.AddListener(ClickXBBtn); xbManyBtn.AddListener(ClickXBManyBtn); freeXbBtn.AddListener(ClickFreeXbBtn); skipBtn.AddListener(ClickSkipBtn); } protected override void OnPreOpen() { StopClock(); XBModel.StartXBEvent += OnStartXB; XBModel.RefreshXBTypeInfoAct += RefreshXBTypeInfo; XBModel.RefreshXBResultAct += RefreshXBResult; playerPack.refreshItemCountEvent += RefreshItemCount; getItemlist = XBModel.GetXBGetItemByID(1).Values.ToList(); GlobalTimeEvent.Instance.secondEvent += RefreshSecond; InitUI(); RefreshFreeTime(); todayMaxText.text = Language.Get("TreasureCntTodayMax", TreasureSetConfig.Get(1).DailyMaxCount); } protected override void OnAfterOpen() { } protected override void LateUpdate() { base.LateUpdate(); if (IsStartPlayAudio) { if (playeAudioTime <= 0) { SoundPlayer.Instance.PlayUIAudio(66); } playeAudioTime += Time.deltaTime; if (playeAudioTime > minPlayeAudioTime) { playeAudioTime = 0; IsStartPlayAudio = false; } } } protected override void OnPreClose() { XBModel.RefreshXBResultAct -= RefreshXBResult; XBModel.RefreshXBTypeInfoAct -= RefreshXBTypeInfo; playerPack.refreshItemCountEvent -= RefreshItemCount; XBModel.StartXBEvent -= OnStartXB; GlobalTimeEvent.Instance.secondEvent -= RefreshSecond; } protected override void OnAfterClose() { } private void RefreshSecond() { if (XBModel.isXBCoolTime) { coolTime -= 1; if (coolTime < 0) { XBModel.isXBCoolTime = false; ResetXBItemState(); coolTime = 3; DebugEx.Log("请求超时服务端未回包"); } } else { coolTime = 3; } } private void InitUI() { for (int i = 0; i < xbItemlist.Count; i++) { if (getItemlist.Count > i) { xbItemlist[i].SetActive(true); xbItemlist[i].SetModel(getItemlist[i].itemId, getItemlist[i].count, getItemlist[i].gridIndex); } else { xbItemlist[i].SetActive(false); } } playeAudioTime = 0; IsStartPlayAudio = false; maskObj.SetActive(false); luckDesObj.SetActive(true); getXBItemParent.SetActive(false); xbResultObj.SetActive(false); freeXbBtn.SetActive(false); funcSet = XBModel.GetXBFuncSet(1); if (funcSet != null) { xbBtnText.text = Language.Get("HappyXB101", funcSet.xbNums[0]); xbManyBtnText.text = Language.Get("HappyXB101", funcSet.xbNums[1]); xbBtnMoneyText.text = funcSet.xbPrices[0].ToString(); xbManyMoneyText.text = funcSet.xbPrices[1].ToString(); xbOneMoney = funcSet.xbPrices[0]; xbManyMoney = funcSet.xbPrices[1]; xbOneDesText.text = Language.Get("HappyXB106", funcSet.costToolNums[0]); xbManyDesText.text = Language.Get("HappyXB106", funcSet.costToolNums[1]); ItemConfig itemConfig1 = ItemConfig.Get(funcSet.costToolIds[0]); ItemConfig itemConfig2 = ItemConfig.Get(funcSet.costToolIds[1]); if (itemConfig1 != null) { toolImg1.SetSprite(itemConfig1.IconKey); } if (itemConfig2 != null) { toolImg2.SetSprite(itemConfig2.IconKey); } } RefreshXBTypeInfo(); RefreshXBTools(); RefreshSkipUI(); } private void RefreshFreeTime() { if (XBModel.IsHaveFreeXB(1)) { freeXbBtn.SetActive(true); xbBtn.SetActive(false); } else { freeXbBtn.SetActive(false); xbBtn.SetActive(true); } } private void RefreshSkipUI() { skipImg.SetActive(XBModel.isJumpBestXB); } private void ClickSkipBtn() { XBModel.isJumpBestXB = !XBModel.isJumpBestXB; RefreshSkipUI(); if (XBModel.isJumpBestXB && XBModel.rangelist.Count > 0) { StopAllCoroutines(); ResetXBItemState(); WindowCenter.Instance.Open(); } } private void RefreshItemCount(PackType type, int index, int id) { if (type != PackType.Item || !XBModel.CheckIsXBTool(id, 1)) return; RefreshXBTools(); } public void RefreshXBTools() { int xbToolCnt = 0; int needToolCnt = 0; if (XBModel.IsHaveManyXBTool(1, out xbToolCnt, out needToolCnt)) { toolXBShowObj.SetActive(true); toolNumText.text = StringUtility.Contact("x", xbToolCnt); } else { toolXBShowObj.SetActive(false); } } bool isXBMany = false; private void ClickXBManyBtn() { XBModel.SendXBManyQuest(PackType.Treasure, 1); } private void OnStartXB(int oneOrMany) { if (oneOrMany == 0) { maskObj.SetActive(true); isXBMany = false; } else { maskObj.SetActive(true); isXBMany = true; } } private void ClickFreeXbBtn() { if (XBModel.CheckIsEmptyGrid(PackType.Treasure)) { XBModel.SendXBQuest(1, 0, 1); } } private void ClickXBBtn() { XBModel.SendOneXBQuest(PackType.Treasure, 1); } private void RefreshXBTypeInfo() { XBTypeInfo typeInfo = XBModel.GetXBInfoByType(1); if (typeInfo == null) return; luckText.text = typeInfo.luckValue.ToString(); RefreshFreeTime(); } private void RefreshXBResult() { StopClock(); if (XBModel.isJumpBestXB) { ResetXBItemState(); WindowCenter.Instance.Open(); } else { CreateGetItem(); targetIndexs = XBModel.rangelist; StartCoroutine(PlayXBAni(0, 0)); animationTimeoutClock = Clock.AlarmAfter(15f, () => { StopAllCoroutines(); ResetXBItemState(); WindowCenter.Instance.Open(); }); } } // 取消定时器(如果有) void StopClock() { if (animationTimeoutClock != null) { Clock.Stop(animationTimeoutClock); animationTimeoutClock = null; } } private void CreateGetItem() { List xbResultlist = XBModel.rangelist; if (xbResultlist.Count < 2) return; luckDesObj.SetActive(false); getXBItemParent.SetActive(true); DestroyGetItemlist(); xbResultObjlist.Clear(); xbResultItemBasiclist.Clear(); for (int i = 0; i < xbResultlist.Count; i++) { XBGetItem xbItem = xbResultlist[i]; GameObject item = Instantiate(xbResultObj); item.transform.SetParent(getXBItemParent); item.transform.localPosition = Vector3.zero; item.transform.localScale = Vector3.one; item.name = StringUtility.Contact("XBItem", i); item.SetActive(true); CommonItemBaisc itemBasic = item.transform.Find("CommonItemCell").GetComponent(); ItemCellModel cellModel = new ItemCellModel(xbItem.itemId, false, (ulong)xbItem.count); itemBasic.Init(cellModel); itemBasic.transform.localScale = Vector3.zero; itemBasic.transform.localPosition = Vector3.zero; xbResultObjlist.Add(item); itemBasic.SetActive(false); xbResultItemBasiclist.Add(itemBasic); } } private void ShowXBResultCtrl(int index) { if (index < xbResultItemBasiclist.Count) { xbResultItemBasiclist[index].SetActive(true); xbResultItemBasiclist[index].transform.DOScale(new Vector3(1, 1, 1), scaleTime).OnComplete(() => { if (index == xbResultItemBasiclist.Count - 1) { ResetXBItemState(); WindowCenter.Instance.Open(); } }); XBModel.GetNotifyResult(xbResultItemBasiclist[index].itemId, int.Parse(xbResultItemBasiclist[index].countText.text)); } } private void DestroyGetItemlist() { for (int i = 0; i < xbResultObjlist.Count; i++) { Destroy(xbResultObjlist[i]); } } IEnumerator PlayXBAni(int targetIndex, int curSelectIndex) { int cycle = 1; float xbSpeed1 = startDelayTime; float xbSpeed2 = endDelayTime; float xbSpeed3 = otherDelayTime; float xbA1 = a1; float XbA2 = a2; float xbA3 = a3; while (true) { IsStartPlayAudio = true; curSelectIndex += 1; curSelectIndex %= xbItemlist.Count; if (curSelectIndex <= 0) { curSelectIndex = xbItemlist.Count; } for (int i = 0; i < xbItemlist.Count; i++) { xbItemlist[i].RefreshSelectIcon(curSelectIndex); } int remainIndex = targetIndexs[targetIndex].gridIndex - curSelectIndex; if (remainIndex < 0) { remainIndex = xbItemlist.Count + remainIndex; } if (curSelectIndex == targetIndexs[targetIndex].gridIndex) { if (cycle > cycleTimes) { for (int i = 0; i < xbItemlist.Count; i++) { xbItemlist[i].CheckToFlashing(1, curSelectIndex); } for (int i = 0; i < xbItemlist.Count; i++) { xbItemlist[i].RefreshSelectIcon(curSelectIndex); } if (isXBMany) { if (targetIndex >= targetIndexs.Count - 1) { StartCoroutine(PlaySelectItemAni(true)); } else { StartCoroutine(PlaySelectItemAni(false, targetIndex, curSelectIndex)); } } else { StartCoroutine(PlaySelectItemAni(true)); } break; } cycle += 1; } switch (targetIndex) { case 0: xbSpeed1 -= xbA1 * 0.05f; if (xbSpeed1 <= minTimeInter) { xbSpeed1 = minTimeInter; } yield return new WaitForSeconds(xbSpeed1); break; case 9: if (cycle > cycleTimes && remainIndex <= 4) { xbSpeed2 += XbA2 * 0.05f; if (xbSpeed2 >= maxTimeInter) { xbSpeed2 = maxTimeInter; } } else { xbSpeed2 = endDelayTime; } yield return new WaitForSeconds(xbSpeed2); break; default: xbSpeed3 -= xbA3 * 0.05f; if (xbSpeed3 <= minTimeInter) { xbSpeed3 = minTimeInter; } yield return new WaitForSeconds(xbSpeed3); break; } } } IEnumerator PlaySelectItemAni(bool isEndXB, int targetIndex = 0, int curSelectIndex = 0) { XBGetItemConfig getItemConfig = XBModel.GetXBItemConfigByType(1); if (getItemConfig != null && TreasureSetConfig.Get(getItemConfig.TreasureType).LuckyGridNum == curSelectIndex) { yield return new WaitForSeconds(flashingTime * flashingTimes); } else { yield return new WaitForSeconds(stopTime); } if (isEndXB) { StopClock(); if (targetIndexs.Count > 1) { ShowXBResultCtrl(targetIndexs.Count - 1); } else { XBGetItem xbItem = targetIndexs[targetIndexs.Count - 1]; XBModel.GetNotifyResult(xbItem.itemId, xbItem.count); ResetXBItemState(); WindowCenter.Instance.Open(); } } else { ShowXBResultCtrl(targetIndex); StartCoroutine(PlayXBAni(targetIndex + 1, curSelectIndex)); } } private void ResetXBItemState() { luckDesObj.SetActive(true); maskObj.SetActive(false); getXBItemParent.SetActive(false); for (int i = 0; i < xbItemlist.Count; i++) { xbItemlist[i].RefreshSelectIcon(0); } } } }