Unity菜单树模糊查询

接上周菜单树,链接: 菜单树生成.
菜单树的优势体现在便于上下级转换,但是当树的节点较多,深度较大的时候,想要找到某个节点,光靠一级一级展开也是麻烦
在这里插入图片描述
于是查询功能也就很有必要了。
首先创建一个InputField ,添加一个Button 搜索按钮,UI就搭成了,也可以再创建一个Text warning,作为查找无效时的警告提示。
在这里插入图片描述
接下来就是代码了,这里只是提供给大家一个思路,代码不一定拿到就能用,因为业务需求、数据内容都不一定一样

输入搜索信息,点击搜索,如果搜索到匹配的信息,那么将搜索到的菜单项显示不同的效果,同时如果菜单树是收起状态,则展开菜单树至搜索到的节点。还要能根据搜索字段,区别是完全匹配还是模糊搜索,以展现出不同的搜索结果。

我们拆开来操作,首先做个一搜索结果的显示效果,TreeViewControl使用的是GUISkin,我们可以创建一个GUISkin,修改Inspector面板的Button->Normal->BackGround,或者直接修改TextColor,如图:
在这里插入图片描述
然后修改TreeView插件的脚本,TreeView自带Hover、Unselected、Selected皮肤,我们需要做的就是添加一个Searched皮肤,具体修改的地方如图:
在这里插入图片描述
在TreeViewControl脚本中定义:

    public GUISkin m_skinSearched = null;

在TreeViewInspector脚本的ApplySkin方法中修改:

        foreach (TreeViewControl item in items)
        {
            if (null == item)
            {
                continue;
            }

            if (null == item.m_skinHover)
            {
                Debug.LogError("TreeView is missing Hover Skin");
                continue;
            }

            if (null == item.m_skinSelected)
            {
                Debug.LogError("TreeView is missing Selected Skin");
                continue;
            }

            if (null == item.m_skinUnselected)
            {
                Debug.LogError("TreeView is missing Unselected Skin");
                continue;
            }

            if(null == item.m_skinSearched)
            {
                Debug.LogError("TreeView is missing Searched Skin");
                continue;
            }

            // create new skin instance
            GUISkin skinHover = (GUISkin)Object.Instantiate(item.m_skinHover);
            GUISkin skinSelected = (GUISkin)Object.Instantiate(item.m_skinSelected);
            GUISkin skinUnselected = (GUISkin)Object.Instantiate(item.m_skinUnselected);
            GUISkin skinSearched = (GUISkin)Object.Instantiate(item.m_skinSearched);

            // name the skins
            skinHover.name = "Hover";
            skinSelected.name = "Selected";
            skinUnselected.name = "Unselected";
            skinSearched.name = "Searched";

            item.m_skinHover = skinHover;
            item.m_skinSelected = skinSelected;
            item.m_skinUnselected = skinUnselected;
            item.m_skinSearched = skinSearched;
        }

在TreeViewItem脚本中定义bool变量:

    public bool IsSearch = false;

DisplayItem方法中添加代码,实现搜索结果展现不同的显示效果(286行左右)

	if (IsSearch)
	{
		GUI.skin = ParentControl.m_skinSearched;
	}

实现模糊查询功能

	void Start()
	{
 		searchBtn = GameObject.Find("搜索按钮").GetComponent<Button>();
    	searchBtn.onClick.AddListener(delegate () { Search(searchField.text); });//搜索按钮点击事件监听
	}

	private TreeViewItem treeItem;
    private List<TreeViewItem> tmplist;
    private List<TreeViewItem> searchList;
    /// <summary>
    /// 搜索菜单树
    /// </summary>
    /// <param name="str"></param>
    public void Search(string str)
    {
        if (string.IsNullOrEmpty(str))
            return;
        Debug.Log("文本输入:" + str);
        tmplist = Example.treeViewItemList;//Example是TreeView插件的示例脚本,treeViewItemList是生成每一项菜单时添加的列表

        if ((treeItem = tmplist.Find(x => x.myName.Equals(str))) != null)
        {
            Debug.Log("查找到的为:" + treeItem.myName);
            treeItem.IsSearch = true;//更改搜索结果菜单项的显示效果
            treeItem.ParentControl.RootItem.IsExpanded = true;//默认根节点展开
            Invoke(nameof(EndSearch), 1f);//1秒钟后取消显示效果

            for (int i = 0; i < tmplist.Count; i++)//将所有查找到的祖先节点展开
            {
                for (int j = 0; j < treeItem.ancestors.Count; j++)
                {
                    if (tmplist[i].ID == treeItem.ancestors[j])
                        tmplist[i].IsExpanded = true;
                }
            }

        }
        else if ((searchList = tmplist.FindAll(x => x.myName.Contains(str)).ToList()).Count > 0)
        {
            for (int i = 0; i < searchList.Count; i++)
            {
                searchList[i].IsSearch = true;
                searchList[i].ParentControl.RootItem.IsExpanded = true;
                Debug.Log("查找到的为:" + searchList[i].myName);

                for (int j = 0; j < tmplist.Count; j++)
                {
                    for (int k = 0; k < searchList[i].ancestors.Count; k++)
                    {
                        if (tmplist[j].ID == searchList[i].ancestors[k])
                            tmplist[j].IsExpanded = true;
                    }
                }

            }
            Invoke(nameof(EndSearchList), 1f);
        }
        else
        {
            StartCoroutine(ReDisplay(true, inputFieldWarning.gameObject));
            inputFieldWarning.text = string.Format("未查询到有关\"{0}\"的节点!\n请重新输入", CalculatorStrLenth(str, 7));

            Debug.Log(string.Format("未查询到有关\"{0}\"的节点,请重新输入", str));
            searchField.text = "";
        }
    }
    /// <summary>
    /// 计算输入的字符串长度,超出长度的部分以省略号显示
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public string CalculatorStrLenth(string str, int len)
    {
        string tmp = str;
        if (str.Length > len)
        {
            tmp = string.Format("{0}...", str.Substring(0, len));
            return tmp;
        }
        return tmp;
    }

    public void EndSearch()//等待一秒钟后恢复之前的显示效果
    {
        treeItem.IsSearch = false;
    }

    public void EndSearchList()//等待一秒钟后恢复之前的显示效果
    {
        for (int i = 0; i < searchList.Count; i++)
        {
            searchList[i].IsSearch = false;
        }
    }

好了,基于TreeView的模糊查询功能到这边就完美达成了。若有纰漏会另行补充

Unity中的阴影锯齿问题可以通过调整LightmapParameters的Blur Radius和抗锯齿级别来解决。默认情况下,Unity的阴影贴图质量设置为最高级别,但如果效果不理想,可以创建自定义的LightmapParameters来进行调整。\[1\] 具体解决方法如下: 1. 创建新的LightmapParameters,可以通过右键菜单在Project下创建。 2. 减小Blur Radius(模糊半径)并增加抗锯齿级别,以达到更好的效果。 3. 确保Cutoff材质的Alpha贴图处理正确。边缘必须留出足够的“溢出”,以确保正确的阴影效果。\[1\] 此外,还可以通过调整Unity的项目设置来解决阴影锯齿问题。打开工具栏中的Edit->Project Settings,选择Levels,根据硬件适当调节设置。绿色代表当前的设置,确保修改的是当前的设置,以避免不必要的问题。\[2\] #### 引用[.reference_title] - *1* [解决Unity烘焙阴影锯齿精度不足的问题](https://blog.csdn.net/acwk0442/article/details/101502151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [unity 模型锯齿,阴影不正常,阴影不出现终极解决办法,都是踩过的坑啊](https://blog.csdn.net/qq_39097425/article/details/80922733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值