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.rhkb.cn/news/6468.html

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

相关文章

mock可视化生成前端代码

介绍&#xff1a;mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件&#xff0c;来解决我们的问题。目前支持vite和webpack。&#xff08;配置超级简单&#xff01;&#xff09; 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…

(回溯分割)leetcode93 复原IP地址

#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; //卡尔的图不是按照程序执行过程而是直接画程序会执行的过程 // 实际执行是&#xff1a;n个字符&#xff0c;递推n1后&#xff08;叶子节点&#xff…

Springboot3 自动装配流程与核心文件:imports文件

注&#xff1a;本文以spring-boot v3.4.1源码为基础&#xff0c;梳理spring-boot应用启动流程、分析自动装配的原理 如果对spring-boot2自动装配有兴趣&#xff0c;可以看看我另一篇文章&#xff1a; Springboot2 自动装配之spring-autoconfigure-metadata.properties和spring…

JVM面试题解,垃圾回收之“分代回收理论”剖析

一、什么是分代回收 我们会把堆内存中的对象间隔一段时间做一次GC&#xff08;即垃圾回收&#xff09;&#xff0c;但是堆内存很大一块&#xff0c;内存布局分为新生代和老年代、其对象的特点不一样&#xff0c;所以回收的策略也应该各不相同 对于“刚出生”的新对象&#xf…

“腾讯、钉钉、飞书” 会议开源平替,免费功能强大

在数字化时代&#xff0c;远程办公和线上协作越来越火。然而&#xff0c;市面上的视频会议工具要么贵得离谱&#xff0c;要么功能受限&#xff0c;甚至还有些在数据安全和隐私保护上让人不放心。 今天开源君给大家安利一个超棒的开源项目 - Jitsi Meet&#xff0c;这可是我在网…

CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)

CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍CNN-GRU卷积门控循环单元时间序列预测一、引言1.1、研究背景与意义1.2、研究现状1…

状态模式——C++实现

目录 1. 状态模式简介 2. 代码示例 3. 单例状态对象 4. 状态模式与策略模式的辨析 1. 状态模式简介 状态模式是一种行为型模式。 状态模式的定义&#xff1a;状态模式允许对象在内部状态改变时改变它的行为&#xff0c;对象看起来好像修改了它的类。 通俗的说就是一个对象…

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C库。 先发现相机。 配置 lib目录 包含 编译提示缺的文件&#xff0c;到libonvif里面拷贝过来。 改UDP端口 代码 使用msvc 2022的向导生成空项目&#xff0c;从项目的main示例拷贝过来。 CameraOnvif.h #pragma once#include <QObject> #include &l…

WIN11 UEFI漏洞被发现, 可以绕过安全启动机制

近日&#xff0c;一个新的UEFI漏洞被发现&#xff0c;可通过多个系统恢复工具传播&#xff0c;微软已经正式将该漏洞标记为追踪编号“CVE-2024-7344”。根据报告的说明&#xff0c;该漏洞能让攻击者绕过安全启动机制&#xff0c;并部署对操作系统隐形的引导工具包。 据TomsH…

Kyligence AI 数据智能体:首批亮相神州数码 DC·AI 生态创新中心!

近日&#xff0c;跬智信息&#xff08;Kyligence&#xff09;长期合作伙伴神州数码&#xff0c;其 DCAI 生态创新中心正式启幕。 作为首批生态伙伴&#xff0c;Kyligence AI 数据智能体也正式入驻&#xff0c;在这里首次亮相。 Kyligence 是国内最早推出 AI 用数产品的厂商&a…

GS论文阅读--Hard Gaussian Splatting

前言 本文也是对高斯点云的分布进行优化的&#xff0c;看&#xff01; 文章目录 前言1.背景介绍2.关键内容2.1 位置梯度驱动HGS2.2 渲染误差引导HGS 3.文章贡献 1.背景介绍 在训练过程中&#xff0c;它严重依赖于视图空间位置梯度的平均幅度来增长高斯以减少渲染损失。然而&…

消息队列篇--原理篇--Pulsar(Namespace,BookKeeper,类似Kafka甚至更好的消息队列)

Apache Pulusar是一个分布式、多租户、高性能的发布/订阅&#xff08;Pub/Sub&#xff09;消息系统&#xff0c;最初由Yahoo开发并开源。它结合了Kafka和传统消息队列的优点&#xff0c;提供高吞吐量、低延迟、强一致性和可扩展的消息传递能力&#xff0c;适用于大规模分布式系…

当 Facebook 窥探隐私:用户的数字权利如何捍卫?

随着社交平台的普及&#xff0c;Facebook 已经成为全球用户日常生活的一部分。然而&#xff0c;伴随而来的隐私问题也愈发严峻。近年来&#xff0c;Facebook 频频被曝出泄露用户数据、滥用个人信息等事件&#xff0c;令公众对其隐私保护措施产生质疑。在这个信息化时代&#xf…

OSCP - Proving Grounds - Quackerjack

主要知识点 端口转发 具体步骤 执行nmap扫描,开了好多端口&#xff0c;我先试验80和8081&#xff0c;看起来8081比较有趣 Nmap scan report for 192.168.51.57 Host is up (0.0011s latency). Not shown: 65527 filtered tcp ports (no-response) PORT STATE SERVICE …

Hive之加载csv格式数据到hive

场景&#xff1a; 今天接了一个需求&#xff0c;将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移&#xff0c;只需要迁移ads表 解决方案&#xff1a; 拿到这个需求首先想到两个方案&#xff1a; 1、将数据通过insert into语句导出&#xff0c;然后运行脚本 …

PHP如何封装项目框架达到高可用、高性能、高并发

很多初创公司为了快速上线业务&#xff0c;开发时间由本来的6个月压缩到3个月甚至2个月。开发人员只能根据时间及业务需求去git上找现有的项目二次开发或者是一个空框架根据业务一点一点的去做&#xff0c;上述两种方案虽然也可以上线但是对于业务本身存在的问题也是很大的&…

探究 Facebook 隐私安全发展方向,未来走向何方?

随着社交媒体的普及&#xff0c;隐私和数据安全问题成为了全球关注的焦点。Facebook&#xff0c;作为全球最大的社交平台之一&#xff0c;其隐私安全问题尤其引人注目。近年来&#xff0c;随着用户数据泄露事件的不断发生&#xff0c;Facebook 不断调整其隐私政策&#xff0c;探…

【Linux】其他备选高级IO模型

其他高级 I/O 模型 以上基本介绍的都是同步IO相关知识点&#xff0c;即在同步I/O模型中&#xff0c;程序发起I/O操作后会等待I/O操作完成&#xff0c;即程序会被阻塞&#xff0c;直到I/O完成。整个I/O过程在同一个线程中进行&#xff0c;程序在等待期间不能执行其他任务。下面…

R语言学习笔记之开发环境配置

一、概要 整个安装过程及遇到的问题记录 操作步骤备注&#xff08;包含遇到的问题&#xff09;1下载安装R语言2下载安装RStudio3离线安装pacman提示需要安装Rtools4安装Rtoolspacman、tidyfst均离线安装完成5加载tidyfst报错 提示需要安装依赖&#xff0c;试错逐步下载并安装…

数据分析 six库

目录 起因 什么是six库 智能识别py2或3 ​编辑 起因 ModuleNotFoundError: No module named sklearn.externals.six sklearn.externals.six 模块在较新版本的 scikit-learn 中已经被移除。如果你在尝试使用这个模块时遇到了 ModuleNotFoundError: No module named sklear…