Unity编辑拓展显示自定义类型

        配合自定义特性或着header可以添加注解

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Reflection;
using System;
using Unity.VisualScripting;#if UNITY_EDITORpublic class EditorRender
{public static Enum RenderEnum(FieldInfo fieldInfo, Enum value, Type type, params GUILayoutOption[] style){var array = Enum.GetValues(type);// 直接使用  Enum[] EnumValueArr =   (Enum[])Enum.GetValues(type);  不行,这里不能用enum,存在类型转换异常,只能指定枚举类型Enum[] EnumValueArr = new Enum[array.Length];for (int i = 0; i < array.Length; i++){EnumValueArr[i] = (Enum)Enum.Parse(type, array.GetValue(i).ToString());}int[] IntValueArr = new int[EnumValueArr.Length];string[] EnumDescArr = new string[EnumValueArr.Length];for (int i = 0; i < EnumValueArr.Length; i++){Enum e = EnumValueArr[i];IntValueArr[i] = (int)Enum.Parse(type, e.ToString());var field = type.GetField(e.ToString());HeaderAttribute header = field.GetAttribute<HeaderAttribute>();if (header != null){EnumDescArr[i] = header.header;}else{EnumDescArr[i] = "未定义";}}int selectValue = (int)Enum.Parse(type, value.ToString());selectValue = EditorGUILayout.IntPopup(selectValue, EnumDescArr, IntValueArr, style);value = (Enum)Enum.Parse(type, selectValue.ToString());return value;}public static object RenderValue(FieldInfo fieldInfo, Type type, object value, object defaultValue = null, params GUILayoutOption[] style){SetDefaultValue(type, ref value, defaultValue);if (type == typeof(int)){return EditorGUILayout.IntField(int.Parse(value.ToString()), style);}else if (type == typeof(float)){return EditorGUILayout.FloatField(float.Parse(value.ToString()), style);}else if (type == typeof(long)){return EditorGUILayout.LongField(long.Parse(value.ToString()), style);}else if (type == typeof(string)){return GUILayout.TextArea(value as string, style);}else if (type == typeof(bool)){return GUILayout.Toggle(bool.Parse(value.ToString()), "", style);}else if (type.IsEnum){value = EditorRender.RenderEnum(fieldInfo, (Enum)value, type, style);return value;}else if (value is IList){value = RenderList(type.GetGenericArguments()[0], value as IList);return value;}if (value == null){return Activator.CreateInstance(type);}return null;}public static object RenderList(Type type, IList list){if (list == null){return Activator.CreateInstance(typeof(List<>).MakeGenericType(type));}for (int i = 0; i < list.Count; i++){list[i] = RenderValue(null, type, list[i], style: GUILayout.MaxWidth(400));if (GUILayout.Button("X", GUILayout.MaxWidth(50))){list.RemoveAt(i);GUILayout.EndHorizontal();break;}}GUILayout.BeginHorizontal();GUILayout.FlexibleSpace();if (GUILayout.Button("Add", GUILayout.MaxWidth(500))){list.Add(Activator.CreateInstance(type));}GUILayout.EndHorizontal();return list;}public static void SetDefaultValue(Type type, ref object value, object defaultValue){if (value == null || string.IsNullOrEmpty(value.ToString())){if (defaultValue != null){value = defaultValue;return;}if (type == typeof(int)){value = 0;}else if (type == typeof(float)){value = 0;}else if (type == typeof(long)){value = 0;}else if (type == typeof(Single)){value = 0;}else if (type == typeof(string)){value = string.Empty;}else if (type == typeof(bool)){value = false;}else if (type == typeof(Vector3)){value = Vector3.zero;}else if (type == typeof(Vector2)){value = Vector2.zero;}else if (type.IsEnum){}}}public static object RenderField(FieldInfo fieldInfo, HeaderAttribute header, object obj, params GUILayoutOption[] style){GUILayout.BeginHorizontal(GUI.skin.button);GUILayout.BeginVertical();Type t = fieldInfo.FieldType;GUILayout.Label($"{fieldInfo.Name}({t.Name})");if (header!= null){GUILayout.Label(header.header);}GUILayout.EndVertical();var value = RenderValue(fieldInfo, t, obj, style: style);GUILayout.EndHorizontal();return value;}public static object RenderObject(object value){var propertyInfos = value.GetType().GetFields();for (int i = 0; i < propertyInfos.Length; i++){var property = propertyInfos[i];object obj = property.GetValue(value);obj = EditorRender.RenderField(property, null, obj, GUILayout.MaxWidth(400));property.SetValue(value, obj);GUILayout.Space(5);}return value;}
}#endif

        使用方式,直接调用RenderObject就行

    private class CustomClass{public string Name;public int Age;public bool Sex;}private CustomClass m_CustomClass;private void OnGUI(){m_CustomClass = (CustomClass)EditorRender.RenderObject(m_CustomClass);}

        这里用的都是变量,如果使用属性的话,将获取属性,获取属性值,写入属性值的方式修改源代码即可,RenderValue里如果有未定义其他类型,记得补充

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

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

相关文章

微前端qiankun的部署

微前端qiankun的部署 本地开发主应用配置启动端口子应用配置启动端口测试环境部署:场景 1:主应用和微应用部署到同一个服务器(同一个 IP 和端口)微应用都放在在一个特殊名称(不会和微应用重名)的文件夹下主应用配置子应用配置配置nginx本地开发 主应用配置启动端口 打开…

Linux内核编程(二十一)USB驱动开发-键盘驱动

一、驱动类型 USB 驱动开发主要分为两种&#xff1a;主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备&#xff0c;而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…

学习Hibernate的调优方案

Hibernate是一个非常流行的Java ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它可以帮助开发者更轻松地处理数据库操作。然而&#xff0c;如果不进行适当的性能调优&#xff0c;Hibernate可能会导致应用程序运行缓慢。本文将详细探讨Hibernate的调优方案&#xff…

总结 uniapp 上不适配iphone的:new Date 时间、border线条、渐变

1、border样式缺了一边 这是错误样式&#xff1a; 需要添加: border: 1rpx solid #57c7bb; transform: rotateZ(0deg);//加入此代码解决iphone 不适配问题2、时间出现NaN 原因是因为ios中使用new Date 的时候出了问题 解决方案: 1.调整时间格式:将时间格式从"yyyy-MM-d…

docker重启的方法

在 Docker 中,重启容器的方法有以下几种: 1. 使用 docker restart 命令 这是最常用的方法,可以通过容器名称或容器 ID 来重启容器。 docker restart <容器名称或容器ID> 例如: docker restart my_container 2. 使用 docker stop 和 docker start 命令 你也可以…

内网渗透测试工具及渗透测试安全审计方法总结

1. 内网安全检查/渗透介绍 1.1 攻击思路 有2种思路&#xff1a; 攻击外网服务器&#xff0c;获取外网服务器的权限&#xff0c;接着利用入侵成功的外网服务器作为跳板&#xff0c;攻击内网其他服务器&#xff0c;最后获得敏感数据&#xff0c;并将数据传递到攻击者&#xff0…

FPGA 开发工作需求明确:关键要点与实践方法

FPGA开发工作需求明确&#xff1a;关键要点与实践方法 一、需求明确的重要性 在FPGA开发领域&#xff0c;明确的需求是项目成功的基石。FPGA开发往往涉及复杂的硬件逻辑设计、高速信号处理以及与其他系统的协同工作。若需求不明确&#xff0c;可能导致开发过程中频繁变更设计…

深入了解 Java split() 方法:分割字符串的利器

Java 提供的 split() 方法是 String 类中一个常用的工具&#xff0c;它可以将一个字符串根据指定的分隔符切割成多个子字符串&#xff0c;并以字符串数组的形式返回。这个方法常用于字符串的处理、数据解析等场景。本文将详细介绍 Java 中 split() 方法的使用方式&#xff0c;并…

Dockerfile另一种使用普通用户启动的方式

基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件&#xff08;如果有的话&#xff09; COPY sources.list /etc/apt/sources.list # 创建…

力扣707题——设计链表

#题目 从零开始设计链表&#xff0c;我们拆分成两次任务&#xff0c;今天先看1 ,2 ,4 #代码

leetcode刷题记录(七十二)——146. LRU 缓存

&#xff08;一&#xff09;问题描述 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类&#xff1a; * LRUCache(int capacity)…

微信小程序:实现单选,多选,通过变量控制单选/多选

一、实现单选功能 微信小程序提供了 radio 组件来实现单选功能。radio 组件需要配合 radio-group 使用。 1. WXML 代码 <radio-group bindchange"onRadioChange"><label wx:for"{{items}}" wx:key"id"><radio value"{{it…

vue2使用flv.js在浏览器打开flv格式视频

组件地址&#xff1a;GitHub - bilibili/flv.js: HTML5 FLV Player flv.js 仅支持 H.264 和 AAC/MP3 编码的 FLV 文件。如果视频文件使用了其他编码格式就打不开。 flv.vue <template><div><el-dialog :visible.sync"innerVisibleFlv" :close-on-pre…

Spring 中的事件驱动模型

事件驱动的基本了解 事件模式也就是观察者模式&#xff0c;当一个对象改变的时候&#xff0c;所有依赖的对象都会收到一个通知。 Subject&#xff1a;抽象主题 Observer&#xff1a;具体主题 Concrete Subject&#xff1a;抽象观察者&#xff0c;在得到更新通知之后去更新自…

STM32补充——IAP

0 前置知识&#xff1a; FLASH相关内容&#xff1a;前往STM32补充——FLASH STM32三种烧录方式&#xff08;看看就行&#xff09;&#xff1a; 1.ISP&#xff1a;In System Programming&#xff08;在系统编程&#xff09; 执行芯片厂商的 Bootloader 程序进入 ISP 模式&…

k8s的CICD实施项目

环境需求&#xff1a; 目前领导需要做一个需求&#xff0c;临时把我从运维岗位&#xff0c;把我调度到到专家组让我主导cicd的项目实施 目前环境资源 k8s环境&#xff0c;28台服务器&#xff0c;上面是k8s集群&#xff0c;要实施一个测试环境的cicd以及一个生产环境的cicd gitl…

【线性代数】基础版本的高斯消元法

[精确算法] 高斯消元法求线性方程组 线性方程组 考虑线性方程组&#xff0c; 已知 A ∈ R n , n , b ∈ R n A\in \mathbb{R}^{n,n},b\in \mathbb{R}^n A∈Rn,n,b∈Rn&#xff0c; 求未知 x ∈ R n x\in \mathbb{R}^n x∈Rn A 1 , 1 x 1 A 1 , 2 x 2 ⋯ A 1 , n x n b 1…

AIGC视频生成模型:Runway的Gen系列模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Runway开发的视频生成模型Gen系列&#xff0c;包括Gen-1、Gen-2和Gen3 Alpha等&#xff0c;这些模型每次发布都震惊AI圈&#xff0c;荣获多个视频生成的…

【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例

在Java应用程序的性能调优和故障排查中&#xff0c;jmap&#xff08;Java Memory Map&#xff09;是一个不可或缺的工具。它可以帮助开发者分析Java堆内存的使用情况&#xff0c;生成堆转储文件&#xff08;Heap Dump&#xff09;&#xff0c;并查看内存中的对象分布。无论是内…

【基于无线电的数据通信链】Link 11 仿真测试

〇、废话 Link 11 仿真测试 涉及多个方面&#xff0c;包括信号仿真、协议模拟、数据链路层的仿真以及网络性能评估等。Link 11 是一种基于 HF&#xff08;高频&#xff09; 或 UHF&#xff08;超高频&#xff09; 波段的无线通信协议&#xff0c;主要用于军事通信系统中。为了…