• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

UGUI下拉列表的封装

原创内容,转载请注明原文网址: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*算法实现自动寻路