本教程目录

作者最新更新

本教程目录

游戏开发工具

UnityEditor之Attribute特性

438

9 次收藏2024-09-01 09:18:56发布

Unity 特性是一种用于装饰(标记)类、字段、方法和属性的 .NET 特性,用于控制 Unity 引擎的行为、检查代码的有效性以及提供更多的编辑器功能。Unity 特性可以帮助开发者更好地定制和控制游戏对象、组件、编辑器界面和其他 Unity 相关元素的行为。

一、Serializable特性

SerializableAttribute 是一个 .NET 特性,用于表示类或结构是可序列化的。

在 Unity 中,它常用于标记脚本的自定义类,使它们可以在 Inspector 中显示并且可以序列化。

当你在 Unity 中创建自定义类,例如一个用于保存游戏设置或角色属性的类,你通常会将 SerializableAttribute 特性添加到这些类上,以便你可以在 Inspector 中设置它们,或者将它们保存到 Unity 的资源文件中。

PlayerSettings 类被标记为 SerializableAttribute,这意味着你可以在 Unity 的 Inspector 窗口中创建一个 PlayerSettings 类型的字段,然后设置其属性。还可以将 PlayerSettings 对象保存到场景或资源文件中,以便在不同的场景之间或不同的游戏实例中使用。

using System;
using UnityEngine;

public class Test : MonoBehaviour
{
    [Serializable]
    public class PlayerSettings
    {
        public string playerName;
        public int playerScore;
        public float playerHealth;
    }

    public PlayerSettings playerSettings;
}

二、NonSerialized

1、NonSerializedAttribute 属性是一个 C# 特性,通常用于标记字段,以指示这些字段不应该被序列化

在 Unity 中,这通常用于在脚本中引用引用对象或在脚本中执行一些不希望在场景序列化时保存的操作。

2、myInt 字段上有 NonSerializedAttribute 特性,因此它不会出现在 Unity 的 Inspector 中并且不会被序列化

myFloat 字段没有 NonSerializedAttribute 特性,因此它将被序列化并显示在 Unity 的 Inspector 中

using System;
using UnityEngine;

public class Test : MonoBehaviour
{
    // 这个字段将不被序列化
    [NonSerialized]
    public int myInt;

    // 这个字段将被序列化
    public float myFloat;
}

三、UnityEngine之AddComponentMenu特性

1、AddComponentMenu 用于自定义在 Unity 编辑器的 “Component” 菜单中显示的脚本的位置。

这个特性允许你将脚本添加到特定的菜单路径下,以便更好地组织你的自定义组件。

2、在 Unity 中,通常情况下,你创建的所有脚本将显示在 “Component/Scripts” 菜单中。这可能会导致菜单变得混乱不堪,尤其是在复杂的项目中。为了解决这个问题,你可以使用 AddComponentMenu 特性来将脚本分类和组织。

using UnityEngine;

[AddComponentMenu("Menu/CustomMenu")]
public class Test : MonoBehaviour
{

}

四、UnityEngine之ColorUsage特性

1、ColorUsageAttribute 用于指定颜色字段的属性,以便在 Inspector 窗口中显示颜色拾取器,允许用户选择颜色。

2、ColorUsageAttribute 的参数有两个:

Show Alpha: 这是一个布尔值,用于指定是否显示颜色拾取器中的 Alpha 透明度通道。如果设置为 true,则颜色拾取器将包括 Alpha 透明度通道,允许用户选择带有透明度的颜色。

HDR: 这也是一个布尔值,用于指定颜色是否使用高动态范围 (HDR)。如果设置为 true,颜色值将被视为 HDR 颜色,可以具有更高的亮度和对比度范围。

using UnityEngine;

public class Test : MonoBehaviour
{
    [ColorUsage(true, true)]
    public Color myColor;
}

五、UnityEngine之ContextMenu特性

1、ContextMenu 用于在 Inspector 窗口中为组件或脚本添加上下文菜单。

2、使用这个特性,你可以在 Inspector 中的组件或脚本上创建自定义菜单项,以便在编辑时执行这些方法。

3、这个特性通常用于自定义编辑器扩展,以便提供额外的工具或便捷的功能。例如,你可以在脚本中的方法上添加一个上下文菜单项,当点击该菜单项时,会触发方法执行,用于执行特定任务。

using UnityEngine;

public class Test : MonoBehaviour
{
    [ContextMenu("Do Something")]
    private void CustomMethod()
    {
        // 当在 Inspector 中的上下文菜单中选择 "Do Something" 时,将触发这个方法。
        Debug.Log("Doing something...");
    }
}

六、UnityEngine之ContextMenuItem特性

1、ContextMenuItemAttribute 用于在 Inspector 窗口中为字段或属性添加自定义上下文菜单项。

2、你可以在自定义的字段上应用这个特性,以便在 Unity 编辑器的 Inspector 窗口中为它们添加自定义的上下文菜单项。这些菜单项可以在编辑时执行特定的操作。

using UnityEngine;

public class Test : MonoBehaviour
{
    [ContextMenuItem("Reset Score", "ResetScore")]
    public int playerScore;

    private void ResetScore()
    {
        playerScore = 0;
    }
}

3、在这个示例中,[ContextMenuItem (“Reset Score”, “ResetScore”)] 特性被应用于 playerScore 字段。

这将为 Inspector 中的 playerScore 字段创建一个上下文菜单项,当在该字段上右击时显示为 “Reset Score”。

当用户在 Inspector 中选择这个菜单项时,将触发 ResetScore 方法,这个方法将 playerScore 重置为 0。

七、UnityEngine之CreateAssetMenu特性

CreateAssetMenuAttribute 用于在 Unity 编辑器中为脚本创建自定义资源菜单项。

这个特性允许你在 “Assets” 菜单下创建新的自定义资源,例如脚本的实例或配置文件。

你可以将 CreateAssetMenuAttribute 特性应用于你的自定义脚本类,以便在 Unity 编辑器中方便地创建新的资源实例。这对于生成自定义配置文件、材质、纹理等非常有用。

using UnityEngine;
using UnityEditor;

[CreateAssetMenu(fileName = "NewTest", menuName = "MyGame/Test")]
public class Test : ScriptableObject
{
    
}

这个特性指定了新资源的文件名(fileName)和在 “Assets” 菜单下的位置(menuName)。

在 Unity 编辑器中,你现在可以点击 “Assets” 菜单,然后选择 “Create” > “MyGame” > “Test” 来创建一个新的 Test 资源实例。

八、UnityEngine之Delayed特性

DelayedAttribute 用于标记字段,告诉 Unity 在编辑器中延迟应用字段的值。

这个特性通常用于需要稍后或在特定时机应用值的情况。

当你在 Inspector 中调整带有 Delayed 特性的字段时,Unity 不会立即应用更改,而是等到编辑器的 “Update” 帧之后才应用。这允许你在多次更改字段值之间进行优化,以避免频繁的重计算或资源加载。

using UnityEngine;

public class Test : MonoBehaviour
{
    [Delayed]
    public float delayedValue = 0.0f;

    private void Update()
    {
        // 这里的 delayedValue 可能在多次更改后才会应用
        Debug.Log("Delayed Value: " + delayedValue);
    }
}


在上面的示例中,delayedValue 字段被标记为 DelayedAttribute。当你在 Inspector 中更改它的值时,Unity 不会立即应用更改,而是等到下一帧的 Update 方法调用时才应用。这有助于在编辑器中进行值调整而不触发过多的重计算。

DelayedAttribute 特性对于需要调整和测试数值字段的行为非常有用,因为它允许你在进行多次微调时获得更好的反馈,而不会在每次更改后触发昂贵的操作。


九、UnityEngine之DisallowMultipleComponent特性

DisallowMultipleComponent 用于防止将多个相同类型的组件添加到同一 GameObject 上。

当你将此特性添加到一个脚本类上时,Unity 将确保在同一 GameObject 上只能添加一个该脚本类型的组件。

这个特性的主要目的是帮助开发人员避免在同一 GameObject 上意外添加多个相同类型的组件,因为这可能会导致不可预测的行为和错误。通过使用 DisallowMultipleComponent 特性,你可以确保每个 GameObject 上只有一个特定类型的组件。

using UnityEngine;

[DisallowMultipleComponent]
public class Test : MonoBehaviour
{

}

在上面的示例中,MyComponent 脚本被标记为 DisallowMultipleComponent ,这意味着你无法将多个 Test 组件添加到同一 GameObject 上。

十、UnityEngine之ExecuteInEditMode特性

ExecuteInEditMode 特性用于标记在 Unity 中的脚本类,以确保它们在编辑模式下也会执行,而不仅仅在播放模式下执行。这对于那些需要在编辑器中进行实时交互和编辑的脚本非常有用。

using UnityEngine;

[ExecuteInEditMode] // 使用 ExecuteInEditMode 特性
public class Test : MonoBehaviour
{
    public Vector3 somePosition;

    private void Update()
    {
        // 这里的代码将在编辑器模式下执行
        transform.position = somePosition;
    }
}


在上面的示例中,EditModeScript 类被标记为 ExecuteInEditMode 特性。这表示其中的 Update 方法将在编辑器模式下也执行。这允许开发者在编辑场景时实时观察和交互对象的属性,而不必进入播放模式。

十一、UnityEngine之GUITarget特性

在选择哪些显示器调用 OnGUI 函数。

using UnityEngine;

public class Test : MonoBehaviour
{
    [GUITarget(0, 1)]
    private void OnGUI()
    {
        GUI.Label(new Rect(10, 10, 300, 100), 
					"Visible on TV and Wii U GamePad only");
    }
}
十二、UnityEngine之Header特性

HeaderAttribute 用于在 Inspector 窗口中的字段或变量之前添加标题头。

通常情况下,HeaderAttribute 用于在 Inspector 窗口中创建字段的逻辑分组。

using UnityEngine;

public class Test : MonoBehaviour
{
    [Header("objectName")]
    public string objectName;
    [Header("objectScale")]
    public float objectScale;
}

十三、UnityEngine之HelpURL特性

HelpURLAttribute 用于为 Inspector 窗口中的组件或字段提供帮助链接。

可以很轻松地访问有关该组件或字段的额外信息、文档或在线资源。

using UnityEngine;

[HelpURL("https://docs.unity3d.com/ScriptReference/Transform.html")]
public class Test : MonoBehaviour
{

}

十四、UnityEngine之HideInInspector特性

HideInInspector 用于将字段隐藏在 Inspector 窗口中,即使它们是公共字段

这对于隐藏一些内部或不希望用户更改的字段很有用。

using UnityEngine;

public class Test : MonoBehaviour
{
    public int publicField; // 这个字段将显示在 Inspector 窗口中

    [HideInInspector]
    public int hiddenField; // 这个字段将被隐藏,不会在 Inspector 中显示
}

十五、UnityEngine之ImageEffectAllowedInSceneView特性

任何具有该属性的图像效果都可以渲染到 Scene 视图摄像机中。

如果您希望将图像效果应用于 Scene 视图摄像机,请添加该属性。效果将在相同的位置应用,并且与来自开启该效果的摄像机的值相同。

十六、UnityEngine之ImageEffectOpaque特性

任何具有该属性的图像效果都将在不透明几何形状之后但在透明几何形状之前渲染。

这使得大量使用深度缓冲器(SSAO 等)的效果仅影响不透明像素。该属性可用于通过后期处理减少场景中的视觉瑕疵。


十七、UnityEngine之ImageEffectTransformsToLDR特性

使用 HDR 渲染时,有时可能需要在 ImageEffect 渲染期间切换到 LDR 渲染。

对图像效果使用该属性将使目标缓冲区成为 LDR 缓冲区, 并将剩余的图像效果管线切换到 LDR 模式。与该属性关联的图像效果负责 确保输出处于 LDR 范围内。

十八、UnityEngine之Multiline特性

在 MultilineAttribute 用于标记一个字符串字段,告诉 Inspector 窗口该字段可以显示多行文本输入框。

这通常用于长文本字段或需要多行输入的字段。

using UnityEngine;

public class Test : MonoBehaviour
{
    [Multiline(4)] // 将该字段标记为多行文本输入,显示 4 行文本输入框
    public string description;
}