Unity Attribute 特性全面总结

整理一些常用的Unity Attribute。

Unity提供两类Attribute:

  1. UnityEngine: 主要作用于Inspector面板,参阅文档 AddComponentMenu 及其同级页面。

  1. UnityEditor: 主要作用于Unity编辑器(例如菜单),参阅文档 CallbackOrderAttribute 及其同级页面。

1. UnityEngine常用Attribute

AddComponentMenu: 作用于脚本中的类,可在“Component”菜单中的任意位置放置脚本,而不仅是“Component > Scripts”菜单。

DisallowMultipleComponent: 作用于脚本中的类,指定类(及其子类)不能多次添加到GameObject。

RequireComponent: 作用于脚本中的类,添加到GameObject时自动添加依赖项。

ExecuteAlways: 作用于脚本中的类,使脚本实例在编辑时也能执行。

ExecuteInEditMode: 此属性逐步被淘汰,使用 ExecuteAlways 代替。

HideInInspector: 作用于变量,使变量不显示在 Inspector 中,但会进行序列化。

SerializeField: 作用于变量,强制对私有变量进行序列化,并在 Inspector 中显示。

Header: 作用于变量,在变量上方添加标题,可用来分组。

Space: 作用于变量,添加字段间距。

TextArea: 作用于变量,带滚动条的文本输入框。

Multiline: 作用于变量,不带滚动条的多行文本输入框。

Range: 作用于变量,限定 float 或 int 的取值范围。

Tooltip: 作用于变量,为字段添加提示信息,鼠标悬停字段上即可展示。

ContextMenuItem: 作用于变量,对字段添加一个右键菜单,并执行指定的函数。

ContextMenu: 作用于函数,在 Inspector 脚本上下文菜单中添加函数执行命令。【注意】此函数必须是非静态的。

RuntimeInitializeOnLoadMethod: 作用于函数,游戏启动时,会自动调用添加了该属性的方法。

示例程序:

using UnityEngine;

[DisallowMultipleComponent]
[RequireComponent(typeof(Rigidbody))]
[AddComponentMenu("Snippet/Test/UnityEngineAttributeTest")]
[ExecuteAlways]
public class UnityEngineAttributeTest : MonoBehaviour
{

    // 控制可见性
    [HideInInspector]
    public bool isHide;
    [SerializeField]
    private float hp = 10;

    #region 辅助特性
    // 1.Header: 分组说明特性
    // 为成员分组
    // [Header("分组说明")]
    [Header("基础属性")]
    public int age;
    public bool sex;
    [Header("战斗属性")]
    public int atk;
    public int def;

    // 2.Tooltip: 悬停注释
    // 为变量添加说明
    // [Tooltip("注释内容")]
    [Tooltip("闪避")]
    public int miss;

    // 3.Space: 间隔特性
    // 让两个字段间出现间隔
    // [Space()]
    [Space()]
    public int space;

    // 4.Range: 修饰数值的滑条范围
    // [Range(最小值, 最大值)]
    [Range(0, 10)]
    public float luck;

    // 5.Multiline: 多行显示字符串,默认不写参数显示3行
    // 写参数就是对应行
    // [Multiline(5)]
    [ContextMenuItem("Reset", "ResetMultiline")]
    [Multiline()]
    public string multiline;
    private void ResetMultiline() {
        multiline = "";
    }

    // 6.TextArea: 滚动条显示字符串,默认不写参数就是超过3行显示滚动条
    // [TextArea(4, 5)]
    // 最少显示4行,最多5行,超过5行就显示滚动条
    [TextArea(4, 5)]
    public string notice;

    // 7.ContextMenuItem
    // 参数1 显示按钮名
    // 参数2 方法名,不能带参数
    // [ContextMenuItem("按钮名", "方法名")]
    [ContextMenuItem("重置金币", "ResetCoin")]
    public int coin;
    private void ResetCoin() {
        coin = 100;
    }

    // 8.ContextMenu: 为方法添加特性,能够在Inspector中执行
    // [ContextMenu("测试函数")]
    [ContextMenu("清空公告内容")]
    private void ResetNotice() {
        notice = "";
    }
    #endregion

    [ContextMenu("DecreaseHp")]
    private void DecreaseHp()
    {
        if (hp > 0)
        {
            hp--;
        }
    }

    [RuntimeInitializeOnLoadMethod]
    static void OnRuntimeLoad()
    {
        Log.info("OnRuntimeLoad", LogColor.Red);
    }
}

点击脚本上下文菜单中的 DecreaseHp 就会执行脚本中的 DecreaseHp 函数,Hp数值就会减1。

点击multiline字段右键上下文菜单中的Reset,执行脚本中的 ResetMultiline 函数,清空 multiline 字段。

2. UnityEditor常用Attribute

MenuItem: 向Unity编辑器主菜单或面板上下文菜单添加菜单项。

InitializeOnLoad: Unity加载或重新编译脚本时,会调用带有此属性的静态构造函数。

InitializeOnLoadMethod: 作用于函数,InitializeOnLoad的Method版本。【注意】此函数必须是静态的。

示例程序:

using UnityEditor;

[InitializeOnLoad]
public class UnityEditorAttributeTest
{

    static UnityEditorAttributeTest()
    {
        EditorApplication.update += Update;
        Log.info("UnityEditorAttributeTest: Constructor", LogColor.Red);
    }

    // 添加到编辑器菜单中
    [MenuItem("MyMenu/ Do Something")]
    static void DoSomething()
    {
        Log.info("Doing Something...");
    }

    static void Update()
    {
        Log.info("UnityEditorAttributeTest: Update", LogColor.Red);
    }

    [InitializeOnLoadMethod]
    static void InitializeOnLoad() {
        Log.info("InitializeOnLoad");
    }

}

 

<think>好的,用户现在问的是Unity中Header的用法。首先,我需要确认用户的问题是关于Unity编辑器中如何组织Inspector面板的字段,使用Header属性来分组显示。用户可能是在开发过程中发现Inspector面板里的变量太多,想要通过Header来分类,让界面更清晰,方便自己和团队其他成员调整参数。 接下来,我要回想Header属性的基本用法。Header是Unity的一个特性Attribute),可以加在脚本的变量声明上方,用来在Inspector中显示一个标题,这样可以将相关的变量分组,提升可读性。比如在角色控制脚本中,可能有移动速度、跳跃力等变量,用Header("Movement Settings")来分组,这样在Inspector中这些变量会被归到同一个标题下。 然后,我需要考虑用户可能的实际应用场景。用户可能正在编写一个复杂的脚本,有很多公共变量暴露在Inspector里,导致面板显得杂乱。使用Header可以帮助他们将这些变量按功能模块分开,比如“移动设置”、“攻击设置”、“动画参数”等。这种情况下,用户需要知道Header的语法以及如何正确使用它。 另外,用户可能对其他类似的属性也有兴趣,比如Space、Tooltip、Range等,但当前问题集中在Header上,所以需要专注于解释Header,但也可以稍微提一下其他属性作为补充,帮助用户了解更多优化Inspector的方法。 需要注意的是,用户可能不太熟悉C#的特性Attribute)语法,所以需要详细说明如何编写代码。比如,在变量上方添加[Header("标题")],并给出具体的代码示例。同时,要提醒用户Header只能用于公共变量或带有SerializeField属性的私有变量,否则不会显示在Inspector中。 此外,可能用户在使用Header时遇到了一些问题,比如标题没有显示,这时候需要检查是否正确应用了Header属性,变量是否是可序列化的,或者是否有其他代码冲突。用户可能需要知道常见错误和解决方法,比如确保使用UnityEngine命名空间,或者检查脚本编译错误导致属性失效。 最后,总结一下回答结构:先解释Header的作用,然后给出基本用法和代码示例,再说明使用场景,可能的高级用法,以及常见问题排查。这样用户能够全面了解如何有效使用Header来优化他们的Inspector布局。</think>在 Unity 中,**`Header`** 是一个 **特性Attribute)**,用于在 Inspector 面板中为脚本的公共变量或序列化字段添加**分组标题**,帮助开发者更清晰地组织参数。以下是详细用法和示例: --- ### **1. 基本语法** 在脚本中直接通过 `[Header("标题内容")]` 标记字段,标题会显示在 Inspector 中对应字段的上方。 ```csharp using UnityEngine; public class PlayerController : MonoBehaviour { [Header("移动参数")] public float moveSpeed = 5f; public float jumpForce = 10f; [Header("动画控制")] public string runAnimationName = "Run"; public bool useAutoJump = true; } ``` **效果**: ![Inspector 中的 Header 分组效果](https://i.imgur.com/5D6e6yE.png) --- ### **2. 核心规则** - **位置要求**:必须写在变量声明语句的**上方**。 - **作用范围**:仅对紧邻的下一个字段生效(需手动分组相邻字段)。 - **适用对象**:适用于 `public` 字段或标记了 `[SerializeField]` 的私有字段。 --- ### **3. 高级用法** #### **(1) 多级分组** 结合 `Header` 和 `Space` 特性实现多级标题和间距: ```csharp [Header("战斗系统")] [Space(10)] // 添加 10px 的垂直间距 public int attackDamage = 20; public float attackRange = 2f; [Header("音效")] [Space(5)] public AudioClip hitSound; public AudioClip deathSound; ``` --- #### **(2) 与其他特性组合** 与 `Tooltip`、`Range` 等特性混合使用: ```csharp [Header("角色属性")] [Tooltip("角色的最大生命值")] // 鼠标悬停显示提示 [Range(0, 100)] // 限制数值范围 public int maxHealth = 100; ``` --- ### **4. 使用场景** - **分类参数**:将相关变量(如移动、动画、音效)分组显示。 - **团队协作**:让其他开发者快速定位需要调整的参数。 - **降低复杂度**:当脚本暴露大量参数时,用标题避免视觉混乱。 --- ### **5. 注意事项** - **不可跨字段**:一个 `Header` 仅作用于其后紧跟的一个字段(需手动对齐多个字段)。 - **不支持嵌套**:无法通过缩进实现多级标题层级。 - **动态隐藏无效**:标题仅用于静态显示,无法通过代码动态隐藏或修改。 --- ### **6. 完整示例代码** ```csharp using UnityEngine; public class EnemySettings : MonoBehaviour { [Header("基础属性")] public string enemyName = "Slime"; [Range(1, 100)] public int level = 1; [Header("战斗配置")] [SerializeField] private float attackCooldown = 2f; [Tooltip("攻击触发半径")] public float detectRange = 5f; [Header("特效")] public ParticleSystem deathEffect; public Color hitColor = Color.red; } ``` --- ### **7. 替代方案** 如果 `Header` 无法满足需求,可以尝试以下方法: 1. **`[Space]`**:添加垂直间距。 2. **`[SerializeField]` + 注释**:强制显示私有变量并添加注释。 3. **自定义 Editor 脚本**:通过编写自定义 Inspector 实现更复杂的分组(需继承 `Editor` 类)。 --- ### **总结** `Header` 是 Unity 中最简单的参数分组工具,适用于快速整理 Inspector 面板。若需要更高级的布局控制(如折叠分组、颜色标记),建议学习 **自定义 Editor 脚本** 或使用插件(如 Odin Inspector)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity打怪升级

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值