Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类
前面写了四篇关于编辑器的:
今天我们来讲解在编辑器扩展中我们常用的特性(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:返回按类型和模式过滤的当前选择。
对于一个具有多个类型组件的选定的游戏对象,只有第一个组件将包含在结果中。
如果类型是 Component 或 GameObject 的子类,则支持完整的 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类的更多相关文章
- Unity3D编辑器扩展(六)——模态窗口
前面我们已经写了5篇关于编辑器的,这是第六篇,也是最后一篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)—— ...
- Unity3D编辑器扩展(四)——扩展自己的组件
前面已经写了三篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 今天写第四篇,扩展自己 ...
- unity3D编辑器扩展
编辑器扩展只是在编辑项目中运行,发布出来是不会运行的. 固定创建一个文件夹Editor:所有的资源或者代码都不会被打包进去. 01.使用MenuItem添加菜单栏按钮 脚本不需要作为组件存在,可以不用 ...
- Unity3d编辑器扩展学习笔记
编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...
- Unity3D编辑器扩展(一)——定义自己的菜单按钮
Unity3D 引擎的编辑器拥有很强的扩展性,用的好可以帮我们省很多事情.在这里记录下如何去扩展 Unity3D 的编辑器,定制属于我们自己的开发环境. 本篇主要讲解在 Unity3D 引擎的各个窗口 ...
- Unity3D编辑器扩展(三)——使用GUI绘制窗口
前两篇分别讲解了创建菜单https://www.cnblogs.com/xiaoyulong/p/10115053.html和创建窗口https://www.cnblogs.com/xiaoyulon ...
- Unity3D编辑器扩展(二)——定义自己的窗口
上一篇我们讲了如何定义菜单按钮 https://www.cnblogs.com/xiaoyulong/p/10115053.html 这一篇我们讲如何定义自己的窗口. 定义窗口我们需要继承 Edito ...
- [Unity3D]编辑器扩展之数组或List显示
效果如下: 源码如下: using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace XM.Edi ...
- Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口
Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...
随机推荐
- 从 TFS 迁移源代码到 git
准备工具: https://github.com/git-tfs/git-tfs 具体的安装步骤上面的 readme.md 中有说明.通过 Chocolatey 安装,如果本地没有 git ,会自动安 ...
- FreeMarker案例
- github 绑定域名
github的域名其实就两种,一种是个人主页,即所谓的每个账号只有一个的个人主页,XXXX.github.io,分支是master: 另一种是项目主页,可以有无数个,网上说分支应该是gh-pages, ...
- Loadrunner进行HTTPS协议性能测试
1.最简单办法就是在脚本前面加上:web_set_sockets_option("SSL_VERSION","TLS"),一般能解决HTTPS协议的请求问题,无 ...
- Excel VBA 连接各种数据库(二) VBA连接Oracle数据库
本文主要内容: Oracle环境配置 ODBC驱动设置.第三方驱动下载 VBA连接Oracle连接方法 Oracle10g官方免账号下载地址 系统环境: Windows 7 64bit Excel 2 ...
- Debian 8 安装Nginx最新版本
在Debian下如果直接apt-get install nginx直接装发现nginx版本是很旧的,本文主要讲一下如何在Debian 8上装新版的nginx. 原文资料:https://nginx.o ...
- Tensorflow学习笔记2019.01.03
tensorflow学习笔记: 3.2 Tensorflow中定义数据流图 张量知识矩阵的一个超集. 超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S ...
- vim高级工能入门
一.多文件编辑 1.vim 1.txt 2.txt 3.txt同时打开3个文件在vim缓冲区, 命令模式下输入:n 切换到下一个文件,可以加!:n! 强制切换,之前那个没有保存,仅仅是切换. ...
- background-attachment: fixed 在iphone设备失效的解决
下面为引用,源代码有点问题,自己修改了一下.先做记录,回头再细修. 引用部分,但代码有问题 http://www.ptbird.cn/css-background-attachment--fiexed ...
- Python学习笔记十_模块、第三方模块安装、模块导入
一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,packa ...