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

这篇具有很好参考价值的文章主要介绍了Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

效果

一键全局设置:
unity ui怎么设置背景,Unity3D,Unity3d 源码工程,编辑器拓展,Unity UI样式,Unity一键配置,Unity自定义拓展

单独设置:

unity ui怎么设置背景,Unity3D,Unity3d 源码工程,编辑器拓展,Unity UI样式,Unity一键配置,Unity自定义拓展

实现过程

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

UI搭建

UI的搭建也是常规的,Scroll Rect组件、Text和图片等组件构成。只不过需要注意的是,设置的背景图的额节点是兄弟节点,这个规则也可以按需要自行修改规则和代码。
unity ui怎么设置背景,Unity3D,Unity3d 源码工程,编辑器拓展,Unity UI样式,Unity一键配置,Unity自定义拓展

编辑器扩展

单独设置的按钮:
unity ui怎么设置背景,Unity3D,Unity3d 源码工程,编辑器拓展,Unity UI样式,Unity一键配置,Unity自定义拓展

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


    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        SetItemBGMgr bgMgr = (SetItemBGMgr)target;

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

一键全局设置:
unity ui怎么设置背景,Unity3D,Unity3d 源码工程,编辑器拓展,Unity UI样式,Unity一键配置,Unity自定义拓展

通过判断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
无法打开说明审核未通过。文章来源地址https://www.toymoban.com/news/detail-774847.html

到了这里,关于Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity读书系列《Unity3D游戏开发》——编辑器的结构

    本篇对应标题书籍的第二章编辑器的结构,也就是unity的编辑器的使用及菜单的使用。 当我们制作的软件或游戏需要多人合作时,就会使用git、svn进行版本管理。一般来说只保留Assets、ProjectSettings、Packages这几个文件夹,git会自动生成.git文件,我们添加需要屏蔽的文件夹或后

    2024年01月25日
    浏览(65)
  • Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程)

    在部分场景搭建中需要整齐摆放一些物品(如仓库中的货堆、货架等),因为有交互的操作在单个模型上,每次总是手动拖动模型操作起来也是繁琐和劳累。 在这背景下,我编写了一个在运行或者编辑状态下都可以进行一键排序模型的脚步。方便在场景搭建时,可以快速搭建

    2024年01月17日
    浏览(49)
  • Unity3d C#利用本地网页快速打开萤石云监控视频流(ezopen)实现云台,声音等控制,支持WebGL平台,替代UMP播放(含源码)

    之前我介绍了替代Universal?Media?PlayerUMP播放石云监控视频流(ezopen)的功能,效果还是很明显的,笔者的测试是差不多3-5秒就能打开监控画面,不过稍微遗憾的是,之前的功能是iframe打开石云提供的播放网页的形式,功能基本只有画质切换,声音开关等;具体可以移步查看(https

    2024年02月13日
    浏览(42)
  • 【Unity3D热更新】Unity3D 零成本、高性能的C#的热更新框架:HybridCLR

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 相信只要做过热更新的小伙伴,都被热更新搞过心态吧。 我有一个小伙伴,本来是面向

    2024年01月16日
    浏览(45)
  • Unity3D中的C#协程(概念、使用方法、底层原理)

             Unity3D 中的协程是针对 Unity3D 框架和 C# 编程语言定制的 ,具有便捷的使用方式和良好的效率。其他语言Python、Lua等也支持协程,但是底层实现的细节可能不同。在 Unity3D 引擎中, 协程被 Unity3D 引擎的主循环所驱动 。         协程(Coroutine)是一种编程概念

    2024年02月08日
    浏览(46)
  • Unity3D学习记录04——利用射线实现角色类似LOL的移动

    首先新建一个空白的GameObject,挂在一个MouseManager的脚本 实现思路: 通过获取鼠标点击的位置,获得该位置的信息,然后使角色移动到该位置 MouseManager脚本的代码如下:   代码解释: 先创建了一个Action类型的事件OnMouseClicked 这个是C#中事件的内容,我们可以在满足条件的时

    2024年02月08日
    浏览(49)
  • C#的Random与Unity3D的Random.Range()

    目录 C#的Random Unity3D的Random.Range() 在C#中,Random类用于生成伪随机数。它位于System命名空间下,所以要在代码中使用Random类,需要添加以下using语句: 在创建Random对象时,可以选择使用当前时间作为种子,也可以指定一个整数值作为种子。如果使用相同的种子来创建Random对象,

    2024年02月16日
    浏览(31)
  • Unity3D C# 中foreach的GC产出(2023年带数据)

    注意:笔者有点被杠怕了…确实也不严谨,也怕看不到,所以开头这里加一句:foreach本身不会产生GC,产生GC的原因是foreach使用了迭代器Enumerator,而取决于容器的不同,有些迭代器的初始化会产生GCAlloc… 很多读者在听一些群内大佬谈话过程中可能会听说 foreach遍历集合会产生

    2024年02月16日
    浏览(42)
  • Unity3D实现第一人称移动,随鼠标转动视角+上楼梯(C#)

    第一人称移动: 1、在层级面板创建一个Capsule,命名为Player,将层级面板中的相机拖到Player下方 2、重置Player和摄像机的Transform数值(方便调整摄像机在Player上的位置),然后调整摄像机在Player上的位置 大概将摄像机放到Player眼睛的位置即可。 3、创建一个脚本,命名为Came

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包