以Image类为例
1.MyImage.cs
1 using UnityEngine; 2 using UnityEngine.UI; 3 4 public class MyImage : Image { 5 6 private int a = 1; 7 protected float b = 2f; 8 public string c = "3"; 9 public int D { get; set; } 10 11 protected override void OnPopulateMesh(VertexHelper toFill) 12 { 13 base.OnPopulateMesh(toFill); 14 15 Debug.Log(a); 16 Debug.Log(b); 17 Debug.Log(c); 18 Debug.Log(D); 19 } 20 }
MyImage继承自Image,但是如果把MyImage挂上去,会发现面板上没有出现自定义的属性,这是为什么呢?通过看UGUI的源码,可以发现有一个ImageEditor类,这个类负责绘制Image的属性面板,同时还存在这样一句:[CustomEditor(typeof(Image), true)],表示所有继承自Image的子类都使用和Image一样的属性面板。
2.MyImageEditor.cs
那么,如果想让Image的子类显示出自定义的属性,该怎么办呢?很简单,写一个类去继承ImageEditor,然后去绘制自定义的属性即可。参考ImageEditor的源码可以得出如下代码。serializedObject为被序列化的对象,SerializedProperty为该对象上被序列化的字段。经测试,private和protected的字段要加上[SerializeField]才能被序列化,public的字段无需处理,而属性是不能被serializedObject.FindProperty(会报空)
1 using UnityEditor.UI; 2 using UnityEditor; 3 4 [CustomEditor(typeof(MyImage))] 5 [CanEditMultipleObjects] 6 public class MyImageEditor : ImageEditor { 7 8 SerializedProperty a; 9 SerializedProperty b; 10 SerializedProperty c; 11 SerializedProperty D; 12 13 protected override void OnEnable() 14 { 15 base.OnEnable(); 16 17 a = serializedObject.FindProperty("a"); 18 b = serializedObject.FindProperty("b"); 19 c = serializedObject.FindProperty("c"); 20 D = serializedObject.FindProperty("D"); 21 } 22 23 public override void OnInspectorGUI() 24 { 25 base.OnInspectorGUI(); 26 27 serializedObject.Update(); 28 29 EditorGUILayout.PropertyField(a); 30 EditorGUILayout.PropertyField(b); 31 EditorGUILayout.PropertyField(c); 32 //EditorGUILayout.PropertyField(D); 33 34 serializedObject.ApplyModifiedProperties(); 35 } 36 }
效果如下:
分类:
UnityAPI
【推荐】国内首个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 中如何实现缓存的预热?
2018-04-05 [UGUI]滑动列表优化(循环利用)