前面写了四篇关于编辑器的:

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

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

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

Unity3D编辑器扩展(四)——扩展自己的组件

今天我们来讲解在编辑器扩展中我们常用的特性(Attribute)以及 Selection 类。

常用特性(Attribute):

1、InitializeOnLoad:监听Unity3D启动事件。需要将该脚本放在Editor文件夹下,Unity3D点击Play按钮或者修改过该脚本,编译完成后会调用该类的静态构造函数。可以给 EditorApplication.update 委托添加方法,达到持续调用的效果。

代码:

using UnityEngine;
using UnityEditor; [InitializeOnLoad]
public class Startup
{
static Startup()
{
Debug.Log("Up and running");
EditorApplication.update += Update;
} static void Update()
{
Debug.Log("Updating");
}
}

效果图:

2、InitializeOnLoadMethod:与 InitializeOnLoad 效果一样。

代码:

using UnityEngine;
using UnityEditor; public class MyClass
{
[InitializeOnLoadMethod]
static void OnProjectLoadedInEditor()
{
Debug.Log("Project loaded in Unity Editor");
}
}

效果图:

3、HideInInspector:属性面板中隐藏相关的属性。

代码:

using UnityEngine;

public class Player : MonoBehaviour
{
public int hp = ;
[HideInInspector]
public int attack = ;
}

效果图:attack 被隐藏,只能看见 hp

4、Tooltip:鼠标放到属性上的时候,会自动提示帮助/提示信息。

代码:

using UnityEngine;

public class Player : MonoBehaviour
{
[Tooltip("玩家生命值")]
public int hp = ;
[HideInInspector]
public int attack = ;
}

效果图:

5、Range:用于将一个值指定在一定的范围内,并在Inspector面板中为其添加滑块。

代码:

using UnityEngine;

public class Player : MonoBehaviour
{
[Tooltip("玩家生命值")]
public int hp = ;
[HideInInspector]
public int attack = ;
[Range(0f,10f)]
public float speed = 5f;
}

效果图:

6、RequireComponent:“自动”帮你添加你需要(依赖)的组件,如果已经存在则不再重复添加,且不能移除。

提示:经过测试,发现一个问题,如果脚本已经挂在物体身上,然后再修改脚本,为添加 RequireComponent 属性的话,完全不起作用,因此建议大家在用此属性的时候要注意。

代码:

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour
{
[Tooltip("玩家生命值")]
public int hp = ;
[HideInInspector]
public int attack = ;
[Range(0f,10f)]
public float speed = 5f;
}

效果图:

7、HelpURL:提供一个自定义的文档链接,点击组件上的文档图标既能打开到你指定的链接。

提示:填写链接时,一定要写上 http:// 或者 https://,否则将无任何反应。

代码:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour
{
[Tooltip("玩家生命值")]
public int hp = ;
[HideInInspector]
public int attack = ;
[Range(0f,10f)]
public float speed = 5f;
}

效果图:

8、Multiline:用于给 string 类型添加多行输入。

代码:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour
{
[Multiline()]
public string nickName = "";
[Tooltip("玩家生命值")]
public int hp = ;
[HideInInspector]
public int attack = ;
[Range(0f,10f)]
public float speed = 5f;
}

效果图:

9、Header:用于添加属性的标题。

代码:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour
{
[Header("玩家昵称")]
[Multiline()]
public string nickName = ""; [Tooltip("玩家生命值")]
public int hp = ; [HideInInspector]
public int attack = ; [Range(0f,10f)]
public float speed = 5f;
}

效果图:

10、Space:用于为在 Inspector 面板 两属性之间添加指定的距离。

代码:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour
{
[Header("玩家昵称")]
[Multiline()]
public string nickName = ""; [Tooltip("玩家生命值")]
public int hp = ; [HideInInspector]
public int attack = ; [Range(0f,10f)]
public float speed = 5f;
[Space()]
public bool isMove = false;
}

效果图:

11、ContextMenu:允许添加一个命令到该组件上,你可以通过右键或者点击设置图标来调用到它(一般用于函数),且是在非运行状态下执行该函数。这个我们在第一篇讲添加菜单时,也提到过。

代码:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour
{
[Header("玩家昵称")]
[Multiline()]
public string nickName = ""; [Tooltip("玩家生命值")]
public int hp = ; [HideInInspector]
public int attack = ; [Range(0f,10f)]
public float speed = 5f;
[Space()]
public bool isMove = false; [ContextMenu("DoSomething")]
private void DoSomething()
{
Debug.Log("Do Something......");
}
}

效果图:

12、Gizmos: 绘制图形。

代码:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour
{
[Header("玩家昵称")]
[Multiline()]
public string nickName = ""; [Tooltip("玩家生命值")]
public int hp = ; [HideInInspector]
public int attack = ; [Range(0f,10f)]
public float speed = 5f;
[Space()]
public bool isMove = false; [ContextMenu("DoSomething")]
private void DoSomething()
{
Debug.Log("Do Something......");
} private void OnDrawGizmos()
{
Gizmos.DrawWireSphere(Vector3.zero, 3f);
}
}

效果图:

上面都是我们常用的一些特性,下面来介绍一下我们在编辑器扩展中常用的类 Selection

Selection 类是编辑器类,使用需要 using UnityEditor; 且脚本要放在 Editor 文件夹。

静态变量:
 Selection.activeGameObject:返回当前点击的场景游戏物体或Project预制体;选择多个则返回第一个选择的;未选择相应的则返回null
 Selection.activeTransform:返回当前点击的场景游戏物体;选择多个则返回第一个选择的;未选择相应的则返回null
 Selection.activeObject:返回当前点击的场景游戏物体或Project资源(包括场景、脚本、预制等任意);选择多个则返回第一个选择的;未选择相应的则返回null
 Selection.gameObjects:返回一个数组,内容为当前点击的场景物体或Project预制体;不符合条件的当前选择不会加入到数组;未选择返回长度为0的数组而不是null
 Selection.transforms:返回一个数组,内容为当前点击的场景物体;不符合条件的当前选择不会加入到数组;未选择返回长度为0的数组而不是null
 Selection.objects:返回一个数组,内容为当前点击的场景物体或Project资源(包括场景、脚本、预制等任意);不符合条件的当前选择不会加入到数组;未选择返回长度为0的数组而不是null
 Selection.selectionChanged:委托,选择的东西变化的时候调用

静态函数
 Contains:选择项中是否包含物体
 bool Selection.Contains(int instanceID)
 bool Selection.Contains(Object obj)

 GetFiltered:返回按类型和模式过滤的当前选择。
 对于一个具有多个类型组件的选定的游戏对象,只有第一个组件将包含在结果中。
 如果类型是 ComponentGameObject 的子类,则支持完整的 SelectionMode
 如果类型不是 Component GameObject 的子类,(例如:网格或脚本对象)则只支持有 SelectionMode.ExcludePrefab  SelectionMode.Editable
 Object[] activeGos= Selection.GetFiltered( GameObject,SelectionMode.Editable | SelectionMode.TopLevel);

 GetTransforms:允许使用 SelectionMode 对选择类型进行细粒度的控制。
 Transform[] selectionObjs= Selection.GetTransforms(SelectionMode.TopLevel | SelectionMode.Editable);
 Unfiltered:返回整个选择
 TopLevel:只返回最上面选择的transform。另一个选定的transform的选定子物体将被过滤掉。
 Deep:返回选择的物体和它所有的子代
 ExcludePrefab:排除选择里的所有预制体
 Editable:排除任何不被修改的对象。
 Assets:只返回Asset文件夹的资源
 DeepAssets:如果选择里包含文件夹,则也包括文件夹里的文件和子文件夹。

Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类的更多相关文章

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

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

  2. Unity3D编辑器扩展(四)——扩展自己的组件

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

  3. unity3D编辑器扩展

    编辑器扩展只是在编辑项目中运行,发布出来是不会运行的. 固定创建一个文件夹Editor:所有的资源或者代码都不会被打包进去. 01.使用MenuItem添加菜单栏按钮 脚本不需要作为组件存在,可以不用 ...

  4. Unity3d编辑器扩展学习笔记

    编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...

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

    Unity3D 引擎的编辑器拥有很强的扩展性,用的好可以帮我们省很多事情.在这里记录下如何去扩展 Unity3D 的编辑器,定制属于我们自己的开发环境. 本篇主要讲解在 Unity3D 引擎的各个窗口 ...

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

    前两篇分别讲解了创建菜单https://www.cnblogs.com/xiaoyulong/p/10115053.html和创建窗口https://www.cnblogs.com/xiaoyulon ...

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

    上一篇我们讲了如何定义菜单按钮 https://www.cnblogs.com/xiaoyulong/p/10115053.html 这一篇我们讲如何定义自己的窗口. 定义窗口我们需要继承 Edito ...

  8. [Unity3D]编辑器扩展之数组或List显示

    效果如下: 源码如下: using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace XM.Edi ...

  9. Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口

    Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...

随机推荐

  1. Linux 标准输入输出、错误输出、重定向标准输出

    再来看看 >& 操作符: 重定向操作符 描述 > 将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄. < 从文件而不是从键盘或句柄读入命令输入. >& ...

  2. Python学习—数据库篇之SQL语句

    一.数据库级别 1.显示数据库 show databases; 默认数据库: mysql - 用户权限相关数据 test - 用于用户测试数据 information_schema - MySQL本身 ...

  3. java第七章集合框架

    如果想存储多个人物信息可以使用数组实现但是采用数组存以下明显缺陷: 数组长度不变不能适应元素变化情况,若存储大于20个英雄信息则长度不够,若只存储10个则造成内存空间浪费.可用.length获取数组中 ...

  4. Ubuntu---gcc && g++

    摘要:今天用 gcc 编译 c++ 代码,发现会报错:std::cout  这个函数无定义,所以决定查一下原因,在这里总结一下,虽然以后回头看一定会觉得太菜,但是新手期还是总要经历的一个阶段,所以就记 ...

  5. FPGA驱动步进电机

    步进电机 步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受 ...

  6. 编写函数,接受一个string,返回一个bool值,指出string是否有5个或者更多字符,使用此函数打印出长度大于等于5的元素

    #include <algorithm> using namespace std; bool isFive(const string& s1) { return s1.size() ...

  7. JavaWeb练习-网上名片管理系统

    实验项目名称 JavaWeb网上名片管理系统 实验目的 实现名片的增.删.改.查等操作. 实验基本原理 JSP指令.JSP动作.JSP内置对象等 主要仪器设备及耗材 Win10.Myeclipse 实 ...

  8. 我的mac下有关php扩展的安装

    之前安装yaf和mcrypt扩展一直失败,今天终于找到原因了.那是因为./configure的时候没有指定php版本,所以用了默认的php的版本,正确的姿势应该是:./configure --with ...

  9. 刷题的model格式(请用英文)

    [抄题]: [暴力解法]: 时间分析: 空间分析: [优化后]: 时间分析: 空间分析: [奇葩输出条件]: [奇葩corner case]: [思维问题]: [英文数据结构或算法,为什么不用别的数据 ...

  10. redis各类错误可能的解决方案

    .报Timeout performing EVAL 这个可能是连到读库从库了,直接改成写库就没问题了. 2. 各种ConnectTimeout 一般是偶尔或经常就超时,这种情况,找了各种回答,最后在s ...