Unity中的[xxx] 特性

C# 特性(Attribute)

在C#中,[] 符号在字段、属性、方法、类、接口等上面通常用于定义特性(Attributes)。特性是一种特殊的类型,它提供元数据(metadata)给代码,这些元数据可以在运行时被反射(Reflection)API查询。(个人感觉类似于java的注解)

标记属性

[Spcae]与上方的间隔,可以传一个浮点数默认值是8f
[Header("提示信息")]在当前字段的上方加一段文字描述
[Tooltip("提示信息")]鼠标悬停在当前字段时,会显示提示信息
[Range(min, max)]限制数值类型变量的取值范围并以滑动条显示
[Min(min)]限制一个数值类型的变量的最小值
[SerializeField]强制序列化一个私有的变量,使其可以在Inspector面板显示
[NonSerialized]在Inspector版面中隐藏public属性,不执行序列化
[HideInInspector]使属性在Inspector中隐藏,但是还是可序列化
[System.Serializable]使自定义的类能进行序列化,即当做一个public成员的时候可以在Inspector显示
[InspectorName(“枚举A”)]标记枚举类型的枚举值,可以使枚举值在Inspector上显示的名字改变
[ContextMenuItem(“显示的方法名”,“方法”)]标记字段,在Inspector面板上给字段右键段添加一个菜单,不能是静态函数
[Multiline]添加在string类型的变量上,可以在Inspector面板上显示一个多行文本框
[TextArea]该属性可以把string在Inspector面板上变为一个带有滚动条的文本域
[GradientUsage]给一个 Gradient 类型的变量添加这个属性用来设置是否为 HDR 渐变模式
[Delayed]标记int/float/string类型的变量,在Inspector面板修改变量值时,只有按下Enter键 或 鼠标失去焦点后值才会改变

 

 

标记类/方法

[RequireComponent(typeof(ClassName))]向 GameObject 添加使用 RequireComponent 的脚本时,会自动将需要的组件添加到 GameObject 中。 这对避免设置错误非常有用。
[ExecuteAlways]添加这个属性后脚本无论是在 Edit Mode 还是 Play Mode 都会执行。(每次切换状态时要运行一次)
[ExecuteInEditMode]

在编辑界面让你的功能(类)(非Play模式)起作用
添加这个属性后的脚本可以在EditMode下执行,有些函数的执行方式与PlayMode不同:
Update :编辑器中某个组件发生变化(如在编辑器中修改数值)=> 触发
OnGUI :当 GameView 收到一个 Event 时 => 触发

### 使用方法 #### 窗口快速调用方法 可使用 Unity特性 Attribute 和自定义 Editor 编辑器的方式,实现 Inspector 窗口快速调用方法的功能。例如,在 Editor 文件夹下创建脚本,利用 `[CustomEditor(typeof(Test))]` 定义自定义编辑器类可编辑的对象类型,重写 `OnInspectorGUI` 类刷新 Inspector 面板,在其中绘制按钮并执行相应方法[^1][^3]。示例代码如下: ```csharp using UnityEditor; using UnityEngine; using UnityEditor.UI; // 定义自定义编辑器类可以编辑的对象类型 [CustomEditor(typeof(Test))] public class ButtonTest : Editor { // 重写 OnInspectorGUI 类(刷新 Inspector 面板) public override void OnInspectorGUI() { // 继承基类方法 base.OnInspectorGUI(); // 获取要执行方法的类 Test test = new Test(); // 绘制 Button if (GUILayout.Button("获取1000金币")) { // 执行方法 test.SetCoin(); } } } ``` #### 重写 Inspector 在重写 Inspector 时,若要保存数据,可使用以下方法: - `EditorUtility.SetDirty(target)`:在 5.3 以后,标记场景中的对象所做的更改。 - `Undo.RecordObject(target, "string name")`:标记场景中的对象所做的任何更改,这段代码要放在更改之前。 - `SerializedObject.Update()`、`EditorGUILayout.PropertyField()` 和 `SerializedObject.ApplyModifiedProperties()`:用于更改可序列化组件或者资源的属性。 - `EditorSceneManager.MarkSceneDirty()`:标记场景中的文件,且不想要有撤销功能[^2]。 #### 创建下拉列表 使用 `enum` 然后在 Inspector 中显示即可创建下拉列表。先创建一个枚举类型,再在 `MonoBehaviour` 脚本中使用该枚举类型的变量,这样在 Inspector 中就会显示为下拉列表[^4]。示例代码如下: ```csharp // 创建一个枚举类型 public enum DrugProperty { Han, Re } // 创建 MonoBehaviour 脚本 public class xxx : MonoBehaviour { public DrugProperty drugProperty; } ``` ### 功能介绍 - **属性查看与修改**:Inspector 窗口可显示选中对象的各种属性,如游戏对象的 Transform、Renderer 等组件的属性,用户能直接在该窗口修改这些属性值,实时查看对象的变化。 - **组件管理**:可对游戏对象添加、移除和管理组件。通过 Inspector 窗口的“Add Component”按钮,能为对象添加所需的组件,如 Rigidbody、Collider 等。 - **脚本参数设置**:对于挂载在游戏对象上的脚本,Inspector 窗口会显示脚本中定义的公共变量,方便用户在运行前设置这些参数,无需修改代码。 - **调试辅助**:可通过在 Inspector 窗口添加按钮等方式,实现快速调用脚本中的方法,辅助调试工作。例如,在 Inspector 窗口添加一个“获取金币”的按钮,点击按钮即可执行获取金币的方法[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值