尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Unity 编辑器之自定义脚本界面
自定义脚本界面有两种方法一种是继承PropertyDrawer一种是继承Editor。下面介绍继承自 PropertyDrawerPropertyDrawer有两种用途一种是自定义绘制带有Serializable属性的类另一种是自定义继承自PropertyAttribute的类。1. 绘制带有 Serializable 属性的类在重新绘制带有Serializable属性的类时绘制类需要继承自PropertyDrawer并且加上CustomPropertyDrawer特性。下面是一个完整的示例using System; using UnityEngine; public enum IngredientUnit { Spoon, Cup, Bowl, Piece } // 自定义绘制类没有继承 MonoBehaviour [Serializable] public class Ingredient { public string name; public int amount 1; public IngredientUnit unit; } // 继承 MonoBehaviour使用默认绘制 public class Recipe : MonoBehaviour { public Ingredient potionResult; public Ingredient[] potionIngredients; } using UnityEditor; using UnityEditor.UIElements; using UnityEngine.UIElements; // IngredientDrawerUIE [CustomPropertyDrawer(typeof(Ingredient))] public class IngredientDrawerUIE : PropertyDrawer { public override VisualElement CreatePropertyGUI(SerializedProperty property) { // 创建属性容器元素 var container new VisualElement(); // 创建属性字段 var amountField new PropertyField(property.FindPropertyRelative(amount)); var unitField new PropertyField(property.FindPropertyRelative(unit)); var nameField new PropertyField(property.FindPropertyRelative(name), Fancy Name); // 将字段添加到容器中 container.Add(amountField); container.Add(unitField); container.Add(nameField); return container; } }在上面的示例中Ingredient类被标记为[Serializable]因此 Unity 会在 Inspector 中自动显示它的字段。通过自定义PropertyDrawer我们可以完全控制这些字段在 Inspector 中的显示方式例如调整字段顺序、添加自定义标签或实现更复杂的布局。2. 绘制继承自 PropertyAttribute 类的属性比如系统自带的属性Range它可以让数值字段在 Inspector 中显示为滑动条。下面我们自己实现一个和Range属性功能类似的属性using UnityEngine; public class RangeAttribute : PropertyAttribute { public float min; public float max; public RangeAttribute(float min, float max) { this.min min; this.max max; } } [CustomPropertyDrawer(typeof(RangeAttribute))] public class RangeDrawer : PropertyDrawer { // 在给定的矩形区域内绘制属性 public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // 首先获取特性其中包含滑动条的范围 RangeAttribute range attribute as RangeAttribute; // 根据属性类型绘制滑动条或整数滑动条 if (property.propertyType SerializedPropertyType.Float) EditorGUI.Slider(position, property, range.min, range.max, label); else if (property.propertyType SerializedPropertyType.Integer) EditorGUI.IntSlider(position, property, Convert.ToInt32(range.min), Convert.ToInt32(range.max), label); else EditorGUI.LabelField(position, label.text, Use Range with float or int.); } }通过继承PropertyAttribute并配合PropertyDrawer我们可以为自定义属性添加丰富的 Inspector 交互体验。这种方式非常适合封装常用的数据校验逻辑例如限制数值范围、格式化字符串或实现下拉选择等。下面介绍继承自 Editor除了使用PropertyDrawer自定义单个属性的绘制方式我们还可以通过继承Editor类来整体自定义某个组件或脚本在 Inspector 中的显示界面。这种方式适用于需要控制整个对象面板布局的场景例如隐藏默认字段、添加按钮、展示自定义信息或实现更复杂的交互。1. 使用 OnInspectorGUI 方法继承Editor类后最核心的方法是重写OnInspectorGUI。Unity 会在 Inspector 面板刷新时调用该方法我们可以在其中使用GUILayout、EditorGUILayout等工具绘制自定义界面。下面是一个简单的示例using UnityEditor; using UnityEngine; [CustomEditor(typeof(Recipe))] public class RecipeEditor : Editor { public override void OnInspectorGUI() { // 绘制默认的 Inspector 内容 DrawDefaultInspector(); // 在默认内容下方添加一个按钮 Recipe recipe (Recipe)target; if (GUILayout.Button(打印配方信息)) { Debug.Log(配方名称 recipe.potionResult.name); Debug.Log(配料数量 recipe.potionIngredients.Length); } } }在上面的示例中DrawDefaultInspector()会先绘制脚本默认的字段随后我们通过GUILayout.Button添加了一个自定义按钮。这样既保留了原有字段的显示又扩展了额外的操作入口。2. 处理多个对象当在 Inspector 中同时选中多个对象时Editor类的targets属性会包含所有被选中的对象。此时我们需要遍历targets来处理多对象场景避免只对第一个对象生效。下面是一个示例using UnityEditor; using UnityEngine; [CustomEditor(typeof(Recipe))] public class RecipeEditor : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); if (GUILayout.Button(批量打印配方信息)) { foreach (Recipe recipe in targets) { Debug.Log(配方名称 recipe.potionResult.name); Debug.Log(配料数量 recipe.potionIngredients.Length); } } } }通过遍历targets我们可以确保批量操作对所有选中的对象生效。此外在处理多对象时还可以使用serializedObject和serializedObject.targetObjects来统一管理序列化属性从而保证修改能够正确应用到每个对象上。3. 与 PropertyDrawer 的主要区别Editor和PropertyDrawer虽然都用于自定义 Inspector 界面但它们的定位和使用场景有明显区别作用范围不同PropertyDrawer只负责绘制某个具体的字段或属性而Editor负责整个组件或脚本的 Inspector 面板。使用方式不同PropertyDrawer通过CustomPropertyDrawer特性绑定到目标属性Editor通过CustomEditor特性绑定到目标脚本。控制粒度不同PropertyDrawer适合精细控制单个字段的显示Editor适合整体布局、添加按钮或实现跨字段的复杂交互。适用场景不同当只需要美化某个字段时优先使用PropertyDrawer当需要重排整个面板、添加操作按钮或处理多对象时应使用Editor。在实际开发中两者经常配合使用用PropertyDrawer控制字段级别的显示细节用Editor控制组件级别的整体布局从而打造出既美观又易用的自定义 Inspector 界面。
RELATED

相关推荐

Unity 脚本序列化完全指南:原理、规则与实战技巧

Unity 脚本序列化完全指南:原理、规则与实战技巧

1. 序列化 序列化是Unity中把数据存储到磁盘中的过程。比如.unity/.prefab,这些都是磁盘文件,里面包含了序列化的数据,存储在磁盘上,运行时,反序列化这些文件,赋值给变量。而非序列化的变量的值&#xff0…

📅 2026/10/7 2:25:06
140. 单词拆分 II(dfs)

140. 单词拆分 II(dfs)

链接&#xff1a;140. 单词拆分 II 题解&#xff1a;140. 单词拆分 II - 力扣&#xff08;LeetCode&#xff09; class Solution { private:// 表示以key为下标开始&#xff0c;value表示可以到达字符串末尾的清空unordered_map<int, vector<string>> ans;unorder…

📅 2026/10/9 3:15:14
mirrors/ali-vilab/text-to-video-ms-1.7b模型优化:知识蒸馏压缩模型体积50%实践

mirrors/ali-vilab/text-to-video-ms-1.7b模型优化:知识蒸馏压缩模型体积50%实践

mirrors/ali-vilab/text-to-video-ms-1.7b模型优化&#xff1a;知识蒸馏压缩模型体积50%实践 【免费下载链接】text-to-video-ms-1.7b 项目地址: https://ai.gitcode.com/hf_mirrors/ali-vilab/text-to-video-ms-1.7b text-to-video-ms-1.7b 是阿里达摩院开源的 17 亿参…

📅 2026/10/16 1:16:54
MORE NEWS

更多资讯

📰

DeepSeek-Harness流式输出核心:StreamChunk语义流与管道优化

1. 这不是“加个loading动画”那么简单&#xff1a;流式输出在Agent系统里的真实战场你有没有遇到过这样的情况&#xff1a;在调试一个基于DeepSeek-Harness构建的Agent时&#xff0c;前端UI卡在“思考中…”长达8秒&#xff0c;然后突然一次性弹出2000字的完整响应&#xff1f…

📰

AI产品经理生存指南:破解高薪短命困局

1. 现象背后的行业真相 去年某互联网大厂高薪聘请的AI产品总监&#xff0c;入职不到180天就被闪电裁员。这并非个案&#xff0c;过去一年里类似案例在科技圈频繁上演。表面看是个人能力问题&#xff0c;实则折射出AI行业从野蛮生长到理性发展的转型阵痛。 我接触过7家头部企业…

📰

AI驱动的Shell环境自动化框架:解决开发环境初始化痛点

1. 这不是又一个“AI写代码”玩具&#xff1a;它解决的是真实开发流水中最耗神的三类重复劳动GitHub趋势榜第7&#xff0c;单日新增476星——这个数字背后不是营销刷量&#xff0c;而是大量一线开发者在深夜提交star时的真实反馈。我盯着这个项目主页刷新了三次&#xff0c;确认…

📰

企业AI项目技术选型:RAG、Agent与微调实战对比

1. 企业AI项目技术选型的核心困境2026年的企业AI项目正面临前所未有的技术选择难题。作为从业者&#xff0c;我亲眼见证了太多团队在RAG、Agent和微调之间的摇摆不定&#xff0c;最终导致资源浪费和项目延期。最近接触的一个典型案例&#xff1a;某金融科技公司投入300万GPU算力…

📰

知识抽取与表达:从原理到实践的技术解析

1. 知识抽取与表达的核心概念解析 知识抽取&#xff08;Knowledge Extraction&#xff09;是从非结构化或半结构化数据中识别和提取结构化知识的过程。在Web信息处理领域&#xff0c;这通常涉及从网页文本、表格、列表等元素中抽取出实体、属性和关系。我处理过的一个电商评论分…

📰

网页嵌入flowplayer流媒体播放器:Red5与RTMP/HLS版本配置实战

简介&#xff1a;面向需要在网页端集成流媒体播放能力的开发者&#xff0c;这份资源提供了一套基于 Flowplayer 的完整嵌入方案&#xff0c;重点解决 RTMP 流在浏览器中的播放问题。包内共 8 个文件&#xff0c;以 swf 播放器核心与插件、js 脚本、html 示例页为主&#xff0c;…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬