举两个例子,在变量上使用[SerializeFiled]属性,可以强制让变量进行序列化,可以在Unity的Editor上进行赋值。

在Class上使用[RequireComponent]属性,就会在Class的GameObject上自动追加所需的Component。

以下是Unity官网文档中找到的所有Attribute,下面将按照顺序,逐个对这些Attribute进行说明和小的测试。
部分例子使用了Unity官方的示例。

UnityEngine

AddComponentMenu

可以在UnityEditor的Component的Menu中增加自定义的项目。菜单可以设置多级,使用斜线/分隔即可。在Hierarchy中选中GameObject的时候,点击该菜单项,就可以在GameObject上追加该Component。
例如如下代码可以完成下图的效果。

[AddComponentMenu("TestMenu/TestComponet")]
public class TestMenu : MonoBehaviour {
}

AssemblyIsEditorAssembly

汇编级属性,使用该属性的Class会被认为是EditorClass。具体用法不明。

ContextMenu

可以在Inspector的ContextMenu中增加选项。
例如,如下代码的效果

public class TestMenu : MonoBehaviour {
[ContextMenu ("Do Something")]
void DoSomething () {
Debug.Log ("Perform operation");
}
}

ContextMenuItemAttribute

这个属性是Unity4.5之后提供的新功能,可以在Inspector上面对变量追加一个右键菜单,并执行指定的函数。
例子:

public class Sample : MonoBehaviour {
[ContextMenuItem("Reset", "ResetName")]
public string name = "Default";
void ResetName() {
name = "Default";
}
}

DisallowMultipleComponent

对一个MonoBehaviour的子类使用这个属性,那么在同一个GameObject上面,最多只能添加一个该Class的实例。
尝试添加多个的时候,会出现下面的提示。

ExecuteInEditMode

默认状态下,MonoBehavior中的Start,Update,OnGUI等方法,需要在Play的状态下才会被执行。
这个属性让Class在Editor模式(非Play模式)下也能执行。
但是与Play模式也有一些区别。
例如:
Update方法只在Scene编辑器中有物体产生变化时,才会被调用。
OnGUI方法只在GameView接收到事件时,才会被调用。

HeaderAttribute

这个属性可以在Inspector中变量的上面增加Header。
例子:

public class ExampleClass : MonoBehaviour {
[Header("生命值")]
public int CurrentHP = 0;
public int MaxHP = 100; [Header("魔法值")]
public int CurrentMP = 0;
public int MaxMP = 0;
}

HideInInspector

在变量上使用这个属性,可以让public的变量在Inspector上隐藏,也就是无法在Editor中进行编辑。

ImageEffectOpaque

在OnRenderImage上使用,可以让渲染顺序在非透明物体之后,透明物体之前。
例子

[ImageEffectOpaque]
void OnRenderImage (RenderTexture source, RenderTexture destination){
}
ImageEffectTransformsToLDR

渲染从从HDR变为LDR 具体使用方法不明。

MultilineAttribute

在string类型上使用,可以在Editor上输入多行文字。

public class TestString : MonoBehaviour {
[MultilineAttribute]
public string mText;
}

NotConvertedAttribute

在变量上使用,可以指定该变量在build的时候,不要转换为目标平台的类型。

NotFlashValidatedAttribute

在变量上使用,在Flash平台build的时候,对该变量不进行类型检查。
Unity5.0中已经移除了这个属性。

NotRenamedAttribute

禁止对变量和方法进行重命名。
Unity5.0中已经移除了这个属性。

PropertyAttribute
RangeAttribute

在int或者float类型上使用,限制输入值的范围

public class TestRange : MonoBehaviour
{
[Range(0, 100)] public int HP;
}
RequireComponent

在Class上使用,添加对另一个Component的依赖。
当该Class被添加到一个GameObject上的时候,如果这个GameObject不含有依赖的Component,会自动添加该Component。
且该Componet不可被移除。

例子

[RequireComponent(typeof(Rigidbody))]
public class TestRequireComponet : MonoBehaviour { }


如果尝试移除被依赖的Component,会有如下提示

RPC

在方法上添加该属性,可以网络通信中对该方法进行RPC调用。

[RPC]
void RemoteMethod(){
}
RuntimeInitializeOnLoadMethodAttribute

此属性仅在Unity5上可用。
在游戏启动时,会自动调用添加了该属性的方法。

class MyClass
{
[RuntimeInitializeOnLoadMethod]
static void OnRuntimeMethodLoad ()
{
Debug.Log("Game loaded and is running");
}
}
SelectionBaseAttribute

当一个GameObject含有使用了该属性的Component的时候,在SceneView中选择该GameObject,Hierarchy上面会自动选中该GameObject的Parent。

SerializeField

在变量上使用该属性,可以强制该变量进行序列化。即可以在Editor上对变量的值进行编辑,即使变量是private的也可以。
在UI开发中经常可见到对private的组件进行强制序列化的用法。
例子

public class TestSerializeField : MonoBehaviour {
[SerializeField]
private string name; [SerializeField]
private Button _button;
}

SharedBetweenAnimatorsAttribute

用于StateMachineBehaviour上,不同的Animator将共享这一个StateMachineBehaviour的实例,可以减少内存占用。

SpaceAttribute

使用该属性可以在Inspector上增加一些空位。 例子:

public class TestSpaceAttributeByLvmingbei : MonoBehaviour {
public int nospace1 = 0;
public int nospace2 = 0;
[Space(10)]
public int space = 0;
public int nospace3 = 0;
}

TextAreaAttribute

该属性可以把string在Inspector上的编辑区变成一个TextArea。
例子:

public class TestTextAreaAttributeByLvmingbei : MonoBehaviour {
[TextArea]
public string mText;
}

TooltipAttribute

这个属性可以为变量上生成一条tip,当鼠标指针移动到Inspector上时候显示。

public class TestTooltipAttributeByLvmingbei : MonoBehaviour {
[Tooltip("This year is 2015!")]
public int year = 0;
}

UnityAPICompatibilityVersionAttribute

用来声明API的版本兼容性

UnityEngine.Serialization

FormerlySerializedAsAttribute

该属性可以令变量以另外的名称进行序列化,并且在变量自身修改名称的时候,不会丢失之前的序列化的值。
例子:

using UnityEngine;
using UnityEngine.Serialization;
public class MyClass : MonoBehaviour {
[FormerlySerializedAs("myValue")]
private string m_MyValue;
public string myValue
{
get { return m_MyValue; }
set { m_MyValue = value; }
}
}

UnityEngine.Editor

该package为Editor开发专用

CallbackOrderAttribute

定义Callback的顺序

CanEditMultipleObjects

Editor同时编辑多个Component的功能

CustomEditor

声明一个Class为自定义Editor的Class

CustomPreviewAttribute

将一个class标记为指定类型的自定义预览
Unity4.5以后提供的新功能
例子:

[CustomPreview(typeof(GameObject))]
public class MyPreview : ObjectPreview
{
public override bool HasPreviewGUI()
{
return true;
} public override void OnPreviewGUI(Rect r, GUIStyle background)
{
GUI.Label(r, target.name + " is being previewed");
}
}
CustomPropertyDrawer

标记自定义PropertyDrawer时候使用。
当自己创建一个PropertyDrawer或者DecoratorDrawer的时候,使用该属性来标记。 TODO: 如何创建属于自己的Attribute

DrawGizmo

可以在Scene视图中显示自定义的Gizmo
下面的例子,是在Scene视图中,当挂有MyScript的GameObject被选中,且距离相机距离超过10的时候,便显示自定义的Gizmo。
Gizmo的图片需要放入Assets/Gizmo目录中。
例子:

using UnityEngine;
using UnityEditor; public class MyScript : MonoBehaviour { } public class MyScriptGizmoDrawer { [DrawGizmo (GizmoType.Selected | GizmoType.Active)]
static void DrawGizmoForMyScript (MyScript scr, GizmoType gizmoType) {
Vector3 position = scr.transform.position; if(Vector3.Distance(position, Camera.current.transform.position) > 10f)
Gizmos.DrawIcon (position, "300px-Gizmo.png");
} }

InitializeOnLoadAttribute

在Class上使用,可以在Unity启动的时候,运行Editor脚本。
需要该Class拥有静态的构造函数。
做一个创建一个空的gameobject的例子。
例子:

using UnityEditor;
using UnityEngine; [InitializeOnLoad]
class MyClass
{
static MyClass ()
{
EditorApplication.update += Update;
Debug.Log("Up and running");
} static void Update ()
{
Debug.Log("Updating");
}
}
InitializeOnLoadMethodAttribute

在Method上使用,是InitializeOnLoad的Method版本。
Method必须是static的。

MenuItem

在方法上使用,可以在Editor中创建一个菜单项,点击后执行该方法,可以利用该属性做很多扩展功能。 需要方法为static。
例子:

using UnityEngine;
using UnityEditor;
using System.Collections; public class TestMenuItem : MonoBehaviour { [MenuItem ("MyMenu/Create GameObject")]
public static void CreateGameObject() {
new GameObject("lvmingbei's GameObject");
}
}

PreferenceItem

使用该属性可以定制Unity的Preference界面。
在这里就使用官方的例子:

using UnityEngine;
using UnityEditor;
using System.Collections; public class OurPreferences {
// Have we loaded the prefs yet
private static bool prefsLoaded = false; // The Preferences
public static bool boolPreference = false; // Add preferences section named "My Preferences" to the Preferences Window
[PreferenceItem ("My Preferences")]
public static void PreferencesGUI () {
// Load the preferences
if (!prefsLoaded) {
boolPreference = EditorPrefs.GetBool ("BoolPreferenceKey", false);
prefsLoaded = true;
} // Preferences GUI
boolPreference = EditorGUILayout.Toggle ("Bool Preference", boolPreference); // Save the preferences
if (GUI.changed)
EditorPrefs.SetBool ("BoolPreferenceKey", boolPreference);
}
}

UnityEditor.Callbacks

这个package中是三个Callback的属性,都需要方法为static的。

OnOpenAssetAttribute

在打开一个Asset后被调用。
例子:

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks; public class MyAssetHandler { [OnOpenAssetAttribute(1)]
public static bool step1(int instanceID, int line) {
string name = EditorUtility.InstanceIDToObject(instanceID).name;
Debug.Log("Open Asset step: 1 ("+name+")");
return false; // we did not handle the open
} // step2 has an attribute with index 2, so will be called after step1
[OnOpenAssetAttribute(2)]
public static bool step2(int instanceID, int line) {
Debug.Log("Open Asset step: 2 ("+instanceID+")");
return false; // we did not handle the open
}
}
PostProcessBuildAttribute

该属性是在build完成后,被调用的callback。
同时具有多个的时候,可以指定先后顺序。
例子:

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks; public class MyBuildPostprocessor {
[PostProcessBuildAttribute(1)]
public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
Debug.Log( pathToBuiltProject );
}
}
PostProcessSceneAttribute

使用该属性的函数,在scene被build之前,会被调用。
具体使用方法和PostProcessBuildAttribute类似。

转自 http://blog.csdn.net/spring_shower/article/details/48708337

最新文章

  1. Xcode7.1环境下上架iOS App到AppStore 流程① (Part 一)
  2. Git Pull 错误
  3. C#读取Excel文件
  4. python 进程间共享数据 (一)
  5. Instant Python 中文缩减版
  6. JavaBean转换为XML的源码
  7. asp登陆例子,asp,mssql,登陆
  8. Oracle sysdate
  9. JsonPath详解
  10. 批处理 Mysql Findstr
  11. windows下安装ruby和 rails的痛苦经历
  12. Docker快速指南
  13. 实用的Docker入门
  14. PCB名詞解釋:通孔、盲孔、埋孔(转载)
  15. 《DSP using MATLAB》Problem 7.27
  16. s2第六章继承和多态
  17. 基于开源SuperSocket实现客户端和服务端通信项目实战
  18. Spring Cloud开发实践 - 03 - 接口实现和下游调用
  19. Day 43数据库(Day1)
  20. Flutter 中 ListView 的使用

热门文章

  1. create-react-app设置proxy反向代理不起作用
  2. kali linux之主动信息收集(三层发现,四层发现)
  3. birth
  4. P2925 [USACO08DEC]干草出售Hay For Sale 题解
  5. express + vue 项目搭建
  6. 蓝牙4.0BLE抓包(二) – 广播包解析
  7. 主机和虚拟机互Ping的问题
  8. 首字母变大写(stringstream的应用)
  9. js中的slice和splic
  10. Vuex 使用了 module 后的访问方法 ..