using System.Collections; using System.Collections.Generic; using Module.Log; using UnityEngine; using UnityEngine.UI; public class BuffersSelectCtr : MonoBehaviour { #region Single private static BuffersSelectCtr _instance; public static BuffersSelectCtr Instance { get { if (_instance != null) { return _instance; } return null; } } #endregion public List ownBuffers; // 拥有的Buffer public List newBuffers; // 可替换的新Buffer public Button closeBtn; // 关闭按钮 public Text replaceTips; // 替换提示 public Text remainTimeObj; // 当前剩余时间(仅时间) public Text remainTimeDesc; // 当前剩余时间描述 public UIBackRayBehind behindMask; // 空白点击面板 private BufferItem curSelectItem; // 当前选择的BufferItem; private int selOwnIndex = -1; // 选中自身buff的槽位索引,用于替换 private int selNewIndex = -1; // 选中新buff的槽位索引 private const float PreparaTime = 15.0f; // 剩余时间 private float remainTime; private void Awake() { if(_instance == null) { _instance = this; } if (ownBuffers.Count != newBuffers.Count) { LogModule.ErrorLog("ownBuffers.Count != newBuffers.Count, please check !!!"); } for(int i = 0; i < ownBuffers.Count; ++i) { ownBuffers[i]._PanelClickEvent += OnOwnBufferClick; newBuffers[i]._PanelClickEvent += OnNewBufferClick; } closeBtn.onClick.AddListener(Close); behindMask._BackClick.AddListener(CancelSelect); } // 仅在替换是可用 private void CancelSelect() { if(EmptyIndexOfOwn() == -1 && selNewIndex != -1 && selOwnIndex == -1) { selNewIndex = -1; curSelectItem = null; replaceTips.gameObject.SetActive(false); SetMask(); } } private void OnEnable() { remainTime = PreparaTime; curSelectItem = null; selOwnIndex = -1; selNewIndex = -1; replaceTips.gameObject.SetActive(false); remainTimeObj.gameObject.SetActive(false); } private void OnDestroy() { _instance = null; } // Use this for initialization void Start () { if(ownBuffers.Count != newBuffers.Count) { LogModule.ErrorLog("ownBuffers.Count != newBuffers.Count, please check !!!"); } for(int i = 0; i < ownBuffers.Count; ++i) { ownBuffers[i].Show(null); newBuffers[i].Show(null); } } // 自身Buffer点击后的回调 private void OnOwnBufferClick(UIBase item) { // 仅当需要替换时,对拥有的Buffer做出反应 if (curSelectItem != null && EmptyIndexOfOwn() == -1) { BufferItem replaceItem = item as BufferItem; if(replaceItem == null) { LogModule.ErrorLog("Replace buffer is null, please check !!!"); return; } selOwnIndex = ownBuffers.IndexOf(replaceItem); if (selOwnIndex == -1) { LogModule.ErrorLog("Can't find replace buffer Index, please check !!!"); return; } Hashtable info_newBuffer = new Hashtable(); info_newBuffer["Info"] = curSelectItem.BuffInfo.ImpactID; ownBuffers[selOwnIndex].Show(info_newBuffer); remainTime = 3.0f; replaceTips.gameObject.SetActive(false); SetMask(); } } // 新的可调换Buffer点击回调 private void OnNewBufferClick(UIBase item) { BufferItem tempSelect = item as BufferItem; if(tempSelect == null) { return; } if(curSelectItem != null) { return; } selNewIndex = newBuffers.IndexOf(tempSelect); curSelectItem = tempSelect; int emptyIndex = EmptyIndexOfOwn(); if(emptyIndex != -1) { Hashtable hash = new Hashtable(); hash["Info"] = curSelectItem.BuffInfo.ImpactID; ownBuffers[emptyIndex].Show(hash); selOwnIndex = emptyIndex; remainTime = 3.0f; } else { replaceTips.gameObject.SetActive(true); } SetMask(); } #region 消息接收与发送 public void ReceiveNewBuffers(object packet) { ReqTestingOptionBuff info = packet as ReqTestingOptionBuff; if(info == null) { return; } this.gameObject.SetActive(true); for (int i = 0; i < ownBuffers.Count; ++i) { if (i < info._OwnBuffId.Count) { Hashtable hash = new Hashtable() { { "Info", info._OwnBuffId[i] } }; ownBuffers[i].Show(hash); } else { ownBuffers[i].Show(null); } } for(int i = 0; i < info._OptionBuffId.Count; ++i) { Hashtable hash = new Hashtable() { { "Info", info._OptionBuffId[i] } }; newBuffers[i].Show(hash); } StartCoroutine("CountDown"); SetMask(); } private IEnumerator CountDown() { remainTimeObj.gameObject.SetActive(true); for(; remainTime > 0.0f; remainTime -= Time.deltaTime) { remainTimeDesc.text = ((int)remainTime).ToString(); yield return 0; } Close(); } // 确认所选的Buff public void ConfimBuffers() { if(curSelectItem == null) { // 拥有空槽位时,随机选取一个Buff if(EmptyIndexOfOwn() != -1) { int r = Random.Range(0, newBuffers.Count - 1); Hashtable hash = new Hashtable() { { "Info", newBuffers[r].BuffInfo.ImpactID } }; ownBuffers[EmptyIndexOfOwn()].Show(hash); TestingCopyBuffInfoCtr.Instance.SetBuffer(newBuffers[r].BuffInfo.ImpactID); } } else { if(EmptyIndexOfOwn() != -1) { TestingCopyBuffInfoCtr.Instance.SetBuffer(curSelectItem.BuffInfo.ImpactID); } else if(selOwnIndex != -1) { TestingCopyBuffInfoCtr.Instance.SetBuffer(curSelectItem.BuffInfo.ImpactID, selOwnIndex); } } // 发送信息确认新buff List curBuffs = new List(); for(int i = 0; i < ownBuffers.Count; ++i) { if(ownBuffers[i].BuffInfo != null) { curBuffs.Add(ownBuffers[i].BuffInfo.ImpactID); } } RetTestingOptionBuff packet = new RetTestingOptionBuff(); packet._BuffId = curBuffs; packet.SendMsg(); } #endregion /// /// 获得自身Buffer槽中的空槽位索引 /// /// 空位索引,当为 -1 表示已满 private int EmptyIndexOfOwn() { for(int i = 0; i < ownBuffers.Count; ++i) { if(ownBuffers[i].BuffInfo == null) { return i; } } return -1; } public void Close() { ConfimBuffers(); this.gameObject.SetActive(false); } private void SetMask() { //for(int i = 0; i < ownBuffers.Count; ++i) //{ // ownBuffers[i].SetMask(ownBuffers[i].BuffInfo == null); //} if(selOwnIndex == -1) { if(selNewIndex == -1) { for (int i = 0; i < newBuffers.Count; ++i) { newBuffers[i].SetMask(false); } } else { for (int i = 0; i < newBuffers.Count; ++i) { if(selNewIndex == i) { newBuffers[i].SetMask(false); newBuffers[i].Selected(); } else { newBuffers[i].SetMask(true); } } } } else { for (int i = 0; i < newBuffers.Count; ++i) { newBuffers[i].SetMask(true); } } } }