原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2018/1013/74.html
UGUI中目前没有下拉列表控件,要想完成下拉列表的封装只能自己手动去写一个,今天我们常州网站制作工作室幻天网络就来手动写一个。这种节点可控的可视化UI做一些高级控件还算比较方便。

下拉列表的主要接口:
1.将数据列表传递进去
2.给外部逻辑可注册的item点击事件等
3.获取当前选中的索引
UI节点如下:

其中子节点对象全部设置middle center,pivot全部设置0.5,0.5。
其实就是默认参数,封装好的组件尽量不去设置子节点位置参数。
然后在做其他下拉框的时候,只用换图和设置UISelectList的脚本参数即可。
代码如下:
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.UI;
public class UISelectList : MonoBehaviour
{
public UISelectListType m_type = UISelectListType.Down;
public enum UISelectListType
{
Up,
Down
}
public Text m_curText;
public GameObject m_listPanel;
public RectTransform m_listBg;
public float m_listBgOffset = 4;
public Transform m_parent;
public GameObject m_item;
public int m_itemHeight = 20;
public Transform m_foucs;
private int m_curIndex = 0;
private List m_list = new List();
void Start()
{
m_item.SetActive(false);
Hide();
UIEventListener.Get(m_curText.gameObject).onClick = OnClickBtn;
UIEventListener.Get(m_listPanel).onHover = OnHoverPanel;
// 测试一下
Test();
}
void Test()
{
m_list = new List();
m_list.Add("1111111");
m_list.Add("2222222");
m_list.Add("3333333");
m_list.Add("4444444");
m_list.Add("5555555");
m_list.Add("6666666");
SetList(m_list);
}
public void Show()
{
m_listPanel.SetActive(true);
}
public void Hide()
{
m_listPanel.SetActive(false);
}
public void SetText(int index)
{
m_curIndex = index;
m_curText.text = m_list[index];
}
public int GetIndex()
{
return m_curIndex;
}
public List SetList(List list)
{
// 返回item对象列表,给逻辑注册事件等
List itemList = new List();
m_list = list;
int num = list.Count;
for (int i = 0; i < num; i++)
{
Transform item = m_parent.FindChild(i.ToString());
if (item == null)
{
item = ((GameObject)GameObject.Instantiate(m_item)).transform;
item.SetParent(m_parent.transform);
item.name = i.ToString();
item.localScale = Vector3.one;
item.gameObject.SetActive(true);
}
item.GetComponent().text = list[i];
if (m_type == UISelectListType.Down)
item.localPosition = new Vector2(0, -1 * i * m_itemHeight);
else
item.localPosition = new Vector2(0, i * m_itemHeight);
UIEventListener lis = UIEventListener.Get(item.gameObject);
lis.onHover = OnHoverItem;
lis.onClick = OnClickItem;
lis.parameter = i;
itemList.Add(item.gameObject);
}
// 更新背景大小
m_listBg.sizeDelta = new Vector2(m_listBg.sizeDelta.x, num * m_itemHeight + 2 * m_listBgOffset);
// 更新列表位置和背景位置
if (m_type == UISelectListType.Down)
{
m_listPanel.transform.localPosition = new Vector2(0, -1 * GetComponent().sizeDelta.y);
m_listBg.pivot = new Vector2(0.5f, 1f);
m_listBg.localPosition = new Vector3(0, m_listBgOffset + m_itemHeight * 0.5f, 0);
}
else
{
m_listPanel.transform.localPosition = new Vector2(0, GetComponent().sizeDelta.y);
m_listBg.pivot = new Vector2(0.5f, 0f);
m_listBg.localPosition = new Vector3(0, - 1 * m_listBgOffset - m_itemHeight * 0.5f, 0);
}
return itemList;
}
private void OnClickBtn(GameObject go)
{
if (m_listPanel.activeSelf)
Hide();
else
Show();
}
private void OnHoverItem(GameObject go, bool isHover)
{
if (isHover)
m_foucs.localPosition = go.transform.localPosition;
}
private void OnClickItem(GameObject go)
{
int index = (int)UIEventListener.Get(go).parameter;
SetText(index);
Hide();
}
private void OnHoverPanel(GameObject go, bool isHover)
{
if (!isHover)
Hide();
}
}
上篇:上一篇:U3D EasyTouch JoyStick控制角色的移动
下篇:下一篇:A*算法实现自动寻路