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

1.参考链接

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

cs 复制代码
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();
    }
}
cs 复制代码
/****************************************************************************
 *  #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);
    }
}
相关推荐
l1t14 分钟前
DeepSeek总结的Delta 成长记:写入、Unity Catalog 和时间旅行
数据库·人工智能·unity
weixin_4245424325 分钟前
vscode使用claude coder如何绕开登录
ide·vscode·编辑器
年少无知且疯狂42 分钟前
【Unity】Mirror网络框架
unity
顾温44 分钟前
协程结束——实测
开发语言·unity·c#
Zender Han3 小时前
PM2 介绍与使用教程:Node.js 项目的进程管理利器
node.js·编辑器·vim
马踏岛国赏樱花3 小时前
vim新手入门配置
编辑器·vim·excel
小白学鸿蒙15 小时前
Unity 3D 2023解压安装,配置安卓运行环境后打包安卓应用(踩坑无数之差点放弃)
android·unity·游戏引擎
古怪今人1 天前
Windows系统+VSCode 开发Python和Java项目 AI代码编辑器Trae插件安装
ide·vscode·编辑器
普通young man1 天前
vim常用编辑和视图(个人笔记)
笔记·编辑器·vim
__water1 天前
【关于unity打包Android失败问题】
android·unity