using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; public class SkillRootPage : MonoBehaviour { public GameObject _SkillItemPrefab; public RectTransform line; // 穿插技能图标的横线,只对它的长度以及X做处理。 private static Queue _IdleItemPrefabs = new Queue(); // 预设复用 private List _SkillItems = new List(); public List SkillItems { get { return _SkillItems; } } private List _SkillLines = new List(); private SkillRootItem _SelectedItem; public void InitContainer(List showItems, UIItemBase.ItemClick itemClick, bool isOtherPlayer = false) { ClearItems(); showItems.Sort((showItemA, showItemB) => { if (showItemA.SkillLearn.ShowPosX < showItemB.SkillLearn.ShowPosX) return -1; else if (showItemA.SkillLearn.ShowPosX > showItemB.SkillLearn.ShowPosX) return 1; else { if (showItemA.SkillLearn.ShowPosY > showItemB.SkillLearn.ShowPosY) return -1; else if (showItemA.SkillLearn.ShowPosY < showItemB.SkillLearn.ShowPosY) return 1; } return 0; }); float minX= float.MaxValue; float maxX = float.MinValue; // 显示技能图标 foreach (var showItem in showItems) { //if (showItem.SkillLearn.ShowPosX || showItem.SkillLearn.ShowPosY s) // continue; SkillRootItem skillItem = GetIdleItem(); skillItem.ShowSkillItem(showItem, isOtherPlayer); // 位置计算 float posX = showItem.SkillLearn.ShowPosX; float posY = showItem.SkillLearn.ShowPosY; minX = Mathf.Min(minX, posX); maxX = Mathf.Max(maxX, posX); skillItem._ClickEvent = itemClick; skillItem._PanelClickEvent = OnSkillItemSelect; skillItem._RectTransform.anchoredPosition = new Vector2(posX, posY); _SkillItems.Add(skillItem); } if(line != null) { line.anchoredPosition = new Vector2((minX + maxX) / 2, line.anchoredPosition.y); line.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, maxX - minX); } } public void SelectDefaultFirst() { if (_SkillItems.Count > 0) { _SkillItems[0].OnItemClick(); } } public void SelectItem(SkillRootItem.SkillShowInfo selectShow) { if (selectShow == null) { SelectDefaultFirst(); return; } foreach (var skillItem in _SkillItems) { if (skillItem.ShowSkillInfo.SkillBase == selectShow.SkillBase) { skillItem.OnItemClick(); return; } } SelectDefaultFirst(); } private SkillRootItem GetIdleItem() { if (_IdleItemPrefabs.Count > 0) { var idleItem = _IdleItemPrefabs.Dequeue(); idleItem.gameObject.SetActive(true); return idleItem; } GameObject newItemPrefab = GameObject.Instantiate(_SkillItemPrefab); newItemPrefab.gameObject.SetActive(true); SkillRootItem skillItem = newItemPrefab.GetComponent(); newItemPrefab.transform.SetParent(transform); newItemPrefab.transform.localScale = Vector3.one; newItemPrefab.transform.localPosition = Vector3.zero; return skillItem; } //private RectTransform GetIdleLine() //{ // if (_IdleLinePrefabs.Count > 0) // { // var idleItem = _IdleLinePrefabs.Dequeue(); // idleItem.gameObject.SetActive(true); // return idleItem; // } // GameObject newItemPrefab = GameObject.Instantiate(_SkillLinePrefab); // RectTransform rectTranform = newItemPrefab.GetComponent(); // newItemPrefab.transform.SetParent(transform); // newItemPrefab.transform.localScale = Vector3.one; // newItemPrefab.transform.localPosition = Vector3.zero; // return rectTranform; //} private void ClearItems() { _IdleItemPrefabs.Clear(); //_IdleLinePrefabs.Clear(); foreach (var skillItem in _SkillItems) { skillItem.gameObject.SetActive(false); _IdleItemPrefabs.Enqueue(skillItem); } _SkillItems.Clear(); //foreach (var skillLine in _SkillLines) //{ // skillLine.gameObject.SetActive(false); // _IdleLinePrefabs.Enqueue(skillLine); //} //_SkillLines.Clear(); } private void OnSkillItemSelect(UIItemBase skillItemBase) { _SelectedItem = skillItemBase as SkillRootItem; foreach (var skillItem in _SkillItems) { if (skillItem != skillItemBase) { skillItem.UnSelected(); } else { skillItem.Selected(); } } } private void ShowSkillDetail() { if (_SelectedItem == null) return; } public void RefreshEquipedTag() { foreach (var skillItem in SkillItems) { skillItem.RefreshEquipedTag(); } } }