一、定制进度条

这篇文章主要学习如何在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的功能。

    官方文档:http://docs.unity3d.com/ScriptReference/Editor.html

    转载自:http://blog.csdn.net/jiejieup/article/details/8299409

Inspector a ProgressBar(定制属性面板)的更多相关文章

  1. Xcode 属性面板添加自定义控件属性

    让自定义控件像原生控件一样可以在属性面板配置参数,Apple文档传送 直接上效果图,根据

  2. XCode属性面板使用说明

    Xcode 中Interface Builder 工具 是一个功能强大的“所见即所得”开发工具.本文主要介绍属性面板 和  对象库面板 对象库面板: 提供了所有Cocoa Touch 库给我们定义好的 ...

  3. c#自定义控件属性面板及选择资源设置

    博客转移到 http://jacean.github.io/ 继续分享编程经验 因为要做流体布局,但两个控件没办法组合,就做自定义控件.这个控件需要一个text设置文本,一个pic设置图片显示,图片通 ...

  4. SharePoint 2013 WebPart属性面板配置

    为WebPart添加右侧的属性面板,方便将来对于WebPart的配置,我们只需要在CustomWebPart.cs文件里面,声明一下变量即可: private string url = string. ...

  5. 根据选中不同的图元来显示不同的属性面板changePropertyPane.html

    在现实生活中,我们有很多时候需要根据选中不同的东西来获取不同的属性,并且就算是同类型的东西我们有时也希望显示不同的属性,就像每个人都有不同的个性,可能会有相同点,但是不可能完全相同. 根据这个思想,我 ...

  6. 潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)

    1,new方法: 类每次实例化时都会创建一个新的对象, class Textcls: # cls 是指类本身, def __new__(cls, *args, **kwargs): # 在 __ini ...

  7. 开启Unity项目中VS工程的属性面板

    https://www.cnblogs.com/CodeGize/p/7859656.html Unity生成的VS工程一般是无法打开属性面板的.但是事实上,如果使用VS for unity,通过配置 ...

  8. Python__new__方法、定制属性访问、描述符与装饰器

    __new__方法的运行顺序 装饰器的概念的用法 三个内置装饰器 类中属性的访问过程 __new__方法 创建实例的方法 __new__方法是在类创建实例的时候自动调用的 实例是通过类里面的__new ...

  9. winform 自定义控件属性在属性面板中显示

    Jan.David Nothing is impossible, the word itself says 'I'm possible'!" — Audrey Hepburn winform ...

随机推荐

  1. [转]MVC、MVP、MVVM

    界面之下:还原真实的 MVC.MVP.MVVM 模式 [日期:2015-10-28] 来源:github.com/livoras  作者:戴嘉华 [字体:大 中 小]   前言 做客户端开发.前端开发 ...

  2. iOS 七牛云上传并获取图片----【客户端】

           最近做了七牛云存储的有关内容,涉及到与后台交互获取验证的token,无奈,后台自命清高,不与理会,没办法呀,于是自己搞呗.首先呢在在七牛上注册一个账号,然后呢添加一个存储空间这时候空间名 ...

  3. NYOJ 42 一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  4. SQL Server的各种表

    以下表格简便易懂 请认真仔细斟酌! 字符串函数: 字符串函数用于对字符串数据进行处理,并返回一个字符串或者数字. 函数名 描述 例子 CHARINDEX 用来寻找一个指定的字符串在另一个字符串中的起始 ...

  5. 照着别人的demo自己试着做了个放大镜效果

    原理: A:放大镜   B:小图片 C:大图片可视区域 D:大图片 鼠标的位置应该在放大镜的中央,所以鼠标位置为:clientX=A.offsetLeft()+B.offsetLeft+1/2*A.o ...

  6. MSCRM 2011 操作大全

    CRM字段类型:货币:new Money(Decimal){SQL更新Money类型字段,需要同时更新_base字段,存在汇率差的时候值不同}查找:new EntityReference(object ...

  7. 扩展SharePoint链接字段

    默认SharePoint中的链接字段有很多限制,例如 输入文字的时候只能录入255个字符 链接显示的是文字 点击链接后只能在当前页面打开链接 - - - - - - -- - - - - - -   ...

  8. VC连接mysql数据库错误:libmysql.lib : fatal error LNK1113: invalid machine 解决方法

    VC连接MySQL的配置过程在上一篇博文中,不过当你设置好,以为万事大吉的时候,运行却出现这个错误:libmysql.lib : fatal error LNK1113: invalid machin ...

  9. HBase读写路径的工作机制

    出处:http://wuyudong.com/1946.html HBase 写路径工作机制 在HBase 中无论是增加新行还是修改已有的行,其内部流程都是相同的.HBase 接到命令后存下变化信息, ...

  10. android 短信助手demo

    关于意图Intent: 显式意图:必须指定要激活的组件的完整包名和类名(应用程序之间耦合在一起) 一般激活自己应用的组件的时候采用显式意图 隐式意图:只需要指定动作和数据就可以(好处是应用程序之间没有 ...