Unity的Attribute(特性)还算多吧

  

属性 (Attribute)

使用 Unity 的C#语言 ,利用属性(Attribute)来类定义和变量定义或区分其他的变量,您可以设置一种特殊行为。* 1

例如,您添加[SerializeField]属性变量,私有变量标识序列化。

 [SerializeField]

 int  计数;

序列化您'的值是存储到场景和预制体。因为值存储在meta元数据中,在Inspector检查器中设置的值。

 

你还可以强制指定的组件,对象要被附加组件,您将添加[RequireComponent] * 2 * 3 。

[RequireComponent(typeof(Rigidbody))]

public classAttributeSample : MonoBehaviour {

}

你可以使用属性时,设置特殊的变量命名约定以外的其他行为。unity使用属性,设置特约编辑和方法的行为。

 

规则属性

属性放置在[below. * * *]的窗体变量和类定义之前。如果你想要设置多个属性,以逗号分隔 [* * * .  * * *]的写入操作。

例如,如果您想要设置的 SerializeField 和范围,如描述属性。

  [SerializeField, Range(0, 5)]

    int count;

属性适用于立即定义的所有变量。例如,如果在一个声明中定义多个变量

[SerializeField, Range(0,5)]

    int count3, count4;

以及适合数组,是适用于所有的变量,使其包含。

[SerializeField, Range(0,5)]

    int[] counts;

统一标准属性

要扩展Inspector检查器属性

扩展的Inspector检查器行为选择字段。

SerializeField

private或protected值的序列化。

如果您想要在场景视图中进行编辑,它非常有用。

[SerializeField]

int count;

 

TooltipAttribute

如果鼠标光标是在字段上,显示的说明文本。   

[SerializeField,TooltipAttribute("説明文")]

int count5;

 

SpaceAttribute

设置字段和字段之间的空间。

[SerializeField,Space(15)]

intcount6;          

 

HeaderAttribute

设置标题,就是字段的头部。需要注意,因为标题给予所有项目和将 HeaderAttribute 添加到列表中

[SerializeField,HeaderAttribute ("Title")]

int count7;

f:id:tsubaki_t1:20150103171504p:plain

 

MultilineAttribute

设置多行输入的文本字段。

[SerializeField, MultilineAttribute(2)]

string message1;

 

TextAreaAttribute

设置多行输入的文本字段。您可以设置的最大值和最小值的行数。

[SerializeField,TextAreaAttribute(2, 5)]

 string message2;

 

HideInInspector

这种public序列化字段从Inspector检查器隐藏。如果隐藏的参数、扩展的编辑器中内置的参数和引用关系。

请注意不能从检查器编辑,HideInInspector 用于构建unity场景隐藏一个序列化的值,当声明一个字段变量初始化也将忽略。

使用NonSerializable的序列化和HideInInspector。

[HideInInspector]

    public int count8;

NonSerializable

序列化并不妨碍您将从检查器中消失。  

  [System.NonSerialized]

public int count9;

 

FormerlySerializedAs

当您更改该变量的名称,保持信息的修改。

unity保持信息字段字段名称中,字段名称被更改和销毁值。当您可以指定FormerlySerializedAs此信息将被带到目标变量的名称。

public float first;

f:id:tsubaki_t1:20150103191655p:plain

首先,所有的变量first。我试着改变这第二个变量中。并添加 FormerlySerializedAs 属性,原" first "。

[FormerlySerializedAs("first")]

 public float second;

f:id:tsubaki_t1:20150103191702p:plain

          即使您更改中的变量名称的值first在此变量的名称second之后,将保留。如果你在其他场景中使用可迁移要删除 FormerlySerializedAs 和各种的麻烦,请注意。

 

与组件的行为相关联的属性

RequireComponentAttribute

添加组件的行为附加到对象。例如,刚体等......

[RequireComponent(typeof(Rigidbody))]

public classAttributeSample : MonoBehaviour {

}

 

DisallowMultipleComponent

不能将几个组件添加到同一个对象(就是不能重复)。

[DisallowMultipleComponent]

public classAttributeSample : MonoBehaviour {

}

f:id:tsubaki_t1:20150103203508p:plain

 

ContextMenuAttribute

我想要从组件的上下文菜单(单击右键)调用方法。例如,如果您在运行时做不被动设置很有用。

[ContextMenu("Init")]

void Init(){

}

f:id:tsubaki_t1:20150103182902p:plain

 

影响游戏的行为的属性

RPC

在执行 RPC 时,它使用。用于在 NetworkView 中的光子与沟通。此属性是跨网络调用方法。

[RPC]

void Damage(){

}

 

ImageEffectTransformsToLDR

似乎转换HDR和 LDR 。如何使用未知。

ImageEffectOpaque

使 OnRenderImage 透明呈现。

[ImageEffectOpaque]

void OnRenderImage(RenderTexture source, RenderTexture destination){

}

 

MonoPInvokeCallbackAttribute

C#(托管代码) 中注册方法可以从c + +(非托管代码) 调用。

 

DLLImport

C + +(非托管代码) 的方法可从c#调用。

[DllImport("DLLName")]

 private static extern void MethodName();

 

用编辑器的行为相关联的属性

是可以影响的场景从编辑器的顶部的属性。

AddComponentMenu

设置路径,当指定 AddComponent 按钮和菜单栏构件。如果你不做你的Script /Namespace 和组件的名称。

[AddComponentMenu("Sample/TestCode")]

public class AttributeSample: MonoBehaviour{

}

f:id:tsubaki_t1:20150103174334p:plain

 

ExecuteInEditMode

状态不玩游戏等组件事件更新并开始工作。用来验证是否要工作在运行时的行为。

[ExecuteInEditMode]

public classAttributeSample : MonoBehaviour {}

ExecuteInEditMode操作热点像代码更改为序列化的形式可以是值是序列化→→汇编和注射,不能破坏价值和可能。正因为如此,注意力是需要,因为需要发挥出来的场景将取决于静态代码或初始化开始等......

例如是前 3 名,代码更改和运行编译下面的代码的代码更改,并打印 0。

static int sCount = 0;

void Start(){

 sCount = 3;

}

void Update(){

   Debug.Log("export:" + sCount);

}

f:id:tsubaki_t1:20150103184915p:plain

SelectionBaseAttribute

选择您选择在场景视图中使用此属性的组件。

[SelectionBase]

public class AttributeSample :MonoBehaviour {}

例如授予的授予对父对象的渲染器模型的SelectionBaseAttribute 选定在场景视图的模型时,选择场景视图组件所选的父对象上,当你选择时。

f:id:tsubaki_t1:20150103185829g:plain

f:id:tsubaki_t1:20150103185848g:plain

是到游戏对象的 SelectionBase对象,如果不是根据行为给予的批。格兰特获取未授予一个球体,但游戏物体的对象。

 

 

Unity会自动为Public变量做序列化,序列化的意思是说再次读取Unity时序列化的变量是有值的,不需要你再次去赋值,因为它已经被保存下来。

        什么样的值会被显示在面板上?已经被序列化,但是没有用HideInInspector标记的值。

        [HideInInspector]表示将原本显示在面板上的序列化值隐藏起来。

        [SerializeField]表示将原本不会被序列化的私有变量和保护变量可以序列化,这么他们在下次读取时,就是你上次赋值的值。

         1如果a是公有的序列化变量。

               1.1如果你想要在面板中看到a,那么用:

                    public int a;1.2如果你不想在面板中看到a,那么用:

                    [HideInInspector]

                    public int a;   // 这样a可以在程序中被代码赋值,但不会在面板中看到并手动设置赋值。

          2 如果a是私有的序列化变量,你想在面板中读取并保存,那么用:

                [SerializeField]

                private int a;

          3.如果a是私有的序列化变量,你想在面板中读取,但是不保存,那么用:

               [HideInInspector]

               [SerializedField]

               private int a;

               public int b  { get{ return a; } }

               然后在Editor中显示,EditorGUILayout.LabelField("value",game.B.ToString());

          4如果a是私有序列化变量,你不想在面板中做任何操作(不想看到,也不想写),但是想要在程序中给它赋值,那么用。

               [HideInInspector]

               [SerializedField]

               private int a;

               public int b{ get { return a; }  set { a = value; } }

posted @ 2015-03-16 12:22  zhepama  阅读(1478)  评论(0编辑  收藏  举报