NRE的编程笔记

导航

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

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

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 = 5;
    [HideInInspector]
    public int attack = 1;
}

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

 

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

代码:

using UnityEngine;

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

效果图:

 

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

代码:

using UnityEngine;

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

效果图:

 

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

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

代码:

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour 
{
    [Tooltip("玩家生命值")]
    public int hp = 5;
    [HideInInspector]
    public int attack = 1;
    [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 = 5;
    [HideInInspector]
    public int attack = 1;
    [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(3)]
    public string nickName = "";
    [Tooltip("玩家生命值")]
    public int hp = 5;
    [HideInInspector]
    public int attack = 1;
    [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(3)]
    public string nickName = "";

    [Tooltip("玩家生命值")]
    public int hp = 5;

    [HideInInspector]
    public int attack = 1;

    [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(3)]
    public string nickName = "";

    [Tooltip("玩家生命值")]
    public int hp = 5;

    [HideInInspector]
    public int attack = 1;

    [Range(0f,10f)]
    public float speed = 5f;
    [Space(50)]
    public bool isMove = false;
}

效果图:

 

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

代码:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour 
{
    [Header("玩家昵称")]
    [Multiline(3)]
    public string nickName = "";

    [Tooltip("玩家生命值")]
    public int hp = 5;

    [HideInInspector]
    public int attack = 1;

    [Range(0f,10f)]
    public float speed = 5f;
    [Space(50)]
    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(3)]
    public string nickName = "";

    [Tooltip("玩家生命值")]
    public int hp = 5;

    [HideInInspector]
    public int attack = 1;

    [Range(0f,10f)]
    public float speed = 5f;
    [Space(50)]
    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:如果选择里包含文件夹,则也包括文件夹里的文件和子文件夹。

posted on 2018-12-25 15:21  NRE  阅读(1968)  评论(0编辑  收藏  举报