Unity编辑器扩展之Attribute特性(二)

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity编辑器扩展之Attribute特性(二)
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 Attribute 编辑器扩展

为初学者节省宝贵的学习时间,避免困惑!

Unity编辑器扩展之Attribute特性(一)

Unity编辑器扩展之Attribute特性(二)

Unity编辑器扩展之Attribute特性(三)

Unity编辑器扩展之Attribute特性(四)


前言:

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

在这里插入图片描述



一、AddComponentMenu

AddComponentMenu 用于自定义在 Unity 编辑器的 “Component” 菜单中显示的脚本的位置。
这个特性允许你将脚本添加到特定的菜单路径下,以便更好地组织你的自定义组件。

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

以下是一个 AddComponentMenu特性的示例:

using UnityEngine;

[AddComponentMenu("MyScripts/CustomScript")]
public class MyComponent : MonoBehaviour
{
    
    
   // 这是你的脚本的内容
}

在这个示例中,AddComponentMenu 特性将脚本 MyComponent 添加到 “Component” 菜单的 “MyScripts” 子菜单下,命名为 “CustomScript”。在 Unity 编辑器中,你会看到一个名为 “MyScripts” 的菜单,它包含了 “CustomScript” 选项。这使得你可以更轻松地找到和添加你的自定义脚本。

在这里插入图片描述



二、DisallowMultipleComponent

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

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

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

以下是一个 DisallowMultipleComponent 特性的示例:

using UnityEngine;

[DisallowMultipleComponent]
public class MyComponent : MonoBehaviour
{
    
    
   // 这是你的脚本的内容
}

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

在这里插入图片描述



三、RequireComponent

RequireComponent 用于确保特定类型的组件在同一 GameObject 上一起存在。

这个特性通常用于协助开发人员避免在 GameObject 上忘记添加必需的组件。

当你将 RequireComponent 特性添加到一个脚本类上时,你可以指定一个或多个必需的组件类型。如果某个 GameObject 上附加了该脚本类,但缺少指定的组件,Unity 将自动添加这些必需的组件,以确保 GameObject 具有正确的组件配置。

以下是一个 RequireComponent 特性的示例:

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class MyComponent : MonoBehaviour
{
    
    
    // 这个脚本需要一个 Rigidbody 组件
    // 如果 GameObject 上没有 Rigidbody 组件,Unity 会自动添加一个
}

在上面的示例中,MyComponent 脚本被标记为 RequireComponent,并指定了 Rigidbody 组件作为必需组件。这意味着如果你将 MyComponent 组件添加到 GameObject 上,但该 GameObject 没有 Rigidbody 组件,Unity 将自动添加一个 Rigidbody 组件以满足必需条件。

在这里插入图片描述



四、MenuItem

MenuItem 用于在 Unity 编辑器的菜单栏中添加自定义菜单项。

这允许开发人员创建自定义的编辑器工具、快捷方式或功能,并将它们集成到 Unity 编辑器中,以提高工作效率。

MenuItem 特性有两个常用的用途:

  1. 打开脚本或场景: 开发人员可以使用 MenuItem创建一个菜单项,使他们可以轻松地打开脚本文件或场景文件,而无需手动导航到资源面板或文件资源。
  2. 执行自定义功能: 通过MenuItem,开发人员可以创建自定义功能,例如自动化工作流、清理操作或自定义编辑器工具。这些功能可以通过菜单项触发,使 Unity编辑器更加强大和易于使用。

下面是 MenuItem特性的使用示例:

using UnityEngine;
using UnityEditor;

public class MyCustomEditor : Editor
{
    
    
    [MenuItem("MyTools/Open Script Folder")]
    public static void OpenScriptFolder()
    {
    
    
        // 打开脚本文件夹
        EditorUtility.RevealInFinder(Application.dataPath);
    }

    [MenuItem("MyTools/Custom Editor Tool")]
    public static void CustomEditorTool()
    {
    
    
        // 执行自定义编辑器工具的操作
        // 可以是任何自定义功能
    }
}

在上面的示例中,我们使用 MenuItem特性为自定义编辑器类创建了两个菜单项。

第一个菜单项 “Open Script Folder” 可以打开脚本文件夹,

第二个菜单项 “Custom Editor Tool” 执行自定义编辑器工具的操作。

MenuItem特性接受菜单路径作为参数,该路径指定了菜单项应出现在 Unity 编辑器的哪个菜单下。

开发人员可以使用斜杠 / 分隔菜单项的子菜单。如果需要,还可以使用快捷键,例如 “MyTools/Open Script Folder %&O”,其中 % 表示 Ctrl 键,& 表示 Alt 键,# 表示 Shift 键。

在这里插入图片描述



五、ContextMenu

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

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

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

下面是 ContextMenu特性的使用示例:

using UnityEngine;
using UnityEditor;

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

在这个示例中,[ContextMenu(“Do Something”)] 特性被应用于 MyCustomMethod 方法上,这将在 Inspector 中创建一个名为 “Do Something” 的上下文菜单项。当用户在 Inspector 中选择该菜单项时,将触发 MyCustomMethod 方法的执行。

在这里插入图片描述



六、ContextMenuItemAttribute

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

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

下面是 ContextMenuItemAttribute特性的使用示例:

using UnityEngine;

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

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

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

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

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

在这里插入图片描述



七、CreateAssetMenuAttribute

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

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

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

下面是 CreateAssetMenuAttribute特性的使用示例:

using UnityEngine;
using UnityEditor;

[CreateAssetMenu(fileName = "NewSettings", menuName = "MyGame/PlayerSettings")]
public class PlayerSetting : ScriptableObject
{
    
    
    public string playerName;
    public int playerScore;
}

在这个示例中,[CreateAssetMenu] 特性被应用于 PlayerSetting 类。

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

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

在这里插入图片描述



八、RuntimeInitializeOnLoadMethodAttribute

RuntimeInitializeOnLoadMethodAttribute 用于标记静态方法,在 Unity 运行时初始化时自动调用。

通常,这个特性用于在游戏启动时执行某些初始化逻辑或注册回调函数。

要使用 RuntimeInitializeOnLoadMethodAttribute 特性,你需要编写一个静态方法,并将该特性应用于该方法。当你的游戏启动时,Unity 将自动调用带有此特性的方法。

下面是 RuntimeInitializeOnLoadMethodAttribute特性的使用示例:

using UnityEngine;

public class MyInitializer
{
    
    
    [RuntimeInitializeOnLoadMethod]
    static void InitializeOnLoad()
    {
    
    
        // 在游戏启动时执行的初始化逻辑
        Debug.Log("Game is starting, performing initialization...");
    }
}

在上面的示例中,InitializeOnLoad 方法被 RuntimeInitializeOnLoadMethod 特性标记,因此它将在游戏启动时执行。你可以在该方法内执行任何你需要在游戏启动时进行的初始化工作。

这个特性通常用于在项目启动时执行某些全局初始化操作,例如设置游戏的初始状态、加载配置、注册全局事件等。这样可以确保这些操作在游戏启动时自动执行,而不需要手动触发。



九、DelayedAttribute

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

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

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

using UnityEngine;

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

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

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

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





TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

猜你喜欢

转载自blog.csdn.net/caiprogram123/article/details/133863290