unity+Dropdown

项目测试代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Dropdown))]
public class TestDrowDown : MonoBehaviour {
    public string[] showText;//每个Item下的Text,用来显示和修改
    public Sprite[] sprite;//自己用来换每个Item的背景显示
    Dropdown dropDownItem;
    List<string> temoNames;
    List<Sprite> sprite_list;

   
    void Start()
    {
        dropDownItem = this.GetComponent<Dropdown>();
        dropDownItem.onValueChanged.AddListener(Change);
        temoNames = new List<string>();
        sprite_list = new List<Sprite>();

        AddNames();
        UpdateDropDownItem(temoNames);

    }

    private void Change(int index)
    {
        Debug.Log(index);
        switch (index)
        {
            case 0:
                Debug.LogError(index+ dropDownItem.value);
                break;
            case 1:
                Debug.LogError(index);

                break;
            default: break;
        }
    }
    void UpdateDropDownItem(List<string> showNames)
    {
        dropDownItem.options.Clear();
        Dropdown.OptionData temoData;
        for (int i = 0; i < showNames.Count; i++)
        {
            //给每一个option选项赋值
            temoData = new Dropdown.OptionData();
            temoData.text = showNames[i];

            if (sprite.Length != 0)
            {
                temoData.image = sprite_list[i];
            }
            dropDownItem.options.Add(temoData);
        }
        //初始选项的显示
        dropDownItem.captionText.text = showNames[0];

    }

    void AddNames()
    {
        for (int i = 0; i < showText.Length; i++)
        {
            temoNames.Add(showText[i]);
        }
        if(sprite.Length!=0)
        {
            for (int i = 0; i < sprite.Length; i++)
            {
                sprite_list.Add(sprite[i]);
            }
        }
    }
  
	
	// Update is called once per frame
	void Update () {
		
	}
}

  TK项目使用:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Text.RegularExpressions;
[RequireComponent(typeof(Dropdown))]

public class TKCheckManager : MonoBehaviour {

    public string[] showText;//每个Item下的Text,用来显示和修改
    public Sprite[] sprite;//自己用来换每个Item的背景显示
    Dropdown dropDownItem;
    List<string> temoNames;
    List<Sprite> sprite_list;

    private bool isAdminUser;
    void Start()
    {
        dropDownItem = this.GetComponent<Dropdown>();
        dropDownItem.onValueChanged.AddListener(Change);
        temoNames = new List<string>();
        sprite_list = new List<Sprite>();

        AddNames();
        UpdateDropDownItem(temoNames);

    }
    private void OnEnable()
    {
        dropDownItem = this.GetComponent<Dropdown>();
        dropDownItem.onValueChanged.AddListener(Change);
        temoNames = new List<string>();
        sprite_list = new List<Sprite>();
        AddNames();
        UpdateDropDownItem(temoNames);
        dropDownItem.value = 0;
        if(TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst.Count!=0)
        TKGameSaveDataStatus.singleton.ProofreaderID = TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst[0];
    }
    private void Change(int index)
    {
        Debug.Log(index);
        //2019.10.23之后可选择检验人员
        if (isAdminUser)
        {
            if (TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst != null && index < TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst.Count)
            {
                TKGameSaveDataStatus.singleton.ProofreaderID = TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst[index];
            }
        }
        else
        {
            if (TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationLst != null && index < TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationLst.Count)
            {
                TKGameSaveDataStatus.singleton.ProofreaderID = TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationLst[index];
            }
        }
        //switch (index)
        //{
        //    case 0:
        //        Debug.LogError(index + dropDownItem.value);
        //        break;
        //    case 1:
        //        Debug.LogError(index);

        //        break;
        //    default: break;
        //}
    }
    void UpdateDropDownItem(List<string> showNames)
    {
        dropDownItem.options.Clear();
        Dropdown.OptionData temoData;
        for (int i = 0; i < showNames.Count; i++)
        {
            //给每一个option选项赋值
            temoData = new Dropdown.OptionData();
            temoData.text = showNames[i];

            if (sprite.Length != 0)
            {
                temoData.image = sprite_list[i];
            }
            dropDownItem.options.Add(temoData);
        }
        //初始选项的显示
        dropDownItem.captionText.text = showNames[0];

    }

    void AddNames()
    {
        var isAdmin= Regex.Match(TKGlobalData.Remarks, "管理员");
        isAdminUser = isAdmin.Success;
        if (isAdmin.Success)
        {
            if (TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationDic.Count != 0&& TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst.Count!=0)
            {
                for (int i = 0; i < TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst.Count; i++)
                {
                    //Debug.LogError(" 333339999" + TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationDic[TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst[i]] + TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst.Count + "  " + TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationDic.Count);

                    //temoNames.Add(TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst[i]);
                    temoNames.Add(TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationDic[TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst[i]]);
                    ////2019.10.23之后可选择检验人员
                    //TKGameSaveDataStatus.singleton.ProofreaderID = TKDataHandle.TKDataHandleInstance.CurrentAdminProofreaderUserInformationLst[i];
                }
            }
        }
        else
        {
            if (TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationDic.Count != 0&&TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationLst.Count != 0)
            {
                for (int i = 0; i < TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationLst.Count; i++)
                {

                    temoNames.Add(TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationDic[TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationLst[i]]);
                    //Debug.LogError("********" + TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationDic[TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationLst[i]]+ "&&&&&  "+TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationLst[i]);
                    ////2019.10.23之后可选择检验人员
                    //TKGameSaveDataStatus.singleton.ProofreaderID = TKDataHandle.TKDataHandleInstance.CurrentNoAdminProofreaderUserInformationLst[i];
                }
            }
        }
        //if (sprite.Length != 0)
        //{
        //    for (int i = 0; i < sprite.Length; i++)
        //    {
        //        sprite_list.Add(sprite[i]);
        //    }
        //}
    }


    // Update is called once per frame
    void Update()
    {

    }
}

  

 

 

参考文章

(1条消息)Unity(一)关于Unity Dropdown控件的使用心得 - LinZhonglong的博客 - CSDN博客  https://blog.csdn.net/linzhonglong/article/details/71195411

 

核心在于dropdown.value 知道我们选择的索引是哪一个Item

2017功能记录

1:首先看一下控件组成

 

 

 

Lable和Arrow是用来显示初始化的文字和勾选项的,Lable会根据首选项的内容自动更改。

Template是Dropdown的模板样式,其中Background和Checkmark的图集资源我们可以提前更改。

2:看一下Dropdown的属性面板

 

 

 

Caption Text和Caption Image是作为下拉列表首选项的文字和图片显示,也是我们每次选择后的内容,因此可代码调用获取

Item Text作为下拉列表中每个item的文字显示,Item Image可以用来扩展模板增加内容

Value值会随着下拉列表选项的不同而变化,dropdown.value

Options选项栏内:可以动态赋值给Item对象  Dropdown.OptionData

 

4:代码模块

说明:参考他人的代码,并做了修改

public string[] showText;//每个Item下的Text,用来显示和修改
public Sprite[] sprite;//自己用来换每个Item的背景显示
Dropdown dropDownItem;
List<string> temoNames;
List<Sprite> sprite_list;
void Start()
{
dropDownItem = this.GetComponent<Dropdown>();
temoNames = new List<string>();
sprite_list = new List<Sprite>();

AddNames();
UpdateDropDownItem(temoNames);

}


void UpdateDropDownItem(List<string> showNames)
{
dropDownItem.options.Clear();
Dropdown.OptionData temoData;
for (int i = 0; i <showNames.Count; i++)
{
//给每一个option选项赋值
temoData = new Dropdown.OptionData();
temoData.text = showNames[i];
temoData.image = sprite_list[i];
dropDownItem.options.Add(temoData);
}
//初始选项的显示
dropDownItem.captionText.text = showNames[0];

}

void AddNames()
{
for (int i = 0; i <showText.Length; i++)
{
temoNames.Add(showText[i]);
}
for (int i = 0; i <sprite.Length; i++)
{
sprite_list.Add(sprite[i]);
}
}
 

  

 

这样可以在Templete里添加图,这样游戏内的看着好看的下拉列表就完成了。如下。。。好吧我承认丑

 

 

 

 

 

2019更新记录

 

需求:点击下拉列表的内容后就执行功能,类似Button事件。其实组件下方的OnValueChanged这个UnityEvent已经是我们要的功能了

下面用两种方法达到同样效果,推荐方法2

使用方法1:

a:首先创建一个脚本挂载在Dropdown组件下,继承ISelectHandler,把dropdown组件拖过来

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Drop : MonoBehaviour,ISelectHandler
{
public Dropdown drop;
private int lastIndex;

public void OnSelect(BaseEventData eventData)
{
//避免点击下拉列表item和dropdown重复调用
if (drop.value == lastIndex) return;

//处理逻辑
//

Debug.Log("OnSelect=" + drop.value);
lastIndex = drop.value;
}
}
 

  

b:这样当我们选择下拉列表对应Item,会触发类似button事件

使用方法2:

使用API自带的监听事件

using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Dropdown))]
public class Drop : MonoBehaviour
{
private Dropdown drop;
void Start()
{
drop = this.GetComponent<Dropdown>();
drop.onValueChanged.AddListener(Change);
}
private void Change(int index)
{
Debug.Log(index); 
switch (index)
{
case 0: break;
case 1: break;
default: break;
}
}
}
 

  



posted @ 2019-10-29 10:37  WalkingSnail  阅读(833)  评论(0)    收藏  举报