460 lines
12 KiB
C#
460 lines
12 KiB
C#
|
using UnityEngine;
|
|||
|
using UnityEngine.UI;
|
|||
|
using UnityEngine.Events;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System;
|
|||
|
|
|||
|
|
|||
|
public class UISubScollMenu : UIBase
|
|||
|
{
|
|||
|
public RectTransform MenuContainer;
|
|||
|
public RectTransform _ContainerBG;
|
|||
|
public GameObject Sub1BtnPrefab;
|
|||
|
public GameObject Sub2BtnPrefab;
|
|||
|
public bool IsReverse = true; //默认逆序
|
|||
|
|
|||
|
private bool autoSelect = true; // 当点开菜单时,是否默认点击第一个子菜单,ture:点击,false:不点击
|
|||
|
public bool AutoSelect
|
|||
|
{
|
|||
|
set { autoSelect = value; }
|
|||
|
}
|
|||
|
|
|||
|
private Dictionary<UISubMenuItem, List<UISubMenuItem>> _SubBtns = new Dictionary<UISubMenuItem, List<UISubMenuItem>>();
|
|||
|
public Dictionary<UISubMenuItem, List<UISubMenuItem>> SubBtns
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _SubBtns;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private UISubMenuItem _SelectedSub1;
|
|||
|
public object SelectedSub1
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_SelectedSub1 == null)
|
|||
|
return null;
|
|||
|
return _SelectedSub1.MenuObj;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private UISubMenuItem _SelectedSub2;
|
|||
|
public object SelectedSub2
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_SelectedSub2 == null)
|
|||
|
return null;
|
|||
|
return _SelectedSub2.MenuObj;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private Queue<UISubMenuItem> _Prefabs1 = new Queue<UISubMenuItem>();
|
|||
|
private Queue<UISubMenuItem> _Prefabs2 = new Queue<UISubMenuItem>();
|
|||
|
|
|||
|
private int subIndex = 0;
|
|||
|
[Serializable]
|
|||
|
public class MenuClickEvent : UnityEvent<object>
|
|||
|
{
|
|||
|
public MenuClickEvent()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
[SerializeField]
|
|||
|
private MenuClickEvent _MenuClick;
|
|||
|
|
|||
|
void Update()
|
|||
|
{
|
|||
|
SetBGRect();
|
|||
|
}
|
|||
|
|
|||
|
public void Clear()
|
|||
|
{
|
|||
|
subIndex = 0;
|
|||
|
foreach (var keyValue in _SubBtns)
|
|||
|
{
|
|||
|
_Prefabs1.Enqueue(keyValue.Key);
|
|||
|
keyValue.Key.gameObject.SetActive(false);
|
|||
|
foreach (var item in keyValue.Value)
|
|||
|
{
|
|||
|
_Prefabs2.Enqueue(item);
|
|||
|
item.gameObject.SetActive(false);
|
|||
|
}
|
|||
|
}
|
|||
|
MenuContainer.sizeDelta = Vector2.zero;
|
|||
|
_IsInitBG = false;
|
|||
|
|
|||
|
_SubBtns.Clear();
|
|||
|
_SelectedSub1 = null;
|
|||
|
_SelectedSub2 = null;
|
|||
|
}
|
|||
|
|
|||
|
public void PushMenu(object sub1Tx)
|
|||
|
{
|
|||
|
PushMenu(sub1Tx, new object[] { });
|
|||
|
}
|
|||
|
|
|||
|
public void PushMenu(object sub1Tx, int[] sub2Txs)
|
|||
|
{
|
|||
|
var sub1 = CreateNewMenu(sub1Tx, 1);
|
|||
|
sub1.gameObject.SetActive(true);
|
|||
|
sub1.SubLevel = 1;
|
|||
|
sub1.UnSelected();
|
|||
|
sub1.CloseSubGO();
|
|||
|
|
|||
|
List<UISubMenuItem> sub2 = new List<UISubMenuItem>();
|
|||
|
foreach (var sub2Tx in sub2Txs)
|
|||
|
{
|
|||
|
var sub2Item = CreateNewMenu(sub2Tx, 2);
|
|||
|
sub2Item.SubLevel = 2;
|
|||
|
sub2Item.gameObject.SetActive(false);
|
|||
|
sub2Item.UnSelected();
|
|||
|
sub2Item.CloseSubGO();
|
|||
|
sub2.Add(sub2Item);
|
|||
|
}
|
|||
|
|
|||
|
_SubBtns.Add(sub1, sub2);
|
|||
|
}
|
|||
|
|
|||
|
public void PushMenu(object sub1Tx, object[] sub2Txs)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
var sub1 = CreateNewMenu(sub1Tx, 1);
|
|||
|
sub1.gameObject.SetActive(true);
|
|||
|
sub1.SubLevel = 1;
|
|||
|
sub1.UnSelected();
|
|||
|
sub1.CloseSubGO();
|
|||
|
|
|||
|
// 部分菜单按钮是什么?
|
|||
|
List<UISubMenuItem> sub2 = new List<UISubMenuItem>();
|
|||
|
foreach (var sub2Tx in sub2Txs)
|
|||
|
{
|
|||
|
var sub2Item = CreateNewMenu(sub2Tx, 2);
|
|||
|
sub2Item.SubLevel = 2;
|
|||
|
sub2Item.gameObject.SetActive(false);
|
|||
|
sub2Item.UnSelected();
|
|||
|
sub2Item.CloseSubGO();
|
|||
|
sub2.Add(sub2Item);
|
|||
|
}
|
|||
|
sub2.Reverse();
|
|||
|
|
|||
|
_SubBtns.Add(sub1, sub2);
|
|||
|
}
|
|||
|
|
|||
|
public void ShowDefaultFirst()
|
|||
|
{
|
|||
|
//_SelectedSub1 = null;
|
|||
|
//_SelectedSub2 = null;
|
|||
|
if (_SubBtns.Count > 0)
|
|||
|
{
|
|||
|
foreach (var keyValue in _SubBtns)
|
|||
|
{
|
|||
|
if (!keyValue.Key.isActiveAndEnabled)
|
|||
|
continue;
|
|||
|
|
|||
|
MenuClick(keyValue.Key);
|
|||
|
//if (keyValue.Value != null && keyValue.Value.Count > 0)
|
|||
|
//{
|
|||
|
// for(int i = 0; i< keyValue.Value.Count; ++i)
|
|||
|
// {
|
|||
|
// if (!keyValue.Value[i].ShowMenu())
|
|||
|
// continue;
|
|||
|
// MenuClick(keyValue.Value[i]);
|
|||
|
// break;
|
|||
|
// }
|
|||
|
//}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
MenuClick(null);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void CloseAllSub()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public void HightLightMenu(object showObj)
|
|||
|
{
|
|||
|
if (_SubBtns.Count > 0)
|
|||
|
{
|
|||
|
foreach (var keyValue in _SubBtns)
|
|||
|
{
|
|||
|
if (showObj == keyValue.Key.MenuObj)
|
|||
|
{
|
|||
|
keyValue.Key.Selected();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
keyValue.Key.UnSelected();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void ShowMenu(object showObj, object showsubObj = null)
|
|||
|
{
|
|||
|
if (showObj == null)
|
|||
|
return;
|
|||
|
//Debug.LogError("ShowObj : " + showObj);
|
|||
|
if (_SubBtns.Count > 0)
|
|||
|
{
|
|||
|
foreach (var keyValue in _SubBtns)
|
|||
|
{
|
|||
|
// Debug.LogError("keyValue.Key.MenuObj : " + keyValue.Key.MenuObj);
|
|||
|
if (showObj.Equals(keyValue.Key.MenuObj))
|
|||
|
{
|
|||
|
//Debug.LogError("MenuClick : " + showObj);
|
|||
|
//MenuClick(keyValue.Key);
|
|||
|
UISubMenuItem selectedSubMenu = null;
|
|||
|
if (keyValue.Value.Count > 0)
|
|||
|
{
|
|||
|
foreach (var subMenu in keyValue.Value)
|
|||
|
{
|
|||
|
if (showsubObj.Equals(subMenu.MenuObj))
|
|||
|
{
|
|||
|
selectedSubMenu = subMenu;
|
|||
|
//MenuClick(subMenu);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (showsubObj != null && selectedSubMenu != null)
|
|||
|
{
|
|||
|
MenuClick(keyValue.Key);
|
|||
|
MenuClick(selectedSubMenu);
|
|||
|
break;
|
|||
|
}
|
|||
|
else if (showsubObj == null)
|
|||
|
{
|
|||
|
MenuClick(keyValue.Key);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
MenuClick(null);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void ShowMenu(object showObj, bool isSpecial)
|
|||
|
{
|
|||
|
if (_SubBtns.Count > 0)
|
|||
|
{
|
|||
|
foreach (var keyValue in _SubBtns)
|
|||
|
{
|
|||
|
if (keyValue.Value.Count > 0)
|
|||
|
{
|
|||
|
foreach (var subMenu in keyValue.Value)
|
|||
|
{
|
|||
|
if (showObj == subMenu.MenuObj)
|
|||
|
{
|
|||
|
MenuClick(keyValue.Key);
|
|||
|
MenuClick(subMenu);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (showObj == keyValue.Key.MenuObj)
|
|||
|
{
|
|||
|
MenuClick(keyValue.Key);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
MenuClick(null);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Refresh()
|
|||
|
{
|
|||
|
foreach (var menuBtn in _SubBtns)
|
|||
|
{
|
|||
|
menuBtn.Key.Refresh();
|
|||
|
foreach (var subMenu in menuBtn.Value)
|
|||
|
{
|
|||
|
subMenu.Refresh();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private UISubMenuItem CreateNewMenu(object tx, int level)
|
|||
|
{
|
|||
|
GameObject go;
|
|||
|
UISubMenuItem menuScript;
|
|||
|
|
|||
|
if (level == 1)
|
|||
|
{
|
|||
|
if (_Prefabs1.Count > 0)
|
|||
|
{
|
|||
|
menuScript = _Prefabs1.Dequeue();
|
|||
|
go = menuScript.gameObject;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
go = GameObject.Instantiate<GameObject>(Sub1BtnPrefab.gameObject);
|
|||
|
menuScript = go.GetComponent<UISubMenuItem>();
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_Prefabs2.Count > 0)
|
|||
|
{
|
|||
|
menuScript = _Prefabs2.Dequeue();
|
|||
|
go = menuScript.gameObject;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
go = GameObject.Instantiate<GameObject>(Sub2BtnPrefab.gameObject);
|
|||
|
menuScript = go.GetComponent<UISubMenuItem>();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
menuScript.InitMenu(tx);
|
|||
|
go.transform.SetParent(MenuContainer.transform);
|
|||
|
go.transform.SetSiblingIndex(subIndex);
|
|||
|
++subIndex;
|
|||
|
go.transform.localScale = Vector3.one;
|
|||
|
menuScript._PanelClickEvent = MenuClick;
|
|||
|
return menuScript;
|
|||
|
}
|
|||
|
|
|||
|
public void MenuClick(UIItemBase itemBase)
|
|||
|
{
|
|||
|
UISubMenuItem menuItem = itemBase as UISubMenuItem;
|
|||
|
if (menuItem == null)
|
|||
|
return;
|
|||
|
|
|||
|
|
|||
|
if (menuItem.SubLevel == 1)
|
|||
|
{
|
|||
|
if (menuItem != _SelectedSub1)
|
|||
|
{
|
|||
|
ClearSelect(1);
|
|||
|
ClearSelect(2);
|
|||
|
_SelectedSub1 = menuItem;
|
|||
|
_SelectedSub1.Selected();
|
|||
|
if (_SubBtns[_SelectedSub1].Count > 0)
|
|||
|
{
|
|||
|
_SelectedSub1.OpenSubGO();
|
|||
|
//foreach (var sub2 in _SubBtns[_SelectedSub1])
|
|||
|
//{
|
|||
|
// sub2.ShowMenu();
|
|||
|
//}
|
|||
|
for (int i = 0; i < _SubBtns[_SelectedSub1].Count; ++i)
|
|||
|
{
|
|||
|
if (!_SubBtns[_SelectedSub1][i].ShowMenu())
|
|||
|
continue;
|
|||
|
|
|||
|
if(!IsReverse)
|
|||
|
{//正序第一个
|
|||
|
if(_SelectedSub2 == null)
|
|||
|
_SelectedSub2 = _SubBtns[_SelectedSub1][i];
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//逆序 倒数第一个
|
|||
|
//if(_SelectedSub2 == null)
|
|||
|
_SelectedSub2 = _SubBtns[_SelectedSub1][i];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (_SelectedSub2 != null && autoSelect == true)
|
|||
|
{
|
|||
|
MenuClick(_SelectedSub2);
|
|||
|
_SelectedSub2.Selected();
|
|||
|
_MenuClick.Invoke(_SelectedSub2.MenuObj);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else if(_SubBtns[_SelectedSub1].Count > 0)
|
|||
|
{
|
|||
|
ClearSelect(1);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (menuItem != _SelectedSub2)
|
|||
|
{
|
|||
|
ClearSelect(2);
|
|||
|
_SelectedSub2 = menuItem;
|
|||
|
_SelectedSub2.Selected();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
_MenuClick.Invoke(menuItem.MenuObj);
|
|||
|
}
|
|||
|
|
|||
|
public void ShowSubFirstItem()
|
|||
|
{
|
|||
|
if (_SubBtns[_SelectedSub1].Count > 0)
|
|||
|
{
|
|||
|
_SelectedSub2 = _SubBtns[_SelectedSub1][0];
|
|||
|
MenuClick(_SelectedSub2);
|
|||
|
_SelectedSub2.Selected();
|
|||
|
_MenuClick.Invoke(_SelectedSub2.MenuObj);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void ClearSelect(int layer)
|
|||
|
{
|
|||
|
if (layer == 2 && _SelectedSub2 != null)
|
|||
|
{
|
|||
|
_SelectedSub2.CloseSubGO();
|
|||
|
_SelectedSub2.UnSelected();
|
|||
|
_SelectedSub2 = null;
|
|||
|
}
|
|||
|
|
|||
|
if (layer == 1 && _SelectedSub1 != null)
|
|||
|
{
|
|||
|
_SelectedSub1.CloseSubGO();
|
|||
|
_SelectedSub1.UnSelected();
|
|||
|
foreach (var sub2 in _SubBtns[_SelectedSub1])
|
|||
|
{
|
|||
|
sub2.gameObject.SetActive(false);
|
|||
|
}
|
|||
|
_SelectedSub1 = null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#region bg
|
|||
|
|
|||
|
private bool _IsInitBG = false;
|
|||
|
|
|||
|
public void SetBGRect()
|
|||
|
{
|
|||
|
if (_ContainerBG == null)
|
|||
|
return;
|
|||
|
|
|||
|
if (_IsInitBG)
|
|||
|
return;
|
|||
|
|
|||
|
if (MenuContainer.sizeDelta.y > 1)
|
|||
|
{
|
|||
|
_IsInitBG = true;
|
|||
|
_ContainerBG.sizeDelta = new Vector2(_ContainerBG.sizeDelta.x, MenuContainer.sizeDelta.y + 10);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
|