Unity常用特性Attribute介绍使用(不定期更新)

前言:
在使用Unity3D的过程中,会经常用到许多的特性Attribute,我基本上把官方文档里列出的都记录下来,不定期更新

一、HelpURLAttribute
从字面意思理解,是查看帮助时,跳转到指定的页面。

如下图:


image.png

对应着蓝色小书的图标,点击以后会跳转到配置的URL。

二、RangeAttribute:限定int或float的取值范围。

Attribute used to make a float or int variable in a script be restricted to a specific range.
When this attribute is used, the float or int will be shown as a slider in the Inspector instead of the default number field.

当在int或float上应用RangeAttribute特性时,在Inspector面板中,显示的将是一个slider滑动条,而不是默认的数值字段。

[Range(0.1f,0.9f)]
float ratio;

三、RequireComponentAttribute

自动添加所要依赖的组件,如将一个Script做为一个GameObject的组件,而这个Script需要访问Rigidbody组件,
通过应用该属性,可以自动的添加Rigidbody组件到当前的GameObject中,避免设置错误。

*前提是:如果当前的Script已经添加到了GameObject,这时候你再应用RequireComponent特性是无效的,
你必须删除 再重新添加,才会检测。

using UnityEngine;

// PlayerScript requires the GameObject to have a Rigidbody component
[RequireComponent(typeof(Rigidbody))]
public class PlayerScript : MonoBehaviour
{
    Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        rb.AddForce(Vector3.up);
    }
}

四、TooltipAttribute
在Inspector面板中,为一个字段Field指定一个提示。

image.png
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    [Tooltip("Health value between 0 and 100.")]
    public int health = 0;
}

五、HideInInspectorAttribute

让一个可被序列化的字段,不要显示在Inspector面板中,防止修改。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    [HideInInspector]
    public int p = 5;
}

六、ExecuteInEditMode
让MonoBehaviour脚本的所有实例,在编辑模式下可运行。
这些函数的调用并不会像在PlayMode下那样:

The functions are not called constantly like they are in play mode.

  • Update is only called when something in the scene changed.
  • OnGUI is called when the Game View recieves an Event.
  • OnRenderObject and the other rendering callback functions are called on every repaint of the Scene View or Game View.

只有窗口在发生改变 ,接触新的事件,重绘后才会调用。

*默认MonoBehaviour的脚本只能在运行模式下执行。

using UnityEngine;

[ExecuteInEditMode]
public class PrintAwake : MonoBehaviour
{
    void Awake()
    {
        Debug.Log("Editor causes this Awake");
    }

    void Update()
    {
        Debug.Log("Editor causes this Update");
    }
}

七、DisallowMultipleComponent

禁止一个组件被重复的添加多次。

*如果当前GameObject已经存在了多个相同的组件,是不会有影响的,但应用了特性以后,就无法再次添加。

[DisallowMultipleComponent]
public class testEdit : MonoBehaviour {...}

八、DelayedAttribute

在运行时,我们修改Inspector面板中的字段,会即时返回新的值,应用Delayed特性,只有在用户按下回车Enter或是
焦点离开时才会返回新值,通过用于调试阶段。

*只能应用于字段,不可在类或其它目标元素上使用。

九、SpaceAttribute
间隔距离,在Inspector中,可以设置元素与元素之间的间隔。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class testEdit : MonoBehaviour {
    public int a = 10;
    [Space(50)]
    public int b = 11;
}
image.png

十、TextAreaAttribute
可以在一个高自由度并且可滚动的文本区域里编辑string字符串,如果字符串比较长,比较适用。

参数:
minLines:文本区域最小行数
maxLines:文本区域最大行数,超过最大行数,会出现滚动条。

[TextArea(1,5)]
public string abc;

十一、MultilineAttribute
在一个支持多行的文本区域内编辑string字符串,他和TextAreaAttribute不同,MultilineAttribute的TextArea没有滚动条。

[Multiline(1,5)]
public string abc;

十二、ContextMenu
向Inspector面板中脚本Script的上下文菜单(快捷,右键),添加一条指令,当选择该命令时,函数会执行。
*只能用于非静态函数

public class ContextTesting : MonoBehaviour {
    /// Add a context menu named "Do Something" in the inspector
    /// of the attached script.
    [ContextMenu ("Do Something")]
    void DoSomething () {
        Debug.Log ("Perform operation");
    }
}
image.png

预定义的一些方法,如Reset,是可以进行重载的。

十三、ContextMenuItemAttribute
在Inspector面板中,为字段field添加一个快捷的菜单。

[Multiline][ContextMenuItem("Reset", "ResetString")]
    public string abc;
    public void ResetString()
    {
        abc = "";
    }
image.png

十四、CreateAssetMenuAttribute

快速的创建ScriptableObject派生类的实例,并存储成以“.asset"结尾的文件,ScriptableObject的派生类可以存储为外部的文件,图形化编辑对象数据,一些静态的数据,动态的加载,ScriptableObject是一种解决方案,具体见另一篇文章的说明:
https://www.jianshu.com/p/da578e55ca47

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "xxxx",menuName = "xxx/xxx")]
public class testEdit : ScriptableObject {
    public int a = 10;
    public int b = 11;
    public int c = 12;
    [Multiline][ContextMenuItem("Reset", "ResetString")]
    public string abc;

}

说明:
fileName:生成asset文件的文件名。
menuName:在Assets/Create上子菜单的名字。

十五、ColorUsageAttribute

颜色选择器,color picker,只能应用在Color字段上。
默认参数为是否显示alpha,具体使用看下官方文档的参数描述,这里不加代码了

image.png

十六、AddComponentMenu
把添加Script的操作放在Component菜单下,来替代Component/Scripts,因为里面的脚本可能非常多,基本上没有实用价值
AddComponentMenu的方便之处在于如果你当前场景内,有多个GameObjects需要添加同一个脚本,那么使用同时选中
这些地象,并打开Component菜单选中要添加的脚本就可以一次性添加了。

[AddComponentMenu("Example/testEdits")]
public class testEdit : MonoBehaviour {

十七、AssemblyIsEditorAssembly

添加该特性的任意类,都会被视为Editor编辑器类。只有用于Editor模式下。

十八、PreferBinarySerialization
只能用在ScriptableObject的派生类上(使用在其它类型上面会被忽略),修改序列化的模式为二进制,而不是YAML, 当你的资源比较大的时候,保存成二进制,生成的数据会更加的紧凑,从而提高程序的读写性能。

[CreateAssetMenu]
[PreferBinarySerialization]
public class testEdit : ScriptableObject {
    
    public Color a;
    public int b = 11;
    public int c = 12;  
    [Multiline][ContextMenuItem("Reset", "ResetString")]
    public string abc;

}

用记事本打开生成后的asset,会发现都是二进制的数据。

十九、RuntimeInitializeOnLoadMethodAttribute
在运行时,当前类初始化完成,自动调用被该特性应用的静态函数,这和static静态构造函数还不一样,static静态构造函数是在所有的方法之前运行的,而RuntimeInitializeOnLoadMethod特性的方法是Awake方法之后执行的(如果是MonoBehaviour派生类)。

如果一个类中有多个静态方法使用了RuntimeInitializeOnLoadMethod特性,执行顺序是不固定的。

[RuntimeInitializeOnLoadMethod]
    static void OnRuntimeMethodLoad()
    {
        Debug.Log("After scene is loaded and game is running");
    }

    [RuntimeInitializeOnLoadMethod]
    static void OnSecondRuntimeMethodLoad()
    {
        Debug.Log("SecondMethod After scene is loaded and game is running.");
    }

二十、SelectionBaseAttribute
设置基础选中对象,应用该标识一个对象为选中对象,当我们在scene view中选择一个objects的时候,u3d会返回给我们是适合的对象,比如你选中的对象是prefab的一部分,默认会返回节点的根对象,默认根对象被设置成了基础选中对象,你可以修改他,让其它的对象成为基础选中对象,比如根对象可能就是一个空的GameObject,而我们要实际查看编辑的对象是子节点,这样我们可以将子节点中添加的脚本应用SelectionBase特性。

image.png
image.png

我将脚本加到Camera_Offset后,成为了默认的选中对象,这样每次我在场景中选中时,Camera_Offset会被选择,并高亮显示。

二十一、SerializeField
强制去序列化一个私有的字段field.默认情况下,当u3d在序列化脚本的时候,只会序列化public的字段,这是u3d内部的实现的序列化,并不是 .NET's serialization的实现。
另一点,私有字段,你不希望派生类访问,但你希望在Inspector中可以进行配置,也可以应用SerializeField来解决。

using UnityEngine;

public class SomePerson : MonoBehaviour
{
    //This field gets serialized because it is public.
    public string name = "John";

    //This field does not get serialized because it is private.
    private int age = 40;

    //This field gets serialized even though it is private
    //because it has the SerializeField attribute applied.
    [SerializeField]
    private bool hasHealthPotion = true;

    void Update()
    {
    }
}

二十二、SharedBetweenAnimatorsAttribute
状态机组件,没有在项目中使用过,mark下,在简书里新建一篇叫StateMachineBehaviour的文章,实际测试案例后,回来补充。

二十三、HeaderAttribute
在Inspector面板中,为field字段添加头信息,增强描述。
The header is done using a DecoratorDrawer.

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    [Header("Health Settings")]
    public int health = 0;
    public int maxHealth = 100;
    [Header("Shield Settings")]
    public int shield = 0;
    public int maxShield = 0;
}

二十四、 GUITargetAttribute
设置OnGUI方法在哪一个Display下显示,默认是所有的Display均显示.

[GUITarget(0,1,new int[]{2,3,4})]
    void OnGUI()
    {
        if (GUI.Button (new Rect (0, 0, 128, 128), "Test")) {
            Debug.Log ("blahblahblah....");
        }
    }
image.png

说明:
提供了如下参数:
displayIndex Display index.display 索引
displayIndex1 Display index. display索引
displayIndexList Display index list.display索引列表


二十五、未完待续

到此为止,如果大家发现有什么不对的地方,欢迎指正,共同提高,感谢您的阅读!

编辑于2018.7.16

现在是凌晨2:08,刚结束和喜欢的人聊天,我此刻的感受并不好,她的一句my friend,感觉距离拉到了银河系,这种愤怒辐射到让我讨厌我生活的很多方面,我希望这种愤怒能最终给我带来正面的力量!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • 一、Unity简介 1. Unity界面 Shift + Space : 放大界面 Scene界面按钮渲染模式2D...
    MYves阅读 8,055评论 0 22
  • AddComponentMenu AddComponentMenu属性允许您将脚本放置在“组件”菜单中的任何位置,...
    su9257_海澜阅读 4,989评论 0 14
  • 7.8.5 PHP面象对象的特性多态 对象的多态性是指在父类中定义的属性或行为被子类继承之后,可以具有不同的数据类...
    曹渊说创业阅读 286评论 0 0
  • 今日数学~3小时33分钟 专业课~5小时 英语~0 政治~0 共~8小时33分钟 一天又一天。 越来越觉得,可能这...
    童雪阅读 128评论 0 0
  • 葛悦阅读 169评论 0 0