一. 参数自定义

一个含有成员的类Player

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class Player : MonoBehaviour
  6. {
  7.  
  8. public int id;
  9.  
  10. public string playerName;
  11. public string backStory;
  12. public float health;
  13. public float damage;
  14.  
  15. public float weaponDamage1, weaponDamage2;
  16.  
  17. public string shoeName;
  18. public int shoeSize;
  19. public string shoeType;
  20.  
  21. void Start()
  22. {
  23. health = ;
  24. }
  25. }

写完之后,inspector面板上是这样的:

然后,写一个编辑扩展脚本(写出该脚本即可,不需要做任何操作):

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5.  
  6. //CustomEditor(typeof()) 用于关联你要自定义的脚本
  7. [CustomEditor(typeof(Player))]
  8. //必须要让该类继承自Editor,且不需要导入UnityEditor程序集
  9. public class PlayerInspector : Editor
  10. {
  11.  
  12. Player player;
  13. bool showWeapons;
  14.  
  15. void OnEnable()
  16. {
  17. //获取当前编辑自定义Inspector的对象
  18. player = (Player)target;
  19. }
  20.  
  21. //执行这一个函数来一个自定义检视面板
  22. public override void OnInspectorGUI()
  23. {
  24. //设置整个界面是以垂直方向来布局
  25. EditorGUILayout.BeginVertical();
  26.  
  27. //空两行
  28. EditorGUILayout.Space();
  29. EditorGUILayout.Space();
  30.  
  31. //绘制palyer的基本信息
  32. EditorGUILayout.LabelField("Base Info");
  33. player.id = EditorGUILayout.IntField("Player ID", player.id);
  34. player.playerName = EditorGUILayout.TextField("PlayerName", player.playerName);
  35.  
  36. //空三行
  37. EditorGUILayout.Space();
  38. EditorGUILayout.Space();
  39. EditorGUILayout.Space();
  40.  
  41. //绘制Player的背景故事
  42. EditorGUILayout.LabelField("Back Story");
  43. player.backStory = EditorGUILayout.TextArea(player.backStory, GUILayout.MinHeight());
  44.  
  45. //空三行
  46. EditorGUILayout.Space();
  47. EditorGUILayout.Space();
  48. EditorGUILayout.Space();
  49.  
  50. //使用滑块绘制 Player 生命值
  51. player.health = EditorGUILayout.Slider("Health", player.health, , );
  52.  
  53. //根据生命值设置生命条的背景颜色
  54. if (player.health < )
  55. {
  56. GUI.color = Color.red;
  57. }
  58. else if (player.health > )
  59. {
  60. GUI.color = Color.green;
  61. }
  62. else
  63. {
  64. GUI.color = Color.gray;
  65. }
  66.  
  67. //指定生命值的宽高
  68. Rect progressRect = GUILayoutUtility.GetRect(, );
  69.  
  70. //绘制生命条
  71. EditorGUI.ProgressBar(progressRect, player.health / 100.0f, "Health");
  72.  
  73. //用此处理,以防上面的颜色变化会影响到下面的颜色变化
  74. GUI.color = Color.white;
  75.  
  76. //空三行
  77. EditorGUILayout.Space();
  78. EditorGUILayout.Space();
  79. EditorGUILayout.Space();
  80.  
  81. //使用滑块绘制伤害值
  82. player.damage = EditorGUILayout.Slider("Damage", player.damage, , );
  83.  
  84. //根据伤害值的大小设置显示的类型和提示语
  85. if (player.damage < )
  86. {
  87. EditorGUILayout.HelpBox("伤害太低了吧!!", MessageType.Error);
  88. }
  89. else if (player.damage > )
  90. {
  91. EditorGUILayout.HelpBox("伤害有点高啊!!", MessageType.Warning);
  92. }
  93. else
  94. {
  95. EditorGUILayout.HelpBox("伤害适中!!", MessageType.Info);
  96. }
  97.  
  98. //空三行
  99. EditorGUILayout.Space();
  100. EditorGUILayout.Space();
  101. EditorGUILayout.Space();
  102.  
  103. //设置内容折叠
  104. showWeapons = EditorGUILayout.Foldout(showWeapons, "Weapons");
  105. if (showWeapons)
  106. {
  107. player.weaponDamage1 = EditorGUILayout.FloatField("Weapon 1 Damage", player.weaponDamage1);
  108. player.weaponDamage2 = EditorGUILayout.FloatField("Weapon 2 Damage", player.weaponDamage2);
  109. }
  110.  
  111. //空三行
  112. EditorGUILayout.Space();
  113. EditorGUILayout.Space();
  114. EditorGUILayout.Space();
  115.  
  116. //绘制鞋子信息
  117. EditorGUILayout.LabelField("Shoe");
  118. //以水平方向绘制
  119. EditorGUILayout.BeginHorizontal();
  120. EditorGUILayout.LabelField("Name", GUILayout.MaxWidth());
  121. player.shoeName = EditorGUILayout.TextField(player.shoeName);
  122. EditorGUILayout.LabelField("Size", GUILayout.MaxWidth());
  123. player.shoeSize = EditorGUILayout.IntField(player.shoeSize);
  124. EditorGUILayout.LabelField("Type", GUILayout.MaxWidth());
  125. player.shoeType = EditorGUILayout.TextField(player.shoeType);
  126. EditorGUILayout.EndHorizontal();
  127. EditorGUILayout.EndVertical();
  128. }
  129.  
  130. }

写完之后inspector面板上是这样的

通过自定义Inspector视图可以实现很多方便的功能。例如将脚本组件的static变量或者私有变量显示出来,或者实现多参数的联动变化,即修改其中的某个参数,其余参数会随之调整。

内容转载自https://www.jianshu.com/p/2f686da4905c

二. 编辑时运行

代码:

  1. [ExecuteInEditMode]
  2. public class Test : MonoBehaviour
  3. {
  4.  
  5. // Update is called once per frame
  6. void Update()
  7. {
  8. transform.LookAt(Vector3.zero);
  9. }
  10. }

ExecuteInEditMode表示程序的Update在编辑状态下运行

Unity---Inspector面板自定义的更多相关文章

  1. Unity Inspector面板常用的属性

    在扩展Unity的时候,往往会用到一些属性,这里将常用的列一下. 1.属性只读: #if UNITY_EDITOR using UnityEditor; #endif using UnityEngin ...

  2. Unity 自定义Inspector面板时的数据持久化问题

    自定义Inspector面板的步骤: Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Ed ...

  3. 让Unity的Inspector面板支持字符限制(restrict)功能

    今天在优化红点组件,笔者打算将红点id由10进制改为16进制处理,就打算将红点id字段由uint类型改成string类型,用于填写16进制的字符(因为在Inspector面板里,uint/int类型字 ...

  4. 使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法

    使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法 效果展示 一个很简单的组件脚本 运行状态在Inspector面板可以随便修改字段和调用方法 方法调用日志 设计由来 最近在 ...

  5. Unity编辑器环境在Inspector面板中显示变量

    Serialize功能Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系. 简单的说,在没有自定义Inspector的情况下所有 ...

  6. Unity编辑器重写Inspector面板,面板中编辑的数据不触发场景发生变化的问题。

    今天开始协助主程一起制作新框架.主程让我写关于新版UI框架注册UI预制体用的快捷编辑器. 现学现写,总算完成了. 可以直接把选中的预制体添加到UIController的数组中,期间涉及到改变大小.所以 ...

  7. Unity3d Inspector面板实现set/get访问器

    简单说一下属性和字段的区别:字段就是成员变量,而属性确实提供给外部访问内部成员变量的接口.之所以会有属性的出现,就是为了避免外部对类的成员的直接访问,通俗的说就是OOP中的封装思想. using Un ...

  8. Unity3D:Text在Inspector面板中中无法显示,需转换成UTF-8格式

    环境:Win10 读取text内容后unity报错:Input string was not in the correct format 同时在Inspector面板中无法预览Text文本内容 随后发 ...

  9. Unity检视面板的继承方法研究 (二)

    之前做了普通对象的可继承的检视面板类, 现在想要实现对Unity自带的检视面板的继承的话, 要怎样写呢? 万变不离其宗,  仍然是围绕UnityEditor.Editor.CreateEditor 这 ...

随机推荐

  1. python的学习之路day7-socket网络编程

    python基础部分学习完了,时间也已经过了两个月左右,感觉没学到什么,可能是我学习之后忘记的太多了. 由于没钱买书,要是去培训就更没钱了,所以在网上找了一本书,感觉还不错,讲的比较好,比较详细. P ...

  2. struts2框架

    详细教程 参考struts教程https://www.w3cschool.cn/struts_2/struts_configuration.html Struts2 基于MVC设计模式的web应用程序 ...

  3. 乘风破浪:LeetCode真题_028_Implement strStr()

    乘风破浪:LeetCode真题_028_Implement strStr() 一.前言     这次是字符串匹配问题,找到最开始匹配的位置,并返回. 二.Implement strStr() 2.1 ...

  4. Mojave使用pyenv安装python-zlib错误

    mojave使用pyenv编译python出现 zipimport.ZipImportError: can't decompress data; zlib not available错误 解决方案: ...

  5. Django商城项目笔记No.5用户部分-注册接口-短信验证码

    Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...

  6. 浅析Java虚拟机结构与机制[转]

    本文旨在给所有希望了解JVM(Java Virtual Machine)的同学一个概念性的入门,主要介绍了JVM的组成部分以及它们内部工作的机制和原理.当然本文只是一个简单的入门,不会涉及过多繁杂的参 ...

  7. Effective MySQL之SQL语句最优化——读书笔记之一

    第一章,DBA5分钟速成 本章知识点如下: 寻找运行慢SQL的语句: show full processlist查看所有正在执行的进程及执行的语句耗时: 命令后面\G可以让命令按行显示(默认是按列). ...

  8. WorldWind源码剖析系列:视景体类Frustum

    PluginSDK中的视景体类Frustum是三维计算机图形学中的概念,主要用来描述透视投影的过程.三维计算机图形学中关于三维物体的渲染,Direct3D和OpenGL都是先通过对现实世界中的场景先进 ...

  9. 理解javascript观察者模式(订阅者与发布者)

    什么是观察者模式? 观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象.它是由两类对象组成,主题和观察者 ...

  10. Android 多用户多缓存的简单处理方案

    需求:1.在缓存中记录用户登录信息.例如:用户名,密码 2.记录用户操作数据.例如:是否记住用户名密码.设置7天内自动登录等 简单设计:1)使用sqlite设计一张用户数据表,有用户名.密码.操作数据 ...