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

news2025/7/4 6:27:28


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);
    }
}

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

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

相关文章

cesium小知识:3D tiles 概述、特点、示例

Cesium 的 3D Tiles 是一种高效的、流式传输的三维地理空间数据格式,专为在Web浏览器中快速渲染大规模三维场景而设计。3D Tiles 支持多种几何类型,包括点云、多边形、模型等,并且可以包含丰富的属性信息和层次细节(LOD, Level of Detail)结构,以确保不同设备和网络条件下…

【微服务】7、分布式事务

在分布系统中&#xff0c;一个业务由多个服务合作完成&#xff0c;每个服务有自己的事务&#xff0c;多个事务需同时成功或失败&#xff0c;这样的事务称为分布式事务。 其中每个服务的事务叫分支事务&#xff0c;整个业务的统一事务叫全局事务。 分布式事务相关知识讲解 课程引…

基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)

已完成功能&#xff1a; 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制&#xff0c;可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…

Linux标准IOday1

1:思维导图 2:将 student.c这个练习题&#xff0c;改成链表后实现 头文件link.h #ifndef __STRUCT_H__ #define __STRUCT_H__ #include <stdio.h> #include <stdlib.h> typedef struct Student{char name[20];double math;double chinese;double english;double…

全局变量(PHP)(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…

gateway的路径匹配介绍

gateway是一个单独服务。通过网关端口和predicates进行匹配服务 1先看配置。看我注解你就明白了。其实就是/order/**配置机制直接匹配到orderservice服务。 2我试着请求一个路径&#xff0c;请求成功。下面第三步是请求的接口。 3接口。

RabbitMQ-基本使用

RabbitMQ: One broker to queue them all | RabbitMQ 官方 安装到Docker中 docker run \-e RABBITMQ_DEFAULT_USERrabbit \-e RABBITMQ_DEFAULT_PASSrabbit \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network mynet\-d \rabbitmq:3…

模式识别-Ch2-分类错误率

分类错误率 最小错误率贝叶斯决策 样本 x x x的错误率&#xff1a; 任一决策都可能会有错误。 P ( error ∣ x ) { P ( w 2 ∣ x ) , if we decide x as w 1 P ( w 1 ∣ x ) , if we decide x as w 2 P(\text{error}|\mathbf{x})\begin{cases} P(w_2|\mathbf{x}), &…

CAD批量打印可检索的PDF文件

本文虽介绍CAD使用方法&#xff0c;但还是劝告大家尽早放弃使用CAD软件。。。。太TM难用了 当你打开CAD时发现如下一堆图纸&#xff0c;但是不想一个一个打印时。你可以按照下面操作实现自动识别图框实现批量打印。 1.安装批量打印插件 2.安装后打开CAD&#xff0c;输入命令Bp…

BERT:深度双向Transformer的预训练用于语言理解

摘要 我们介绍了一种新的语言表示模型&#xff0c;名为BERT&#xff0c;全称为来自Transformer的双向编码器表示。与最近的语言表示模型&#xff08;Peters等&#xff0c;2018a&#xff1b;Radford等&#xff0c;2018&#xff09;不同&#xff0c;BERT旨在通过在所有层中联合调…

搭建企业AI助理的创新应用与案例分析

在大健康零售行业&#xff0c;企业面临着日益增长的市场需求和复杂的供应链管理挑战。AI助理的应用不仅能够提升客户服务效率&#xff0c;还能优化供应链管理&#xff0c;降低运营成本。 一、AI助理在大健康零售行业的创新应用 个性化健康咨询 AI助理可以通过分析客户的健康…

apex安装

安装过程复杂曲折&#xff0c;网上说的很多办法&#xff0c;貌似成功了&#xff0c;实际还是没起作用。 先说成功过程&#xff0c;执行下面命令&#xff0c;安装成功&#xff08;当然&#xff0c;前提是你要先配置好编译环境&#xff09;&#xff1a; &#xff08;我的环境&a…

select下拉框,首次进入页面没有显示value的情况

bug场景&#xff1a; 类似这种bug情况排查如下&#xff1a; 首先 理解含义 options就是存放键值对的&#xff0c;id就是key&#xff0c;对上了它就自动把label显示 而且如果你用来当作key和label的字段&#xff0c;与后端返回的不一致&#xff0c;还可以进行更改 其次 排查接…

krpano 实现文字热点中的三角形和竖杆

krpano 实现文字热点中的三角形和竖杆 实现文字热点中的三角形和竖杆 一个后端写前端真的是脑阔疼 一个后端写前端真的是脑阔疼 一个后端写前端真的是脑阔疼 实现文字热点中的三角形和竖杆 上图看效果 v&#xff1a;2549789059

playwright 录制

一、新建项目TestProject3 二、准备swagger 三、开始录制 打开PowerShell 7 (x64) cd D:\xxx\xxx\VS2022Projects\TestProject3\TestProject3\bin\Debug\net8.0 pwsh playwright.ps1 codegen --targetcsharp -b chromium localhost:5252/swagger/index.html #支持的语言 java…

uni-app 资源引用(绝对路径和相对路径)方法汇总

文章目录 一、前言&#x1f343;二、绝对路径和相对路径2.1 绝对路径2.2 相对路径 三、引用组件四、引用js4.1 js 文件引入4.2 NPM支持 五、引用css六、引用json6.1 json文件引入 七、引用静态资源7.1 模板内引入静态资源7.2 css 引入静态资源7.3 js/uts 引入静态资源7.4 静态资…

go如何从入门进阶到高级

针对Go语言的学习&#xff0c;不同阶段应采取不同的学习方式&#xff0c;以达到最佳效果.本文将Go的学习分为入门、实战、进阶三个阶段&#xff0c;下面分别详细介绍 一、社区 Go语言中文网 作为专注于Go语言学习与推广的平台&#xff0c;Go语言中文网为开发者提供了丰富的中…

现代密码学期末重点(备考ing)

现代密码学期末重点&#xff0c;个人备考笔记哦 密码学概念四种密码学攻击方法什么是公钥密码&#xff1f;什么是对称密码&#xff1f;什么是无条件密码&#xff1f; 中国剩余定理&#xff08;必考&#xff09;什么是原根什么是阶 经典密码学密码体制什么是列置换&#xff1f; …

基于SMT32U575RIT单片机-中断练习

任务 查看手册对所有的拓展板上和相对应的底板的引脚对应的端口找到以下结论 通过STM32MX软件对各个引脚进行相应的配置 1.第一种切换模式电脑发送 #include "main.h" #include "icache.h" #include "usart.h" #include "gpio.h"/*…

KCP解读:拥塞控制

本文是系列文章中的一篇&#xff0c;内容由浅到深进行剖析&#xff0c;为了方便理解建议按顺序一一阅读。 KCP技术原理 KCP解读&#xff1a;基础消息收发 KCP解读&#xff1a;重传机制 KCP解读&#xff1a;滑动窗口 KCP解读&#xff1a;拥塞控制 本文摘取https://xiaolincodin…