Unity自定义编辑器:基于枚举类型动态显示属性


1.参考链接

2.应用 target并设置多选编辑 添加[CanEditMultipleObjects]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(LightsState))]
[CanEditMultipleObjects]
public class TestInspector : Editor
{
    private SerializedObject obj;
    private LightsState lightsState;
    private SerializedProperty equipMentId_;
    private SerializedProperty powerType_;
    private SerializedProperty material;

    void OnEnable()
    {
        obj = new SerializedObject(target);
        material = obj.FindProperty("materialReplace");

        equipMentId_= obj.FindProperty("equipMentId");
        powerType_= obj.FindProperty("powerType");
    }

    public override void OnInspectorGUI()
    {
        obj.Update();
        EditorGUILayout.PropertyField(equipMentId_);
        EditorGUILayout.PropertyField(powerType_);

        lightsState = (LightsState)target;
        lightsState.lightType = (LightType)EditorGUILayout.EnumPopup("信号灯类型切换-", lightsState.lightType);

        if (lightsState.lightType == LightType.柜体指示灯)
        {
            EditorGUILayout.PropertyField(material);
        }
        // 保存更改  
        obj.ApplyModifiedProperties();
    }
}
/****************************************************************************
 *  #SMARTDEVELOPERS#
 *  项目名称:#PROJECTNAME#
 *  描述: xxxxxxxxxxxxx
 *  版本: V1.00
 *  创建人: ****
 *  创建时间: #CREATETIME#
 *  程序修改记录(最新的放在最前面):
 * <版本号> <修改日期>, <修改人员>: <修改功能概述>
 * **************************************************************************/
using Custom;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LightsState : MonoBehaviour
{
    [Header("设备id")]
    public string equipMentId;
    [Header("指示灯类型")]
    public LightType lightType;
    [Header("电源四个孔判断")]
    public ButtonPosition powerType;
    public Material materialReplace;
    //led
    private Image image_light;
    private Color colorDefaultLed;
    //柜体
    private MeshRenderer meshrenderer;
    private Material materialdefault;
    private void Awake()
    {
        Init();
    }
    void Init()
    {
        switch (lightType)
        {
            case LightType.页面Led信号灯:
                image_light = GetComponent<Image>();
                colorDefaultLed = image_light.color;
                break;
            case LightType.柜体指示灯:
                meshrenderer = GetComponent<MeshRenderer>();
                materialdefault = meshrenderer.material;
                break;
            default:
                break;
        }
    }
    private void OnEnable()
    {
        MessageCenter.Instance.RegisterListener((Enum)(MessageFanType.SignalState), InvokeMessage);
        MessageCenter.Instance.RegisterListener((Enum)(MessageFanType.Totalpower), InvokeMessageTotalpower);
        UpdateState();
    }
    void InvokeMessage(Message message)
    {
        switch (powerType)
        {
            case ButtonPosition.ShallowHoleOne:
            case ButtonPosition.CenterOne:
                if (PowerManagement.LeftPower == 1)
                {
                    //左侧总电源
                    //---------------------
                    SingleStateData singleStateData = (SingleStateData)message.Body;
                    if (singleStateData.equipmentid == equipMentId)
                    {
                        switch (lightType)
                        {
                            case LightType.页面Led信号灯:
                                ExturedLedLight(singleStateData.state);
                                break;
                            case LightType.柜体指示灯:
                                ExturedMaterialLight(singleStateData.state);
                                break;
                            default:
                                break;
                        }

                    }
                }
                else
                {

                }
                break;
            case ButtonPosition.ShallowHoleTwo:
            case ButtonPosition.CenterTwo:
                if (PowerManagement.RightPower == 1)
                {
                    //右侧总电源
                    //---------------------
                    SingleStateData singleStateData = (SingleStateData)message.Body;
                    if (singleStateData.equipmentid == equipMentId)
                    {
                        switch (lightType)
                        {
                            case LightType.页面Led信号灯:
                                ExturedLedLight(singleStateData.state);
                                break;
                            case LightType.柜体指示灯:
                                ExturedMaterialLight(singleStateData.state);
                                break;
                            default:
                                break;
                        }

                    }
                }
                else
                {

                }
                break;
            default:
                break;
        }
       
    }
    void InvokeMessageTotalpower(Message message)
    {
        UpdateState();
    }
    /// <summary>
    /// 手动更新 
    /// </summary>
    public void UpdateState()
    {
        if (string.IsNullOrEmpty(equipMentId))
        {
            Debug.LogWarning("设备id未赋值:" + transform.name);
            return;
        }

        if (SystemDataSet.AllData_YX.ContainsKey(equipMentId))
        {
            switch (powerType)
            {
                case ButtonPosition.ShallowHoleOne:
                case ButtonPosition.CenterOne:
                    if(PowerManagement.LeftPower == 1)
                    {
                        switch (lightType)
                        {
                            case LightType.页面Led信号灯:
                                ExturedLedLight(SystemDataSet.AllData_YX[equipMentId].pointStatus);
                                break;
                            case LightType.柜体指示灯:
                                ExturedMaterialLight(SystemDataSet.AllData_YX[equipMentId].pointStatus);
                                break;
                            default:
                                break;
                        }
                    }
                    else
                    {
                        //只做信号灯更新 不做改值
                        switch (lightType)
                        {
                            case LightType.页面Led信号灯:
                                ExturedLedLight(0);
                                break;
                            case LightType.柜体指示灯:
                                ExturedMaterialLight(0);
                                break;
                            default:
                                break;
                        }

                    }
                    break;
                case ButtonPosition.ShallowHoleTwo:
                case ButtonPosition.CenterTwo:
                    if (PowerManagement.RightPower == 1)
                    {
                        switch (lightType)
                        {
                            case LightType.页面Led信号灯:
                                ExturedLedLight(SystemDataSet.AllData_YX[equipMentId].pointStatus);
                                break;
                            case LightType.柜体指示灯:
                                ExturedMaterialLight(SystemDataSet.AllData_YX[equipMentId].pointStatus);
                                break;
                            default:
                                break;
                        }
                    }
                    else
                    {
                        //只做信号灯更新 不做改值
                        switch (lightType)
                        {
                            case LightType.页面Led信号灯:
                                ExturedLedLight(0);
                                break;
                            case LightType.柜体指示灯:
                                ExturedMaterialLight(0);
                                break;
                            default:
                                break;
                        }
                    }
                    break;
                default:
                    break;
            }
          
        }
    }
    /// <summary>
    /// led 灯
    /// </summary>
    void ExturedLedLight(int state)
    {
        if (state==0)
        {
            image_light.color = Color.cyan;
        }
        else
        {
            image_light.color = colorDefaultLed;
        }
    }
    /// <summary>
    /// 柜体灯
    /// </summary>
    void ExturedMaterialLight(int state)
    {
        if (state == 0)
        {
            meshrenderer.material = materialdefault;
        }
        else
        {
            if (materialReplace == null)
            {
                Debug.LogError("信号灯替换材质未赋值!!!" + transform.name);
            }
            else
            {
                meshrenderer.material = materialReplace;
            }
        }
    }
    private void OnDisable()
    {
        MessageCenter.Instance.RemoveListener(MessageFanType.SignalState, InvokeMessage);
        MessageCenter.Instance.RemoveListener(MessageFanType.Totalpower, InvokeMessageTotalpower);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《代码随想录》Day31打卡!

《代码随想录》贪心算法&#xff1a;合并区间 本题的完整题目如下所示&#xff1a; 本题的完整思路如下所示&#xff1a; 1.本题依然是先对数组的左边界进行排序。将数组的第一个元素赋值给current。 2.遍历数组&#xff0c;判断current中的右边界和当前元素的左边界是否有重叠…

灵活运用事务回滚,快捷处理多张数据表格

各位编程宝子们&#xff08;尤其是对MySQL了解不多的宝子们&#xff09;在使用关系表处理时&#xff0c;有时候会希望简单一次性解决多张表的数据处理&#xff0c;但又有时候无从下手。其实有时候掌握数据的事务和回滚便可以简单解决这些事情&#xff0c;接下来我将以一个学生信…

Github提交Pull Request教程 Git基础扫盲(零基础易懂)

1 PR是什么&#xff1f; PR&#xff0c;全称Pull Request&#xff08;拉取请求&#xff09;&#xff0c;是一种非常重要的协作机制&#xff0c;它是 Git 和 GitHub 等代码托管平台中常见的功能&#xff0c;被广泛用于参与社区贡献&#xff0c;从而促进项目的发展。 PR的整个过…

kvm 解决 安装windows 虚拟机cpu 核数问题

通过lscpu命令查到我本机的cpu信息如下 CPU(s): 12 —— 系统的总逻辑处理单元数量&#xff08;包括所有核心和逻辑处理器&#xff09;。Thread(s) per core: 2 —— 每个物理核心支持 2 个线程&#xff08;表示启用了超线程技术&#xff09;。Core(s) per socket: 6 —— 每个…

面向对象分析与设计Python版 面向对象分析方法

文章目录 前言一、名词法二、名词法-案例三、CRC卡片法四、分析模型法&#xff08;了解&#xff09; 前言 面向对象分析的目标&#xff1a;发现对象、定义对象之间的关系和属性。常用的面向对象分析方法有三种&#xff1a; 名词法CRC卡片法分析模型法 一、名词法 大型复杂系…

python基础和redis

1. Map函数 2. filter函数 numbers generate_numbers() filtered_numbers filter(lambda x: x % 2 0, numbers) for _ in range(5):print(next(filtered_numbers)) # 输出: 0 2 4 6 83. filter map 和 reduce 4. picking and unpicking 5. python 没有函数的重载&#xff0…

Vue2:el-table中的文字根据内容改变颜色

想要实现的效果如图,【级别】和【P】列的颜色根据文字内容变化 1、正常创建表格 <template><el-table:data="tableData"style="width: 100%"><el-table-column prop="id" label="ID"/> <el-table-column …

git提交

基本流程&#xff1a;新建分支 → 分支上开发(写代码) → 提交 → 合并到主分支 拉取最新代码因为当前在 master 分支下&#xff0c;你必须拉取最新代码&#xff0c;保证当前代码与线上同步&#xff08;最新&#xff09;&#xff0c;执行以下命令&#xff1a;bashgit pull orig…

Airflow:TimeSensor感知时间条件

在数据管道工作流中&#xff0c;任务可能需要在特定的时间执行&#xff0c;或者在继续之前等待一定的时间。为了满足这些需求&#xff0c;Apache Airflow提供了TimeSensor&#xff0c;这是一种内置Sensor&#xff0c;可以监控当前时间&#xff0c;并在达到指定时间时触发后续任…

JS爬虫实战演练

在这个小红书私信通里面进行一个js的爬虫 文字发送 async function sendChatMessage(content) {const url https://pro.xiaohongshu.com/api/edith/ads/pro/chat/chatline/msg;const params new URLSearchParams({porch_user_id: 677e116404ee000000000001});const messageD…

Center Loss 和 ArcFace Loss 笔记

一、Center Loss 1. 定义 Center Loss 旨在最小化类内特征的离散程度&#xff0c;通过约束样本特征与其类别中心之间的距离&#xff0c;提高类内特征的聚合性。 2. 公式 对于样本 xi​ 和其类别yi​&#xff0c;Center Loss 的公式为&#xff1a; xi​: 当前样本的特征向量&…

【Maui】动态菜单实现(绑定数据视图)

前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI&#xff0c;可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款开放源代码应用&#xff0c;是 X…

【json】

JSON JSON是一种轻量级的,按照指定的格式去组织和封装数据的数据交互格式。 本质上是一个带有特定格式的字符串(py打印json时认定为str类型) 在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互,类似于计算机普通话 python与json关系及相互转换…

51单片机——中断(重点)

学习51单片机的重点及难点主要有中断、定时器、串口等内容&#xff0c;这部分内容一定要认真掌握&#xff0c;这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#…

易支付二次元网站源码及部署教程

易支付二次元网站源码及部署教程 引言 在当今数字化时代&#xff0c;二次元文化逐渐成为年轻人生活中不可或缺的一部分。为了满足这一庞大用户群体的需求&#xff0c;搭建一个二次元主题网站显得尤为重要。本文将为您详细介绍易支付二次元网站源码的特点及其部署教程&#xf…

开源生成式物理引擎Genesis,可模拟世界万物

这是生成大模型时代 —— 它们能生成文本、图像、音频、视频、3D 对象…… 而如果将所有这些组合到一起&#xff0c;我们可能会得到一个世界&#xff01; 现在&#xff0c;不管是 LeCun 正在探索的世界模型&#xff0c;还是李飞飞想要攻克的空间智能&#xff0c;又或是其他研究…

【fly-iot飞凡物联】(19):开源飞凡物联项目重启,使用go重写后端代码,感兴趣的小伙伴可以一起参加,使用apache协议开源,招募感兴趣的小伙伴!!

目录 前言fly-iot飞凡物联&#xff0c;感兴趣的小伙伴可以一起参加&#xff0c;使用apache协议开源使用go重写后端代码 前言 fly-iot飞凡物联专栏&#xff1a; https://blog.csdn.net/freewebsys/category_12219758.html fly-iot飞凡物联&#xff0c;感兴趣的小伙伴可以一起参…

用于与多个数据库聊天的智能 SQL 代理问答和 RAG 系统(3) —— 基于 LangChain 框架的文档检索与问答功能以及RAG Tool的使用

介绍基于 LangChain 框架的文档检索与问答功能&#xff0c;目标是通过查询存储的向量数据库&#xff08;VectorDB&#xff09;&#xff0c;为用户的问题检索相关内容&#xff0c;并生成自然语言的答案。以下是代码逻辑的详细解析&#xff1a; 代码结构与功能 初始化环境与加载…

消息中间件类型介绍

消息中间件是一种在分布式系统中用于实现消息传递的软件架构模式。它能够在不同的系统或应用之间异步地传输数据&#xff0c;实现系统的解耦、提高系统的可扩展性和可靠性。以下是几种常见的消息中间件类型及其介绍&#xff1a; 1.RabbitMQ 特点&#xff1a; • 基于AMQP&#…

uniapp使用scss mixin抽离css常用的公共样式

1、编写通用scss样式文件 // 通用 Flex Mixin mixin flex($direction: row, $justify: flex-start, $align: stretch, $wrap: nowrap) {display: flex;flex-direction: $direction;justify-content: $justify;align-items: $align;flex-wrap: $wrap; }// 水平居中 mixin flex-…