Unity 显示MeshRenderer的渲染层级

news2024/11/25 10:48:53

Unity 显示MeshRenderer的渲染层级

  • 前言
  • 源码
    • MeshRendererInspector
    • SkinnedMeshRendererInspector
  • 参考

前言

Mesh RendererSkinned Mesh Renderer组件默认不显示Order,找了个工具显示一下。
Skinned Mesh Renderer
Mesh Renderer

源码

下面两个代码放入Editor文件夹中

MeshRendererInspector

MeshRendererInspector.cs


using UnityEngine;
using UnityEditor;
using System.Reflection;
using System;
using UnityEditorInternal;

[CustomEditor(typeof(MeshRenderer)), CanEditMultipleObjects]
public class MeshRendererInspector : Editor
{

    //Armazena Sorting Layer criadas no unity
    private string[] sortingLayerNames;

    //Order
    private int sortingOrder;

    //Layer
    private int sortingLayer;

    //Objetos selecionados
    private MeshRenderer[] renderer;

    //Se todos os objetos selecionado possuem os mesmos valores
    private bool sortingLayerEqual;
    private bool sortingOrderEqual;


    void OnEnable()
    {
        //Cache de Sorting Layer criadas.
        sortingLayerNames = GetSortingLayerNames();

        //Recupera objetos selecionados
        System.Object[] objects = serializedObject.targetObjects;

        //Armazena valores iniciais
        MeshRenderer first = objects[0] as MeshRenderer;
        sortingOrder = first.sortingOrder;
        string layerName = first.sortingLayerName;
        sortingLayer = Mathf.Max(System.Array.IndexOf(sortingLayerNames, layerName), 0);

        //Cast
        renderer = new MeshRenderer[objects.Length];
        //Igualdade entre multiobjects
        sortingLayerEqual = true;
        sortingOrderEqual = true;
        for (int i = 0; i < objects.Length; i++)
        {
            //Cast
            renderer[i] = objects[i] as MeshRenderer;
            //Verifica se todos os objetos possuem o mesmo valor
            if (renderer[i].sortingOrder != sortingOrder) sortingOrderEqual = false;
            if (renderer[i].sortingLayerName != layerName) sortingLayerEqual = false;
        }
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        EditorGUILayout.Space();

        /**
		 * SORTING Layer
		 **/
        EditorGUI.BeginChangeCheck();

        //UI
        EditorGUI.showMixedValue = !sortingLayerEqual;
        sortingLayer = EditorGUILayout.Popup(sortingLayer, sortingLayerNames);

        //Aplicar modificacoes e igualar valores
        if (EditorGUI.EndChangeCheck())
        {
            foreach (MeshRenderer r in renderer)
            {
                r.sortingLayerName = sortingLayerNames[sortingLayer];
                EditorUtility.SetDirty(r);
            }
            sortingLayerEqual = true;
        }


        /**
		 * SORTING ORDER
		 **/
        EditorGUI.BeginChangeCheck();

        //UI
        EditorGUI.showMixedValue = !sortingOrderEqual;
        sortingOrder = EditorGUILayout.IntField("Order in Layer", sortingOrder);

        //Aplicar modificacoes e igualar valores
        if (EditorGUI.EndChangeCheck())
        {
            foreach (MeshRenderer r in renderer)
            {
                r.sortingOrder = sortingOrder;
                EditorUtility.SetDirty(r);
            }
            sortingOrderEqual = true;
        }
    }

    public string[] GetSortingLayerNames()
    {
        Type t = typeof(InternalEditorUtility);
        PropertyInfo prop = t.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic);
        return (string[])prop.GetValue(null, null);
    }

}


SkinnedMeshRendererInspector

SkinnedMeshRendererInspector.cs

using UnityEngine;
using UnityEditor;
using System.Reflection;
using System;
using UnityEditorInternal;

[CustomEditor(typeof(SkinnedMeshRenderer)), CanEditMultipleObjects]
public class SkinnedMeshRendererInspector : Editor
{
    //存储 Sorting Layer
    private string[] sortingLayerNames;

    //Order
    private int sortingOrder;

    //Layer
    private int sortingLayer;

    //选中的对象
    private SkinnedMeshRenderer[] renderer;

    //所有选中对象是否具有相同的值
    private bool sortingLayerEqual;
    private bool sortingOrderEqual;

    void OnEnable()
    {
        //获取 Sorting Layer
        sortingLayerNames = GetSortingLayerNames();

        //获取选中的对象
        System.Object[] objects = serializedObject.targetObjects;

        //存储初始值
        SkinnedMeshRenderer first = objects[0] as SkinnedMeshRenderer;
        sortingOrder = first.sortingOrder;
        string layerName = first.sortingLayerName;
        sortingLayer = Mathf.Max(System.Array.IndexOf(sortingLayerNames, layerName), 0);

        //转换
        renderer = new SkinnedMeshRenderer[objects.Length];
        //是否所有对象具有相同的值
        sortingLayerEqual = true;
        sortingOrderEqual = true;
        for (int i = 0; i < objects.Length; i++)
        {
            //转换
            renderer[i] = objects[i] as SkinnedMeshRenderer;
            //检查所有对象是否具有相同的值
            if (renderer[i].sortingOrder != sortingOrder) sortingOrderEqual = false;
            if (renderer[i].sortingLayerName != layerName) sortingLayerEqual = false;
        }
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        EditorGUILayout.Space();

        /**
         * SORTING Layer
         **/
        EditorGUI.BeginChangeCheck();

        //UI
        EditorGUI.showMixedValue = !sortingLayerEqual;
        sortingLayer = EditorGUILayout.Popup(sortingLayer, sortingLayerNames);

        //应用修改和同步值
        if (EditorGUI.EndChangeCheck())
        {
            foreach (SkinnedMeshRenderer r in renderer)
            {
                r.sortingLayerName = sortingLayerNames[sortingLayer];
                EditorUtility.SetDirty(r);
            }
            sortingLayerEqual = true;
        }

        /**
         * SORTING ORDER
         **/
        EditorGUI.BeginChangeCheck();

        //UI
        EditorGUI.showMixedValue = !sortingOrderEqual;
        sortingOrder = EditorGUILayout.IntField("Order in Layer", sortingOrder);

        //应用修改和同步值
        if (EditorGUI.EndChangeCheck())
        {
            foreach (SkinnedMeshRenderer r in renderer)
            {
                r.sortingOrder = sortingOrder;
                EditorUtility.SetDirty(r);
            }
            sortingOrderEqual = true;
        }
    }

    public string[] GetSortingLayerNames()
    {
        Type t = typeof(InternalEditorUtility);
        PropertyInfo prop = t.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic);
        return (string[])prop.GetValue(null, null);
    }
}

参考

Unity 3d : Expose the rendering order of MeshRenderer in the Unity3D

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

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

相关文章

互联网高频面:输入URL按下回车后,中间发生了什么

题目 输入URL按下回车后&#xff0c;中间发生了什么 这个问题其实是计算机网络里面很经典的一个问题&#xff0c;不能去死机硬背&#xff0c;很考察对网络架构和通信原理的理解&#xff0c;也是各个互联网大厂喜欢考察的面试题。 一些图片参考了小林的计算机网络面经 从输入…

Elasticsearch基础操作

一、Restful接口 Elasticsearch通过RESTful接口提供与其进行交互的方式。在ES中&#xff0c;提供了功能丰富的RESTful API的操作&#xff0c;包括CRUD、创建索引、删除索引等操作。你可以用你最喜爱的 web 客户端访问 Elasticsearch 。事实上&#xff0c;你甚至可以使用 curl …

C#,文字排版的折行问题(Word-wrap problem)的算法与源代码

1、英文的折行问题 给定一个单词序列&#xff0c;以及一行中可以输入的字符数限制&#xff08;线宽&#xff09;。 在给定的顺序中放置换行符&#xff0c;以便打印整齐。 假设每个单词的长度小于线宽。 像MS word这样的文字处理程序负责放置换行符。 这个想法是要有平衡的线条。…

Android基础开发-通讯录的添加和查询

案例&#xff1a;往手机通讯录添加信息&#xff0c;输入姓名和手机号。 保存的手机的表&#xff1a;一共有两个&#xff0c;一个是主表&#xff0c;提供一个联系人id&#xff0c;另外是辅表&#xff0c;提供id对应的手机号和姓名。 普通操作&#xff1a;一个表一个表的添加 …

ThingsBoard开源物联网平台介绍

1. Thingsboard 简介 ThingsBoard是一个基于Java的开源物联网平台&#xff0c;旨在实现物联网项目的快速开发、管理和扩展。它使用行业标准的物联网协议&#xff08;MQTT、CoAP和HTTP&#xff09;实现设备连接&#xff0c;并支持云和本地部署。ThingsBoard结合了可扩展性、容错…

synchronized关键字(锁升级)

概述 synchronized是Java的一个关键字&#xff0c;用来保证多线程下临界区资源的共享安全性 synchronized可以加在方法上&#xff08;静态方法和普通方法&#xff09;、代码块上 使用语法&#xff1a; synchronized (对象) {// 操作临界资源 }public synchronized void te…

云起云落:揭秘云计算基础内功心法

文章目录 云计算基本概念云计算发展历程云计算计算模式云计算商业模式云计算部署模式私有云部署公有云部署混合云部署 云计算虚拟化技术虚拟机模式虚拟化容器模式虚拟化容器VS虚拟机 常见虚拟化工具和技术虚拟化工具“轻量级”虚拟化工具 云计算供应商云计算三要点&#xff08;…

用miniconda建立PyTorch、Keras、TensorFlow三个环境

一、配置清华镜像conda源 由于网络问题&#xff0c;直接使用conda默认的源下载包可能会非常慢。为了解决这个问题&#xff0c;可以配置国内镜像源来加速包的下载。清华大学TUNA协会提供了一个常用的conda镜像源。下面是如何配置清华镜像源的步骤&#xff1a; 1. 配置清华conda…

案例分析篇14:信息系统安全设计考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

多维时序 | Matlab实现VMD-CNN-LSTM变分模态分解结合卷积神经网络结合长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-LSTM变分模态分解结合卷积神经网络结合长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-LSTM变分模态分解结合卷积神经网络结合长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介…

ARM64汇编06 - 基本整型运算指令

ADD (immediate) 将 Xn 与 imm 相加&#xff0c;结果赋值给 Xd&#xff0c;imm 是无符号数&#xff0c;范围为 0 - 4095。 shift 是对 imm 进行移位&#xff0c;shift 为 0 的时候&#xff0c;表示左移 0 位&#xff0c;即不变。shift 为 1 的时候&#xff0c;表示左移12 位&a…

Django 学习笔记(Day1)

「写在前面」 本文为千锋教育 Django 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 Django 快速入门 1.1 Django 介绍 1.2 Django 安装 1.3 创建 Django 项目 1.4 运行 Django 项目 1.5 数据迁…

使用 Ruby 或 Python 在文件中查找

对于经常使用爬虫的我来说&#xff0c;在大多数文本编辑器都会有“在文件中查找”功能&#xff0c;主要是方便快捷的查找自己说需要的内容&#xff0c;那我有咩有可能用Ruby 或 Python实现类似的查找功能&#xff1f;这些功能又能怎么实现&#xff1f; 问题背景 许多流行的文本…

vite 安装tailwindcss失效

需求&#xff1a;在vite5 vue3 ts中安装tailwindcss 问题&#xff1a;按照tailwindcss的官方文档进行安装&#xff0c;可是一直不生效 解决方式&#xff1a; 在mian.ts 里面导出 style.css 文件 就可以了哈

【HomeAssistant新版文件管理器】

【HomeAssistant新版文件管理器】 1. 前言2. 地址3. 安装4. 使用方法5. 总结欢迎大家阅读2345VOR的博客【Home Assistant 之QQ邮箱推送提醒】🥳🥳🥳2345VOR鹏鹏主页: 已获得CSDN《嵌入式领域优质创作者》称号🎉🎉、阿里云《arduino专家博主》👻👻👻,座右铭:…

基于Springboot的预报名管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的预报名管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

从根到叶:深入了解Map和Set

窗间映出一片高远的天空&#xff0c; 向晚的天际宁静而又清明。 我孤独的心灵在幸福地哭泣&#xff0c; 它在为天空如此美好而高兴。 恬静的晚霞一片火红&#xff0c; 晚霞灼烧着我的热情。 此刻的世界没有别人&#xff0c; 只有上帝&#xff0c;我和天空。 ——&#x…

【vivado】 clock wizard 时钟IP

一、前言 MMCM和PLL是在FPGA设计中不可避免需要使用到的时钟资源&#xff0c;对于其功能及使用方法的理解是正确进行FPGA设计的前提。 二、Xilinx 时钟 IP配置 vivado中使用时钟向导(Clocking Wizard)配置时钟IP核&#xff0c;其框图如下&#xff1a; clk_in 输入时钟&#…

Grafana

介绍 官网&#xff1a;https://grafana.com/ Grafana 是一个开源的指标分析和可视化工具&#xff0c;它被广泛用于展示和监控云基础设施和应用程序的实时数据。Grafana 提供了一个强大且易于使用的界面&#xff0c;允许用户创建各种图表、图形和仪表盘&#xff0c;以直观地展…

【漏洞复现】大华智慧园区综合管理平台SQL注入漏洞

Nx01 产品简介 大华智慧园区综合管理平台是一款综合管理平台&#xff0c;具备园区运营、资源调配和智能服务等功能。该平台旨在协助优化园区资源分配&#xff0c;满足多元化的管理需求&#xff0c;同时通过提供智能服务&#xff0c;增强使用体验。 Nx02 漏洞描述 大华智慧园区…