Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

news2024/11/18 15:23:51

前言

在开发UI滚动列表的时候,经常会有每项的背景图不统一的情况,会间隔重复的情况居多。这种情况下,手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下,笔者尝试写个小工具,在搭建UI时配置一下循环背景的样式,可以通过一键点击后设置UI背景的样式,省去繁琐的过程,如果多个列表的样式更改,也提供全局的一键设置背景设置按钮。同时提供了动态设置的接口,方便在动态请求数据的时候设置背景样式。

效果

一键全局设置:
在这里插入图片描述

单独设置:

在这里插入图片描述

实现过程

其核心思路是对UI的image组件的颜色和图片进行修改,配置的样式为数组的形式,通过循环的方式,遍历每个子节点和配置的样式,循环滚动的设置。至于Unity3d的编辑器扩展则是在Editor文件夹下,继承Editor类,通过GUILayout.Button新增设置背景的按钮。[MenuItem("0)]来新增菜单的设置按钮。本工程是基于Unity3d 2020.3.28f1c1个人版本实现,其它版本可能会有不兼容情况,请慎重使用。

UI搭建

UI的搭建也是常规的,Scroll Rect组件、Text和图片等组件构成。只不过需要注意的是,设置的背景图的额节点是兄弟节点,这个规则也可以按需要自行修改规则和代码。
在这里插入图片描述

编辑器扩展

单独设置的按钮:
在这里插入图片描述

这里是每个配置项的Inspector中可以单独进行点击,通过编写脚本的Editor的OnInspectorGUI函数进行实现:


    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        SetItemBGMgr bgMgr = (SetItemBGMgr)target;

        if (GUILayout.Button("设置子节点背景样式",new GUILayoutOption[] { GUILayout.ExpandWidth(false) }))
        {
            bgMgr.SetItemChildrenBG();
        }
     }

一键全局设置:
在这里插入图片描述

通过判断UNITY_EDITOR编辑器下才生效,否则打包会报错。通过MenuItem新增一个菜单选项,并设置了快捷键Shift + B

#if UNITY_EDITOR
    [MenuItem("设置子节点背景/刷新所有 #b", false, 1000)]
#endif
    public static void RefreshAllItemBG()
    {
        Debug.Log("刷新所有背景");
/*        SetItemBGMgr[] sim = Transform.root..<SetItemBGMgr>(true);
        for (int i = 0; i < sim.Length; i++)
            sim[i].SendMessage("SetItemChildrenBG");*/
        instance?.BroadcastMessage("SetItemChildrenBG");
    }

这里的一键全局设置功能有一些需要说明一下的点,由于使用了BroadcastMessage函数来广播消息,所以SetAllBGMgr需要挂在跟节点上,这样才能将消息广播到各个节点。还有一点是如果被设置的UI是active为false的状态时,是不会进行刷新的,因为它收不到广播的消息。后续会看这个问题有没有优化空间。

样式功能

样式的配置如图:

主要是图片和颜色的数组,默认是设置图片的数组,如果需要图片+颜色的模式需要勾选IsSpAndCol选项。
配置参数的代码如下:

    [Header("背景图片(优先生效)")]
    public Sprite[] sprites;


    [Header("背景颜色")]
    [Tooltip("优先级低于图片,IsSpAndCol时也生效,注意颜色数量和图片数量得一致")]
    public Color32[] colors;


    [Header("图片和颜色都生效")]
    [Tooltip("注意颜色数量和图片数量得一致")]
    public bool IsSpAndCol = false;

脚本在收到广播SetItemChildrenBG消息的时候,会进行样式的刷新:

for (int i = 0; i < transform.childCount; i++)
        {
            Image TempImg = transform.GetChild(i).GetComponent<Image>();
            if (TempImg)
            {
                if (!TempImg.gameObject.activeSelf)
                    continue;
                if (sprites != null && sprites.Length > 0)
                {
                    TempImg.sprite = sprites[idx];
                    if (IsSpAndCol) {
                        if (colors != null && colors.Length > 0 && idx < colors.Length)
                        {
                            TempImg.color = colors[idx];
                        }
                        else
                        {
                            Debug.LogWarning("设置背景样式失败,请检查[" + transform.name + "]的背景颜色配置");
                        }
                    }
                    idx = (idx >= (sprites.Length - 1)) ? 0 : idx+1;
                }
                else if (colors != null && colors.Length > 0)
                {
                    TempImg.color = colors[idx];
                    idx = (idx>=(colors.Length -1))?0:idx++;
                }
                else
                {
                    Debug.LogWarning("设置背景样式失败,请检查["+ transform.name+"]的背景图片/颜色配置");
                }
            }
            else {
                Debug.LogWarning(transform.GetChild(i).name + " 设置背景样式失败,请检查其是否有Image组件");
            }
        }

如果动态请求数据(如:请求api的数据进行刷新UI时),等子节点全部创建而且数据全部刷新完成后,代码中调用一次即可

SetItemChildrenBG();

由于这里的样式需求是在预先搭建UI和动态请求数据刷新的情况,而且有active为false的情况下全局无效的情况。如果为了确保设置的样式肯定会生效,可以尝试在Start()函数中刷新一遍样式:

    void Start()
    {
        SetItemChildrenBG();
     }

源码工程

https://download.csdn.net/download/qq_33789001/88644030
无法打开说明审核未通过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1322606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何打造自己的知识付费小程序平台

在当今知识付费的浪潮中&#xff0c;我们经常可以看到各种知识付费平台如雨后春笋般涌现。然而&#xff0c;这些平台往往只是一个过客&#xff0c;让我们短暂停留后&#xff0c;便淹没在信息的海洋中。如果你有一个出色的课程&#xff0c;为什么不让它在一个属于你自己的平台上…

人工智能与自动驾驶:智能出行时代的未来之路

一、前言 首先&#xff0c;我们先来说下什么是人工智能&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机系统能够模拟、仿真人类智能的技术和科学领域。它涉及构建智能代理&#xff0c;使其能够感知环境、理解和…

Linux多版本cuda切换

目标 将cuda版本从10.0切换为11.1 步骤 查看当前cuda版本&#xff1a; nvcc -V编辑.bashrc文件&#xff1a; vim ~/.bashrc在文件中添加以下几行&#xff08;若已存在则忽略&#xff09;&#xff1a; export PATH$PATH:/usr/local/cuda/bin export LD_LIBRARY_PATH$LD_LI…

Android解决报错 superclass access check failed: class

Android解决报错 superclass access check failed: class 前言&#xff1a; 最近在打开之前的项目demo时&#xff0c;出现一个错误Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner 1.错误信息如下&#xff1a; Executio…

【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(3-储存方式)

这里写目录标题 Ehcache的存储方式堆内存&#xff08;MemoryStore&#xff09;指定可用内存Xml代码Xml代码Xml代码 驱除策略元素过期Xml代码 非堆内存&#xff08;BigMemory&#xff09;磁盘&#xff08;DiskStore&#xff09;指定可用容量Xml代码 元素过期 Ehcache的存储方式 …

外卖系统海外版:技术智能引领全球美食新潮流

随着全球数字化浪潮的推动&#xff0c;外卖系统海外版不仅是食客们品味美食的便捷通道&#xff0c;更是技术智能在美食领域的引领者。本文将深入剖析其背后的技术实现&#xff0c;揭开代码带来的美食革新。 多语言支持&#xff1a;构建全球美食沟通桥梁 def multilingual_su…

【UE5.1】M4自动地形材质+UltraDynamicSky+Oceanology插件的使用记录

目录 效果 步骤 一、项目准备 二、插件使用记录 准备过程 M4自动地形插件使用过程 超动态天空插件使用过程 运行时修改天空效果 运行时修改天气效果 海洋插件使用过程 在海洋中游泳 效果 步骤 一、项目准备 1. 创建一个第三人称游戏工程 2. 将M4文件夹和Ultr…

【Java】网络编程-UDP字典服务器客户端简单代码编写

上文讲了UDP回响服务器客户端简单代码编写 本文将讲述UDP字典服务器客户端简单代码编写。所谓回显&#xff0c;就是指客户端向服务器发送一个报文&#xff0c;从服务器那里得到一条一模一样的回响报文 而我们的字典功能呢&#xff0c;则是实现了输入中文&#xff0c;得到对应…

Spring事务浅析

一:Spring事务简介 什么是事务&#xff1a; 数据库事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;这些操作要么一起成功&#xff0c;要么一起失败&#xff0c;是一个不可分割的工作单元。 在我们日常工作中&#xff0c;涉及到事务的场景非常多&#xff0c;一个…

MyBatis持久层框架

四、MyBatis持久层框架 目录 一、Mybatis简介 1. 简介2. 持久层框架对比3. 快速入门&#xff08;基于Mybatis3方式&#xff09; 二、日志框架扩展 1. 用日志打印替代sout2. Java日志体系演变3. 最佳拍档用法4. Lombok插件的使用 4.1 Lombok简介4.2 Lombok安装4.3 Lombok使用注…

Kioptrix-1

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-18 20:02 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00025s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 0bc…

卷积神经网络的学习与实现

基于matlab的卷积神经网络(CNN)讲解及代码_matlab中如何查看cnn损失函数-CSDN博客 可以看到与BP神经网络相比&#xff0c;卷积神经网络更加的复杂&#xff0c;这里将会以cnn作为学习案例。 1.经典反向传播算法公式详细推导 这里引用经典反向传播算法公式详细推导_反向目标公…

javaSE学习-4-类和对象

1. 面向对象的初步认知 1.1 什么是面向对象 面向对象编程&#xff08;OOP&#xff09;是一种程序设计范式&#xff0c;它将程序中的数据和操作数据的方法封装到对象中。在面向对象的世界里&#xff0c;一切都被视为对象&#xff0c;这些对象可以拥有数据&#xff08;成员变量&…

Unity 通过代码将一张大图切成多个小图的方法

在Unity 中要通过代码将一张贴图切割成多张小图&#xff0c;可以使用以下方法&#xff1a; /// <summary>/// 把一张图片切割成多张使用/// </summary>/// <param name"texture">原图</param>/// <param name"rows">切割的行…

Matlab智能优化算法学习笔记(一)——粒子群算法、模拟退火算法、遗传算法、蚁群算法

文章目录 粒子群算法△ matlab工具箱粒子群函数○ 代码○○ 手搓代码实现粒子群优化 2个变量&#xff08;xy&#xff09;的粒子群优化尝试 定义函数 绘制网格图&#xff08;用来可视化过程&#xff09; 参数初始化&#xff0c;绘制粒子初始位置 开始迭代过程并绘图 获取结果并绘…

计算机毕业设计—基于Koa+vue的高校宿舍管理系统宿舍可视化系统

项目介绍 项目背景 随着科技的发展&#xff0c;智能化管理越来越重要。大学生在宿舍的时间超过了1/3&#xff0c;因此良好的宿舍管理对学生的生活和学习极为关键。学生宿舍管理系统能够合理安排新生分配宿舍&#xff0c;不浪费公共资源&#xff0c;减轻学校管理压力&#xff…

[C++] 多态(下) -- 多态原理 -- 动静态绑定

文章目录 1、多态原理2、动态绑定和静态绑定3、单继承和多继承关系的虚函数表3.1 单继承中的虚函数表5.2 多继承中的虚函数表 上一篇文章我们了解了虚函数表&#xff0c;虚函数表指针&#xff0c;本篇文章我们来了解多态的底层原理&#xff0c;更好的理解多态的机制。 [C] 多态…

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…

Python+pip下载与安装

Hi, I’m Shendi Pythonpip下载与安装 最近有识别图片中物体的需求&#xff0c;于是选用了TensorFlow&#xff0c;在一番考虑下&#xff0c;还是选择直接使用Python。 Python下载安装 直接在搜索引擎搜索Python或通过 https://www.python.org 进入官网 在 Downloads 处点击 Al…

腾讯云debian服务器的连接与初始化

目录 1. 远程连接2. 软件下载3. 设置开机自启动 1. 远程连接 腾讯云给的服务器在安装好系统之后&#xff0c;只需要在防火墙里面添加一个白名单&#xff08;ip 或者域名&#xff09;就能访问了。 防火墙添加本机WLAN的IPv4白名单&#xff0c;本地用一个远程工具连接&#xff…