IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity UGUI_DropDown控件模拟QQ分组的使用心得 -> 正文阅读

[游戏开发]Unity UGUI_DropDown控件模拟QQ分组的使用心得

关于 DropDown 很好用,但是也有很多坑,对比专门的软件开发工具,unity关于DropDown的功能有限,下面总结一下我本次使用DropDown的一些心得

DropDown下拉选项

DropDown创建即可运行,并生成初始选项,供我们参考使用,也非常简单,下面我讲讲使用方法:

上图我创建了一个DropDown,相关属性我就不说了,我讲讲怎么添加事件,和设置名称

在这里插入图片描述
我根据项目需求,选中后主标题是不会变化的,所以把CaptionText 控件置为空,这样我们就可以单独控制改文字的更改。

在这里插入图片描述
我的项目需求是有多少选项就会显示多少,所以去掉Template下的一些控件,并且去除掉Template身上的Scroll Rect组件。

在这里插入图片描述
上面步骤完成后,我们调整锚点,然后给Template添加两个组件,用于排列显示,和适应选项大小,现在我们就实现了有多少选项都会直接显示出来,下面我们进行事件绑定和实现qq分组折叠效果
上代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DropdownScript : MonoBehaviour {

    
    public Text m_dropdownName;//名称
    public int m_ids = 0;//id
    private Dropdown m_dropdown;//控件
    private List<Dropdown.OptionData> optionDatas = new List<Dropdown.OptionData>();//选项
    private Action<int> DropDownEvent;//选项事件
    public Action<bool, int,float> OpenOrCloseEvent;//点击事件
    private void OnClickDropdown(int arg0)
    {
        if (DropDownEvent!=null)
        {
            DropDownEvent(arg0);
        }
    }
    /// <summary>
    /// 初始化下拉框
    /// </summary>
    /// <param name="name"></param>
    /// <param name="options"></param>
    public void InitDropdown(string name,int id,List<string> options)
    {
        m_ids = id;
        m_dropdown = this.transform.GetComponent<Dropdown>();
        m_dropdown.onValueChanged.AddListener(OnClickDropdown);
        m_dropdownName.text = name;
        m_dropdown.ClearOptions();
        if (options.Count>0&& options!=null)
        {
            for (int i = 0; i < options.Count; i++)
            {
                Dropdown.OptionData option = new Dropdown.OptionData();
                option.text = options[i];
                optionDatas.Add(option);
            }
        }
        m_dropdown.AddOptions(optionDatas);
    }
    /// <summary>
    /// 添加或者清空事件 不传参或者null清空事件
    /// </summary>
    /// <param name="action"></param>
    public void DropDownEventCtrl(Action<int> action=null)
    {
        DropDownEvent += action;
    }
    public void OnClickEventCtrl(Action<bool,int,float> action = null)
    {
        OpenOrCloseEvent += action;
    }

}

该代码挂在编辑好的DropDown上,由于DropDown没有展开和关闭的事件监听,所以我做了一个能够检测到展开关闭的事件OpenOrCloseEvent,思路是在点击展开时系统会生成一个叫做DropDown List的控件,该控件就是基于Template生成的,所以我写了一个脚本,专门在start和destory时触发OpenOrCloseEvent事件,看代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class TemplateEvent : MonoBehaviour {
    DropdownScript dropdownScript;
    float hight = 0;
    // Use this for initialization
    void Start () {
        dropdownScript = GetComponentInParent<DropdownScript>();
        hight = this.GetComponent<RectTransform>().rect.height+ dropdownScript.GetComponent<RectTransform>().rect.height;
        if (this.name == "Dropdown List")
        {
            if (dropdownScript.OpenOrCloseEvent != null)
            {
                
                dropdownScript.OpenOrCloseEvent(true, dropdownScript.m_ids, hight);
            }
        }
	}
	
	// Update is called once per frame
	void Update () {
		
	}
    private void OnDestroy()
    {
        if (this.name == "Dropdown List")
        {
            if (dropdownScript.OpenOrCloseEvent != null)
            {
                dropdownScript.OpenOrCloseEvent(false, dropdownScript.m_ids, hight);
            }
        }
    }
}

该脚本挂在Template上
OpenOrCloseEvent有三个参数:分别为bool(开启关闭),int(当前的DropDown),float(当前选项框的长度+DropDown高度),下面我们就来为这两个事件添加内容监听,主要是OpenOrCloseEvent

}using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class SecondLevelPanel : MonoBehaviour {

    public DropdownScript m_dropdownScript;//下拉框预制体
    public Transform m_dropdownParent;//下拉框父物体

    List<DropdownScript> m_curDropdownScripts = new List<DropdownScript>();
    // Use this for initialization
    void Start () {
        List<string> options = new List<string>();
        for (int i = 0; i < 8; i++)
        {
            options.Add(("xx图片" + i));
        }
        for (int i = 0; i < 5; i++)
        {
            DropdownScript obj = Instantiate(m_dropdownScript, m_dropdownParent);
            float y = (-obj.GetComponent<RectTransform>().rect.height - 2 ) * i;
            Debug.Log("height : " + y);
            obj.GetComponent<RectTransform>().anchoredPosition = new Vector2(obj.GetComponent<RectTransform>().anchoredPosition.x, obj.GetComponent<RectTransform>().anchoredPosition.y+y);
            Debug.Log(obj.transform.localPosition);
            obj.InitDropdown("背景" + i,i, options);
            obj.DropDownEventCtrl(DropdownEvent);
            obj.OnClickEventCtrl(OnClickEvent);
            m_curDropdownScripts.Add(obj);
        }
	}
    /// <summary>
    /// 点击了控件的事件
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="index"></param>
    private void OnClickEvent(bool obj,int index,float hight)
    {
        if (obj)
        {
            foreach (var item in m_curDropdownScripts)
            {
                if (item.m_ids> index)
                {
                    float y = item.GetComponent<RectTransform>().anchoredPosition.y - hight;
                    item.GetComponent<RectTransform>().anchoredPosition = new Vector2(item.GetComponent<RectTransform>().anchoredPosition.x, y);
                }
            }
        }
        else
        {
            foreach (var item in m_curDropdownScripts)
            {
                if (item.m_ids > index)
                {
                    float y = item.GetComponent<RectTransform>().anchoredPosition.y + hight;
                    item.GetComponent<RectTransform>().anchoredPosition = new Vector2(item.GetComponent<RectTransform>().anchoredPosition.x, y);
                }
            }
        }
    }

    /// <summary>
    /// 下拉框事件
    /// </summary>
    /// <param name="obj"></param>
    private void DropdownEvent(int obj)
    {
        Debug.Log("进入 DropdownEvent");
    }

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

该脚本挂载在主控物体上,可以是场景里的任意物体,但不能是预制体
具体思路:点击了DropDown,展开时触发展开事件,其他控件加上其高度,收回时触发事件,其他控件减去其高度,演示效果如下:
在这里插入图片描述
那么这个qq的分组效果就实现了,最终所有生成的DropDown其父节点在一个Scroll View上面,如果有多个分组可以以滑动的方式显示!
希望这边帖子能给大家带来帮助!

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章           查看所有文章
加:2021-08-05 17:40:59  更:2021-08-05 17:42:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 4:37:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码