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





 
                     
                     
                     
                     
                    