lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  201 随笔 :: 0 文章 :: 12 评论 :: 21万 阅读

以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 }
复制代码

 

效果如下:

posted on   艰苦奋斗中  阅读(2146)  评论(0编辑  收藏  举报
编辑推荐:
· .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]滑动列表优化(循环利用)
点击右上角即可分享
微信分享提示