前面已经写了三篇:

Unity3D编辑器扩展(一)——定义自己的菜单按钮

Unity3D编辑器扩展(二)——定义自己的窗口

Unity3D编辑器扩展(三)——使用GUI绘制窗口

今天写第四篇,扩展自己的自定义组件。

通常我们使用继承自 Editor 的自定义编辑器类,来扩展自己的组件的检视面板和编辑器,并配合 CustomEditor 特性语法,附加该编辑器到一个自定义组件。

首先我们先定义一个组件 Player

 using UnityEngine;

 public class Player : MonoBehaviour
{
public int armor = ; //护甲
public int attack = ; //攻击力
}

一个简单的 Player 组件,有护甲和攻击力两个属性,挂载后,效果如下:

接下来我们对 Player 进行扩展,代码如下:

using UnityEngine;
using UnityEditor; [CustomEditor(typeof(Player))]
public class EditorTest : Editor
{
public override void OnInspectorGUI()
{
var _target = (Player)(serializedObject.targetObject);
_target.armor = EditorGUILayout.IntSlider("护甲", _target.armor, , );
ProgressBar(_target.armor / 100f, "护甲");
_target.attack = EditorGUILayout.IntSlider("攻击力", _target.attack, , );
ProgressBar(_target.attack / 100f, "攻击力");
}
private void ProgressBar(float value, string label)
{
Rect rect = GUILayoutUtility.GetRect(, );
EditorGUI.ProgressBar(rect, value, label);
EditorGUILayout.Space();
}
}

效果图:

是不是感觉漂亮了很多,直观了很多。这样我们就可以把很多UI控件扩展到我们的组件上,显得高大上。

实效上面这种效果,还有另外一种方法:

using UnityEngine;
using UnityEditor; [CustomEditor(typeof(Player))]
public class EditorTest : Editor
{
private SerializedProperty attack;
private SerializedProperty armor;
void OnEnable()
{
attack = serializedObject.FindProperty("attack");
armor = serializedObject.FindProperty("armor");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.IntSlider(armor, , , new GUIContent("护甲"));
ProgressBar(armor.intValue / 100f, "护甲");
EditorGUILayout.IntSlider(attack, , , new GUIContent("攻击力"));
ProgressBar(attack.intValue / 100f, "攻击力");
serializedObject.ApplyModifiedProperties();
}
private void ProgressBar(float value, string label)
{
Rect rect = GUILayoutUtility.GetRect(, );
EditorGUI.ProgressBar(rect, value, label);
EditorGUILayout.Space();
}
}

这种方法和第一种方法效果是一样的,就不上图了。

扩展自定义组件我们除了写编辑器类以外,还会用到很多特性,特性的使用在下一节。

Unity3D编辑器扩展(四)——扩展自己的组件的更多相关文章

  1. Unity3D编辑器扩展(六)——模态窗口

    前面我们已经写了5篇关于编辑器的,这是第六篇,也是最后一篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)—— ...

  2. Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类

    前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...

  3. 扩展Unity3D编辑器的脚本模板

      近期在学习Shader时感觉Shader语言參数众多.语法诡异,假设每次都从头開始写Shader一定是一件痛苦的事情.假设能够在本地定义好一组标准的Shader模板,这样当我们须要实现某些效果相似 ...

  4. hiho一下 第九十五周 数论四·扩展欧几里德

    题目 : 数论四·扩展欧几里德 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho周末在公园溜达.公园有一堆围成环形的石板,小Hi和小Ho分别站在不同的石板上 ...

  5. 【干货】.NET开发通用组件发布(四) 日志记录组件

    组件介绍和合作开发 http://www.cnblogs.com/MrHuo/p/MrHuoControls.html 日志记录组件功能介绍 通过基类Logger,实现了文本记录日志和数据库记录日志两 ...

  6. 编译安装PHP7并安装Redis扩展Swoole扩展

    编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...

  7. unity3D Socket连接C#server出现unity3D编辑器再次启动连接 unity3D编辑器马上卡死

    unity3D Socket与C#server第一次连接时通讯正常.客服端段关闭后.unity3D编辑器再次启动连接 unity3D编辑器马上卡死 原因是Socket处于异步状态,而异步线程是不受Un ...

  8. 扩展javascript扩展(类,对象,原型)

     扩展javascript扩展(类,对象,原型)

  9. .NET:不要使用扩展方法扩展Object对象。

    C#的扩展方法算是一种Minin(掺入)机制,掺入方法有其合理的使用场景,这里说说一种不好的使用场景(个人意见):不要使用扩展方法扩展Object对象.扩展Object会对所有类型的示例有侵入,特别是 ...

随机推荐

  1. Git自学笔记

    Git是什么? Git是目前世界上最先进的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git与SVN的区别有哪些? ① Git是分布式的,SVN不是.这是Git和其它非分布式版本控制系 ...

  2. CSS初识盒子

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. python入门(十四):面向对象(属性、方法、继承、多继承)

    1.任何东西1)属性(特征:通常可以用数据来描述)(类变量和实例变量)2)可以做一些动作(方法) 类来管理对象的数据.属性:类变量和实例变量(私有变量)方法:    1)实例方法    2)类方法   ...

  4. 循环输入到列表的基础方法 -----python-----

    print('向列表中添加元素(输入“#”结束)\n并查看添加完的列表') list1=[] while 1: username=input('>>>') if (username. ...

  5. Xamarin.Form怎么调用原生方法

    ---恢复内容开始--- Xamarin.Form怎么调用原生包 今天我想和大家分享的是有关Xamarin如何调用安卓的原生代码,下面的例子以大家可能会经常用到的微信WX方法的调用. 首先我们新建一个 ...

  6. jackson 字符串转对象

    ObjectMapper mapper = new ObjectMapper(); Map<String, Object> map = mapper.readValue(str, Map. ...

  7. Linux - 常用 Linux 命令的基本使用

    常用 Linux 命令的基本使用 目标 理解学习 Linux 终端命令的原因 常用 Linux 命令体验 01. 学习 Linux 终端命令的原因 Linux 刚面世时并没有图形界面,所有的操作全靠命 ...

  8. 初次见面,C++(的博客作业)

    懵懂无知.编程是什么?要是你在两个月前问我这个问题,你可能只会得到一个回答“天知道”.依稀记得在初中,上电脑课的老师曾经触及过编程的皮毛(那时候也没有编程的概念,听的似懂非懂),旁边一个同学却在十分熟 ...

  9. 区间dp(入门题)

    区间dp:顾名思义就是在区间上进行动态规划,通过合并小区间求解一段区间上的最优解. 常见模板: for(int len=1;len<n;len++){//区间长度 for(int be=1;be ...

  10. WebSocket入门及示例

    前言 一直在想要不要写下这篇,因为网上关于websocket的介绍和使用的好文实在太多太多,例如有这篇和这篇. 但我不管了,写下来,这样我就不用在想使用的时候总是去翻写过的源码了. 先回答几个简单的问 ...