Unity3D编辑器扩展(四)——扩展自己的组件
前面已经写了三篇:
今天写第四篇,扩展自己的自定义组件。
通常我们使用继承自 Editor 的自定义编辑器类,来扩展自己的组件的检视面板和编辑器,并配合 CustomEditor 特性语法,附加该编辑器到一个自定义组件。
首先我们先定义一个组件 Player:
1 using UnityEngine; 2 3 public class Player : MonoBehaviour 4 { 5 public int armor = 80; //护甲 6 public int attack = 100; //攻击力 7 }
一个简单的 Player 组件,有护甲和攻击力两个属性,挂载后,效果如下:
接下来我们对 Player 进行扩展,代码如下:
using UnityEngine; using UnityEditor; [CustomEditor(typeof(Player))] public class EditorTest : Editor { public override void OnInspectorGUI() { var _target = (Player)(serializedObject.targetObject); _target.armor = EditorGUILayout.IntSlider("护甲", _target.armor, 0, 100); ProgressBar(_target.armor / 100f, "护甲"); _target.attack = EditorGUILayout.IntSlider("攻击力", _target.attack, 0, 100); ProgressBar(_target.attack / 100f, "攻击力"); } private void ProgressBar(float value, string label) { Rect rect = GUILayoutUtility.GetRect(18, 18); EditorGUI.ProgressBar(rect, value, label); EditorGUILayout.Space(); } }
效果图:
是不是感觉漂亮了很多,直观了很多。这样我们就可以把很多UI控件扩展到我们的组件上,显得高大上。
实效上面这种效果,还有另外一种方法:
using UnityEngine; using UnityEditor; [CustomEditor(typeof(Player))] public class EditorTest : Editor { private SerializedProperty attack; private SerializedProperty armor; void OnEnable() { attack = serializedObject.FindProperty("attack"); armor = serializedObject.FindProperty("armor"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.IntSlider(armor, 0, 100, new GUIContent("护甲")); ProgressBar(armor.intValue / 100f, "护甲"); EditorGUILayout.IntSlider(attack, 0, 100, new GUIContent("攻击力")); ProgressBar(attack.intValue / 100f, "攻击力"); serializedObject.ApplyModifiedProperties(); } private void ProgressBar(float value, string label) { Rect rect = GUILayoutUtility.GetRect(18, 18); EditorGUI.ProgressBar(rect, value, label); EditorGUILayout.Space(); } }
这种方法和第一种方法效果是一样的,就不上图了。
扩展自定义组件我们除了写编辑器类以外,还会用到很多特性,特性的使用在下一节。
分类:
Unity3D
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?