Unity c#中Attribute用法详解

举两个例子,在变量上使用[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 {
}

f:id:lvmingbei:20150406160818p:plain

AssemblyIsEditorAssembly

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

ContextMenu

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

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

f:id:lvmingbei:20150406162538p:plain

ContextMenuItemAttribute

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

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

f:id:lvmingbei:20150406164234g:plain

DisallowMultipleComponent

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

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;
}

f:id:lvmingbei:20150406171544p:plain

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;
}

f:id:lvmingbei:20150406183813p:plain

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 {}

f:id:lvmingbei:20150406191049g:plain
如果尝试移除被依赖的Component,会有如下提示
f:id:lvmingbei:20150406191137p:plain

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;
}

f:id:lvmingbei:20150406194030p:plain

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;
}

f:id:lvmingbei:20150407121446p:plain

TextAreaAttribute

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

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

f:id:lvmingbei:20150407121811p:plain

TooltipAttribute

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

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

f:id:lvmingbei:20150407122412p:plain

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");}}

f:id:lvmingbei:20150410162651p:plain

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");}
}

f:id:lvmingbei:20150412204353g:plain

PreferenceItem

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

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

f:id:lvmingbei:20150412210832p:plain

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://www.mzph.cn/news/246223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

走进LWRP(Universal RP)的世界

走进LWRP(Universal RP)的世界 原文:https://connect.unity.com/p/zou-jin-lwrp-universal-rp-de-shi-jie LWRP自Unity2018发布以来,进入大家视野已经有一段时间了,不过对于广大Unity开发者来说,依然相对…

Unity 2017 Game Optimization 读书笔记(1)Scripting Strategies Part 1

1.Obtain Components using the fastest method Unity有多种Getcomponet的方法&#xff1a; GetComponent(string), GetComponent<T>() GetComponent(typeof(T)) 哪种效率最高会跟随Unity版本的变化而变化&#xff0c;对于Unity 2017&#xff0c;本书作者的测试是Ge…

C# 多态相关的文章

一 C# 多态的实现 封装、继承、多态&#xff0c;面向对象的三大特性&#xff0c;前两项理解相对容易&#xff0c;但要理解多态&#xff0c;特别是深入的了解&#xff0c;对于初学者而言可能就会有一定困难了。我一直认为学习OO的最好方法就是结合实践&#xff0c;封装、继承在…

C++ 虚函数和虚表

几篇写的不错的文章&#xff0c;本文是整合了这几篇文章&#xff0c;感谢这些大佬 https://www.jianshu.com/p/00dc0d939119 https://www.cnblogs.com/hushpa/p/5707475.html https://www.jianshu.com/p/91227e99dfd7 多态: 多态是面相对象语言一个重要的特性,多态即让同一…

Unity 2017 Game Optimization 读书笔记(2)Scripting Strategies Part 2

1. Share calculation output 和上一个Tip很像&#xff0c;可以缓存计算结果或者各种信息&#xff0c;避免多次重复的计算&#xff0c;例如在场景里查找一个物体&#xff0c;从文件读取数据&#xff0c;解析Json等等。 容易忽略的点是常常在基类了实现了某个方法&#xff0c;在…

Unity 2017 Game Optimization 读书笔记(3)Scripting Strategies Part 3

1.Avoid retrieving string properties from GameObjects 通常来讲&#xff0c;从C#的object中获取string 属性没有额外的内存开销&#xff0c;但是从Unity中的Gameobject获取string属性不一样&#xff0c;这会产生上一篇讲到的 Native-Managed Bridge&#xff08;Native内存和…

Unity 2017 Game Optimization 读书笔记(4)Scripting Strategies Part 4

1.Avoid Find() and SendMessage() at runtime SendMessage() 方法和 GameObject.Find() 相关的一系列方法都是开销非常大的。SendMessage()函数调用的耗时大约是一个普通函数调用的2000倍&#xff0c;GameObject.Find() 则和场景的复杂度相关&#xff0c;场景越复杂&#xff0…

Unity HDRP中的光照烘焙测试(Mixed Lighing )和间接光

部分内容摘抄自&#xff1a;https://www.cnblogs.com/murongxiaopifu/p/8553367.html 直接光和间接光 大家都知道在Unity中&#xff0c;我们可以在场景中布置方向光、点光、聚光等类型的光源。但如果只有这些光&#xff0c;则场景内只会受到直接光的影响&#xff0c;而所谓的…

聊聊Unity项目管理的那些事:Git-flow和Unity

感谢原作者https://www.cnblogs.com/murongxiaopifu/p/6086849.html 0x00 前言 目前所在的团队实行敏捷开发已经有了一段时间了。敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理。项目从最初使用svn到之后的Git One Track策略再到现在的GitFlow策略&#xff0c;中…

聊聊网络游戏同步那点事

写的非常好的一篇博文&#xff0c;转载自https://www.cnblogs.com/murongxiaopifu/p/6376234.html 0x00 前言 16年年底的时候我从当时的公司离职&#xff0c;来到了目前任职的一家更专注于游戏开发的公司。接手的是一个platform游戏项目&#xff0c;基本情况是之前的团队完成…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(1)

The Rendering Pipeline 渲染表现差有可能取决于CPU端&#xff08;CPU Bound&#xff09;也有可能取决于GPU(GPU Bound).调查CPU-bound的问题相对简单&#xff0c;因为CPU端的工作就是从硬盘或者内存中加载数据并且调用图形APU指令。想找到GPU-bound的原因会困难很多&#xff…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(2)

Lighting and Shadowing 现代的游戏中&#xff0c;基本没有物体能在一步就完成渲染&#xff0c;这是因为有光照和阴影的关系。光照和阴影的渲染在Fragment Shader中需要额外的pass。 首先要设置场景中的Shadow Casters和Shadow Receivers&#xff0c;Shadow Casters投射阴影&…

Unity 2017 Game Optimization 读书笔记 The Benefits of Batching

batching&#xff08;合批&#xff09; 和大量的描述一个3D物体的数据有关系&#xff0c;比如meshes&#xff0c;verices&#xff0c;edges&#xff0c;UV coordinates 以及其他不同类型的数据。在Unity中谈论batching&#xff0c;指的是用于合批mesh数据的两个东西&#xff1a…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (3)

Rendering performance enhancements Enable/Disable GPU Skinning 开启GPU Skinning可以减轻CPU或GPU中Front End部分中某一个的负担&#xff0c;但是会加重另一个的负担。Skinning是mesh中的顶点根据动画中骨骼的当前位置进行计算&#xff0c;从而让角色摆出正确的姿势。 …

Unity手游开发札记——布料系统原理浅析和在Unity手游中的应用

原文&#xff1a;https://zhuanlan.zhihu.com/p/28644618 0. 前言 项目技术测试结束之后&#xff0c;各种美术效果提升的需求逐渐成为后续开发的重点&#xff0c;角色效果部分的提升目标之一便是在角色选择/展示界面为玩家提供更高的品质感&#xff0c;于是可以提供动态效果的…

行为树(Behavior Tree)实践(1)– 基本概念

原文&#xff1a;http://www.aisharing.com/archives/90 行为树&#xff08;Behavior Tree&#xff09;实践&#xff08;1&#xff09;– 基本概念 自从开博以来&#xff0c;每天都会关心一下博客的访问情况&#xff0c;看到一些朋友的订阅或者访问&#xff0c;不胜欣喜&…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化

Shader optimization Fill Rate和 Memory Bandwidth开销最大的地方就是Fragment Shader。开销多大取决于Fragment Shader的复杂程度&#xff1a;多少纹理需要采样&#xff0c;多少数学计算函数需要使用等等。GPU的并行特性意味着在线程中如果任何地方存在瓶颈&#xff0c;都会…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (6)

1. Use less texture data 这条优化技巧非常直接&#xff0c;减少texture的数据量&#xff0c;减少分辨率或者降低位数&#xff0c;虽然可能会降低渲染质量。但是通常使用16-bit textures并不会明显的感觉到渲染效果下降。 MipMap技术可以有效减少VRAM和Texture Cache之间来回…

LeetCode 面试题57 - II(剑指offer) 和为s的连续正数序列

今天毕业五年了&#xff0c;一直忙于工作和享受&#xff0c;自从当年找完工作后就一直没有再刷过题&#xff0c;作为搬砖的码农&#xff0c;觉得还是应该养成长期刷题的习惯坚持下去。之前坚持了每天被一会单词&#xff0c;如今雅思一本也快看完了&#xff0c;从今天开始准备在…

反走样技术相关文章

https://zhuanlan.zhihu.com/p/28800047 https://zhuanlan.zhihu.com/p/57503957 https://zhuanlan.zhihu.com/p/33444125 https://zhuanlan.zhihu.com/p/33444429 走样的原因及其分类 说到走样&#xff0c;首先要说的就是采样。这也算是很多图形学专著中提到反走样相关技…