以Image类为例

1.MyImage.cs

  1. using UnityEngine;
  2. using UnityEngine.UI;
  3.  
  4. public class MyImage : Image {
  5.  
  6. private int a = ;
  7. protected float b = 2f;
  8. public string c = "";
  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]SerializedObject类 & SerializedProperty类的更多相关文章

  1. 初识UML类图--类之间关系

    前言 最近有打算学习一下设计模式,所以就去看了园子里面左潇龙大哥的设计模式文章,看完之后只有一个感觉,我啥时候也能写出来这么牛逼的文章啊,但是我这语文老师死的早的人还是算了,但是设计模式还是要学的,这 ...

  2. [.net 面向对象编程基础] (9) 类和类的实例

    [.net 面向对象编程基础] (9) 类和类的实例 类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功 ...

  3. java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),

    建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...

  4. 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  5. 日期操作类--GregorianCalendar类

    GregorianCalendar--API JavaTM Platform Standard Ed. 6 GregorianCalendar类 Calendar类实现了公历日历,GregorianC ...

  6. Mapper类/Reducer类中的setup方法和cleanup方法以及run方法的介绍

    在hadoop的源码中,基类Mapper类和Reducer类中都是只包含四个方法:setup方法,cleanup方法,run方法,map方法.如下所示: 其方法的调用方式是在run方法中,如下所示: ...

  7. C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;

    ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口:       2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...

  8. Java API —— Set接口 & HashSet类 & LinkedHashSet类

    1.Set接口     1)Set接口概述         一个不包含重复元素的 collection,无序(存储顺序和取出顺序不一致),唯一.  (List有序,即存储顺序和取出顺序一致,可重复) ...

  9. <九>面向对象分析之UML核心元素之设计类,类,属性,方法,可见性

    设计类

随机推荐

  1. Ubuntu18.04 搭建zookeeper单机版集群

    一台电脑启动三个虚拟机比较折腾,这里就用一台虚拟机模拟一下zk集群. 1.后台下载安装包到 /opt目录 sudo wget -b http://archive.apache.org/dist/zoo ...

  2. Linux3.10.0块IO子系统流程(7)-- 请求处理完成

    和提交请求相反,完成请求的过程是从低层驱动开始的.请求处理完成分为两个部分:上半部和下半部.开始时,请求处理完成总是处在中断上下文,在这里的主要任务是将已完成的请求放到某个队列中,然后引发软终端让中断 ...

  3. RabbitMQ使用介绍及实例

    消息列队不做过多解释了,直接讲讲rabbitmq的基本概念和路由模式. 一.安装及基本概念 rabbitmq是基于erlang编写的,所以安装rabbitmq之前需要安装erlang的环境,配置环境变 ...

  4. html 刷新重载方法汇总

    一.javascript页面刷新重载的方法: <a href="javascript:location.reload();">点击重新载入页面</a> &l ...

  5. python 参数传递 传值还是传引用

    个人推测结论: 可变对象传引用,不可变对象传值 python里的变量不同于c中地址储值模型 a=100 b=100 print(id(a),id(b),a==b,a is b) #8790877986 ...

  6. Linux跨服务器发送文件

    在要发送的文件所在的目录下,输入下列命令 第一种: scp -r test.jar root@127.0.0.1:$(pwd)/test.jar 其中root为服务器账户名,127.0.0.1为要发送 ...

  7. centos安装jdk步骤

    1.官网或wget下载 jdk-8u172-linux-x64.tar.gz,解压到/usr/local/java目录: cd /home/tar wget xxxxxxx cp /home/tar/ ...

  8. Linux设备驱动模型之platform(平台)总线详解

    /********************************************************/ 内核版本:2.6.35.7 运行平台:三星s5pv210 /*********** ...

  9. apache开启验证登录

    对某个目录开启验证登录 <Directory /var/www/html/admin > AllowOverride All Order allow,deny Allow from all ...

  10. 解决Android Studio在Ubuntu上出现“sdk/platform-tools/adb: error=2, No such file or directory”的方法

    转载至http://blog.163.com/china_uv/blog/static/11713726720136931132385/ 刚安装Ubuntu14.5时运行Android Studio可 ...