zoukankan      html  css  js  c++  java
  • 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:如果选择里包含文件夹,则也包括文件夹里的文件和子文件夹。

  • 相关阅读:
    Discuz!NT代码阅读笔记(4)一切皆可配置:页面的显示
    WAP网站开发

    Discuz!NT代码阅读笔记(2)网站安装自动化论坛程序安装及初始化过程
    Discuz!NT代码阅读笔记(1)从HttpModule开始
    c#使用Transactions类完成多个数据库的事务操作(分布式事务处理)
    自我介绍 简历
    Discuz!NT 系统架构分析
    缓存应用Memcached分布式缓存简介(二)
    数组类型EDT的元素个数
  • 原文地址:https://www.cnblogs.com/xiaoyulong/p/10174161.html
Copyright © 2011-2022 走看看