Inspector a ProgressBar(定制属性面板)
一、定制进度条
这篇文章主要学习如何在Unity的Inspector中使用ProgressBar
普通属性面板预览
通常我们的属性面板如下

定制属性面板预览
而通过扩展成ProcessBar后

二、内容简介
Inspector面板可以用来对Component和Asset进行快速编辑。
如果您的Unity中没有看到Inspector面板,可以通过快捷键方式 Ctrl+3 打开。
这篇文章我们将对一个类制作一个自定义的Inspector面板。
三、默认的Inspector样式
MyActor.cs
新建一个C#文件,命名为MyActor.cs,输入下面的代码。这些代码定义了一个MyActor class,它继承自MonoBehaviour,是一个用户自定义的component。
using UnityEngine;
using System.Collections;
public class MyActor : MonoBehaviour
{
public int LuckyPoint = 3;
public int ATK = 75;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
问题思考
是不是只有派生自MonoBehaviour的类才能够进行自定义化Inspector?
不是,例如贴图,模型等不用附加到GameObject上的资源文件,可以在Project面板下显示并选中,在Inspecotor面板中会列出这些资源的属性,并且可以进行修改。
如果您也要自定义asset,需要继承自ScriptableObject class。
您可以在Project面板中选择一个FBX文件,或者一个Texture文件,查看Inspector的变化。自定义资源和Inspector会在以后的课程中进行讲解。
然后我们在场景中新建一个GameObject,将上面的脚本添加到该GameObject上。 如果一个GameObject拥有该component,那么在Inspector面板中会显示相关的一些信息。默认情况下,Unity会自动为我们生成一个component编辑面板,他会把所有的public的变量显示在Inspector中。如下图:

四、自定义Inspector面板
属性面板定制需求
Unity默认的Inspector面板可以随意对该变量进行修改。如果MyActor类中的这些变量对输入的数值有范围要求,例如只能输入0到100,这在默认的输入框下是无法做到的。但在自定义Inspector中,我们可以使用slider bar控件对输入范围进行限制。如果这个MyActor最后是要给关卡设计师使用,他就不可能输入一些无效的数值。下图为自定义后的Inspector,可以看到我们用slider bar代替了原来的输入框,并且设置slider bar的输入数值的范围为0到100,还加入了一个progress bar显示数值的范围。通过自定义Inspector就能制作适合各种类型的component的Inspector。

现在我们开始自定义Inspector面板的内容,自定义后的Inspector如上图所示。 首先创建一个新的C#文件,命名为MyActorInspector.cs,并将该文件放在Editor文件夹下。
创建MyActorInspector.cs
下面的代码将会创建一个自定义的Inspector,你将会在Inspector面板中看到最后的效果。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(MyActor))]
public class MyActorInspector : Editor
{
public int ATKProp;
public int LuckyPointProp;
void OnEnable()
{
MyActor myActor = target as MyActor;
ATKProp = myActor.ATK;
LuckyPointProp = myActor.LuckyPoint;
}
public override void OnInspectorGUI()
{
ATKProp = EditorGUILayout.IntSlider("ATK", ATKProp, 0, 100);
ProgressBar((ATKProp/100.0f),"ATK");
LuckyPointProp = EditorGUILayout.IntSlider("Lucky Point", LuckyPointProp, 0, 5);
ProgressBar((LuckyPointProp/5.0f), "Lucky Point");
}
private void ProgressBar(float value, string label)
{
//定义 Rect
Rect rect = GUILayoutUtility.GetRect(18, 18, "TextField");
//创建progressbar
EditorGUI.ProgressBar(rect,value,label);
//添加一个空行
EditorGUILayout.Space();
}
}
然后打开Unity编辑器,选中GameObject,您就能看到自定义Inspector面板的内容了
问题思考
为什么要放在Editor文件夹下?Unity规定所有的Editor classes都必须放在Editor文件夹下,这样Untiy运行Editor文件夹的Editor class,游戏中运行的代码不要放在Editor文件夹下。
下面对这MyActoorInspector类进行详细讲解。
五、Editor class
CustomEditor
Editor class是所有自定义Inspector的基类。我们必需从Editor class开始派生我们自己的Inspector。
[CustomEditor(typeof(MyActor))]
public class MyActorInspector : Editor
下面这行代码指定了自定义Inspector的关联类的类型,我们这里要对MyActor类进行关联。这行代码的作用就是当您选中含有MyActor的GameObject时,就会显示MyActorInspector。
[CustomEditor(typeof(MyActor))]
六、初始化
Editor class继承自ScriptableObject,ScriptableObject有三个关于生命周期的消息响应函数:
- OnEable
- OnDisable
- OnDestory
对于MyActorInspector来说,每当要显示自定义Inspector的时候就会调用OnEable,当切换到其他Inspector面板的时候就会调用OnDisable。所以OnEnable是进行初始化最好的地方。
在下述的初始化代码中,我们获取了当前选中的对象的成员变量。
void OnEnable()
{MyActor myActor = target as MyActor;
ATKProp = myActor.ATK;
LuckyPointProp = myActor.LuckyPoint;
}
在上述的代码中,出现了一个新变量target,他代表了当前要进行Inspect的对象,在MyActorEditor类中,我们指定Inspect MyActor类,所以target就是当前MyActor的一个引用。我们使用as操作符先对target进行类型转化。
Edtior类还有两个成员变量是用来表示当前选中的对象,他们分别叫做targets和serializedObject。
七、绘制GUI
如果您在游戏开发中使用过Unity自带的GUI类,那么您会发现EditorGUI类接口同GUI基本是同样的设计思路。所有的UI绘制必须放在OnInspectorGUI方法中,就好比在游戏中所与的GUI函数必须放在OnGUI方法中。
OnInspectorGUI
Unity Editor->OnInspectorGUI()
public override void OnInspectorGUI()
{ATKProp = EditorGUILayout.IntSlider("ATK", ATKProp, 0, 100);ProgressBar((ATKProp/100.0f),"ATK");
LuckyPointProp = EditorGUILayout.IntSlider("Lucky Point", LuckyPointProp, 0, 5);ProgressBar((LuckyPointProp/5.0f), "Lucky Point");
}
Unity Engine->OnGUI()
void OnGUI()
{GUILayout.BeginHorizontal();
animTime = GUILayout.TextField(animTime.ToString(), GUILayout.Width(100)).ToInt32();
if (GUILayout.Button("Start 1")){StartCoroutine(BeginAnim(animTime));
}
GUILayout.EndHorizontal();
if (GUILayout.Button("IsFull")){NGUIDebug.Log("" + IsFull());}
}
EditorGUI类有一个方便布局的版本,叫做EditorGUILayout。使用EdiorGUILayout可以不用指定每个控件的坐标位置从而省去了每次进行计算坐标的苦差事。EditorGUILayout会更具调用顺序进行自动布局。在上述代码中我就使用了EditorGUILayout创建progress bar和slider bar。
八、总结
我们在这一课中详细介绍了创建一个自定义Inspector的详细步骤。我们制作了一个简单的Inspector面板,下一课我们会具体介绍更多的Editor class的功能。
Inspector a ProgressBar(定制属性面板)的更多相关文章
- Xcode 属性面板添加自定义控件属性
让自定义控件像原生控件一样可以在属性面板配置参数,Apple文档传送 直接上效果图,根据
- XCode属性面板使用说明
Xcode 中Interface Builder 工具 是一个功能强大的“所见即所得”开发工具.本文主要介绍属性面板 和 对象库面板 对象库面板: 提供了所有Cocoa Touch 库给我们定义好的 ...
- c#自定义控件属性面板及选择资源设置
博客转移到 http://jacean.github.io/ 继续分享编程经验 因为要做流体布局,但两个控件没办法组合,就做自定义控件.这个控件需要一个text设置文本,一个pic设置图片显示,图片通 ...
- SharePoint 2013 WebPart属性面板配置
为WebPart添加右侧的属性面板,方便将来对于WebPart的配置,我们只需要在CustomWebPart.cs文件里面,声明一下变量即可: private string url = string. ...
- 根据选中不同的图元来显示不同的属性面板changePropertyPane.html
在现实生活中,我们有很多时候需要根据选中不同的东西来获取不同的属性,并且就算是同类型的东西我们有时也希望显示不同的属性,就像每个人都有不同的个性,可能会有相同点,但是不可能完全相同. 根据这个思想,我 ...
- 潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)
1,new方法: 类每次实例化时都会创建一个新的对象, class Textcls: # cls 是指类本身, def __new__(cls, *args, **kwargs): # 在 __ini ...
- 开启Unity项目中VS工程的属性面板
https://www.cnblogs.com/CodeGize/p/7859656.html Unity生成的VS工程一般是无法打开属性面板的.但是事实上,如果使用VS for unity,通过配置 ...
- Python__new__方法、定制属性访问、描述符与装饰器
__new__方法的运行顺序 装饰器的概念的用法 三个内置装饰器 类中属性的访问过程 __new__方法 创建实例的方法 __new__方法是在类创建实例的时候自动调用的 实例是通过类里面的__new ...
- winform 自定义控件属性在属性面板中显示
Jan.David Nothing is impossible, the word itself says 'I'm possible'!" — Audrey Hepburn winform ...
随机推荐
- 设计模式总结篇系列:观察者模式(Observer)
观察者模式中通常有两个基本的概念主题:观察者和被观察者.当被观察者状态发生改变时,需要通知相应的观察者,当然,每个被观察者所对应的观察者可能不知一个,他们之间是1:n的关系.用专业一点的术语对观察者模 ...
- ArrayList实现源码分析
本文将以以下几个问题来探讨ArrayList的源码实现 1.ArrayList的大小是如何自动增加的 2.什么情况下你会使用ArrayList?什么时候你会选择LinkedList? 3.如何复制某个 ...
- jquery TypeError: 'undefined' is not a function (evaluating 'elem.nodeName.toLowerCase()') [jquery.js:1904]错误原因
今天,某个环境报了个js错误,TypeError: 'undefined' is not a function (evaluating 'elem.nodeName.toLowerCase()') [ ...
- spring编程式刷新/重新加载applicationcontext/dispatchservlet(正确版)
有些时候,尤其是在开发应用框架的时候,由于某些原因无法或者很难重启tomcat或者reload应用,但是配置又需要动态生效,这个时候通常希望通过reload spring applicationcon ...
- android:ellipsize实现跑马灯效果总结(转)
最近无意间看到了涉及到跑马灯效果的代码,于是在网上查阅了很多资料,在这里对自己看的一些文章进行一下总结,顺便加上自己的一些体会. 让我们一步步逐渐向下. 首先我们要实现走马灯这样一个效果,通常来说 ...
- SAP中获取当前用户相关信息的两个函数
函数名:TH_USER_LIST作用:可以得到SM04界面显示样式的表. 函数名:TH_USER_INFO作用:可以得到当前特定用户的机器名.当前活动窗口数.IP地址等信息
- maven eclipse 插件下载地址
要用的时候,搜索了半天,自己记录下 单独下载地址 http://maven.apache.org/download.cgi eclipse 更新地址 http://download.eclipse.o ...
- Android开发笔记——常见BUG类型之内存泄露与线程安全
本文内容来源于最近一次内部分享的总结,没来得及详细整理,见谅. 本次分享主要对内存泄露和线程安全这两个问题进行一些说明,内部代码扫描发现的BUG大致分为四类:1)空指针:2)除0:3)内存.资源泄露: ...
- 怎么直接让火狐输入json数据,而不是弹出文件保存对话框?
一.问题再现: 我需要浏览器输出的是json数据,但是浏览器弹出的是一个文件保存的对话框,这样的体验有点差.所以想怎么让浏览器直接输出到浏览器的页面上面,并且格式的输出,还可以编辑. 测试数据: ht ...
- 转载的vim配置文件
""""""""""""""""&quo ...