当前位置:   article > 正文

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

unity attribute

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

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

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

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

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

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

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

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

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


前言:

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

在这里插入图片描述



一、HeaderAttribute

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

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

以下是 HeaderAttribute 的常见用法:

using UnityEngine;
public class MyComponent : MonoBehaviour
{
    [Header("General Settings")]
    public string objectName;
    public float objectScale;

    [Header("Appearance")]
    public Color objectColor;
    public Material objectMaterial;

    [Header("Behavior")]
    public bool isInteractable;
    public int interactionCount;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

HeaderAttribute 允许您将相关字段分组在一起,以提高可读性并使 Inspector 更易于使用。

在这里插入图片描述



二、TooltipAttribute

TooltipAttribute 用于在 Inspector 窗口中为字段或属性提供鼠标悬停提示信息。

对于描述字段或属性的用途、范围、特定设置或其他有关信息非常有用。

下面是 TooltipAttribute 的常见用法:

using UnityEngine;
public class MyComponent : MonoBehaviour
{
    [Tooltip("This is the object's name.")]
    public string objectName;

    [Tooltip("Choose the color for the object.")]
    public Color objectColor;

    [Tooltip("Enable this if the object can be interacted with.")]
    public bool isInteractable;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

当在 Inspector 窗口中将鼠标悬停在字段名称上时,将显示相关提示信息。

在这里插入图片描述



三、RangeAttribute

RangeAttribute 用于指定字段或属性的有效值范围。

RangeAttribute 可以用来限制 Inspector 窗口中字段的值,确保它们在指定的范围内。

下面是 RangeAttribute 的常见用法:

using UnityEngine;

public class MyComponent : MonoBehaviour
{
    [Range(0.0f, 1.0f)]
    public float rangeValue;

    [Range(1, 10)]
    public int rangeCount;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

rangeValue 字段指定了一个浮点数范围(0.0 到 1.0),rangeCount 字段指定了一个整数范围(1 到 10)

在这里插入图片描述



四、MinAttribute

MinAttribute 用于限制字段的最小值。它可以应用于支持数值类型的字段,例如 float、int、double 等,以确保它们不会低于指定的最小值。

下面是 MinAttribute 的常见用法:

using UnityEngine;

public class MyComponent : MonoBehaviour
{
    [Min(1.0f)] // 这个字段的最小值是1.0
    public float playerSpeed = 5.0f;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

playerSpeed 字段被标记为 [Min(1.0f)],这表示其值不能低于1.0。

如果你在 Inspector 中将 playerSpeed 的值设置为低于1.0的数,Unity 将自动将其调整为1.0,以满足最小值要求。

在这里插入图片描述



五、SpaceAttribute

SpaceAttribute 用于在 Inspector 窗口中创建字段之间的间距,以改善界面布局。

通过在字段之前或之后添加空白间距,可以提高字段的可读性和可访问性。

下面是 SpaceAttribute 的基本用法示例:

using UnityEngine;

public class MyComponent : MonoBehaviour
{
    public int field1;

    [Space(10)] // 在此处添加一个 10 像素的间距
    public float field2;

    [Space(20)] // 在此处添加一个 20 像素的间距
    public string field3;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

[Space(10)] 和 [Space(20)] 分别在 field2 和 field3 字段之前添加了 10 像素和 20 像素的间距。

在这里插入图片描述



六、MultilineAttribute

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

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

下面是 MultilineAttribute 的基本用法示例:

using UnityEngine;

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

通过指定 Multiline 属性的行数,您可以为字段提供所需的行数。

在 Inspector 中,这将提供一个文本框,允许用户输入多行文本,并显示所指定的行数。

在这里插入图片描述



七、TextAreaAttribute

TextAreaAttribute 类似于 MultilineAttribute,但允许您更灵活地控制多行文本输入框的外观和行为。

TextAreaAttribute 可以用于标记字符串字段,以在 Unity 的 Inspector 窗口中创建多行文本输入框。

下面是 TextAreaAttribute 的基本用法示例:

using UnityEngine;

public class MyComponent : MonoBehaviour
{
    [TextArea(3, 6)] // 文本框显示 3-6 行文本
    public string description;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

MultilineAttribute 不同,TextAreaAttribute 允许设置以下属性:

minLines:文本框的最小行数。

maxLines:文本框的最大行数。

description 字段被标记为多行文本输入框,并指定了行数的范围。

在这里插入图片描述



八、InspectorNameAttribute

InspectorNameAttribute 用于更改枚举字段在 Inspector 中显示的文本标签。

默认情况下,Unity 会使用枚举字段的名称来表示它们,但在某些情况下,这可能不够直观或清晰。

通过添加 InspectorNameAttribute特性,你可以为枚举值指定自定义的显示名称,使其更具可读性。

下面是 InspectorNameAttribute 的基本用法示例:


using UnityEngine;

public enum Direction
{
    [InspectorName("向上")]
    Up,
    [InspectorName("向下")]
    Down,
    [InspectorName("向左")]
    Left,
    [InspectorName("向右")]
    Right
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在上述示例中,我们为 Direction 枚举的各个值指定了自定义的显示名称。当你在 Unity 的 Inspector 中查看该枚举字段时,它们将以更直观的方式显示,提供更清晰的标签。

在这里插入图片描述



九、FlagsAttribute

FlagsAttribute 是一个 C# 中的特性(Attribute),通常与枚举一起使用,用于表示一个枚举可以包含多个选项或标志的组合。

当你将 FlagsAttribute 应用于一个枚举时,它允许你使用位运算来组合不同的枚举值,从而创建复合的标志。

下面是 FlagsAttribute 的基本用法示例:

using UnityEngine;

public class MyComponent : MonoBehaviour
{
  
    [Flags] // 应用 FlagsAttribute
    public enum Days
    {
        None = 0,           // 0b0000
        Sunday = 1,         // 0b0001
        Monday = 2,         // 0b0010
        Tuesday = 4,        // 0b0100
        Wednesday = 8,      // 0b1000
        Thursday = 16,      // 0b0001 0000
        Friday = 32,        // 0b0010 0000
        Saturday = 64       // 0b0100 0000
    }

    public Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这个示例中,我们将 Days 枚举的值组合在一起,表示会议安排在星期一、星期三和星期五。这是使用 | 运算符(按位或)实现的。

使用 FlagsAttribute 的优势在于它可以帮助你更清晰地表示一组可能组合的枚举值,以及在位运算中进行正确的操作。当你需要处理多个选项或标志时,FlagsAttribute 可以提高代码的可读性和可维护性。

在这里插入图片描述



十、HelpURLAttribute

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

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

下面是 HelpURLAttribute 的基本用法示例:

using UnityEngine;

[HelpURL("https://docs.unity3d.com/ScriptReference/Transform.html")]
public class MyComponent : MonoBehaviour
{
    // ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

HelpURLAttribute 标记了 MyComponent 类,提供了一个链接到 Unity 官方文档中 Transform 类的页面。

在 Inspector 窗口中查看该组件时,可以看到一个帮助图标,点击该图标将打开浏览器并导航到指定的文档页面。

在这里插入图片描述



十一、ColorUsageAttribute

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

下面是 ColorUsageAttribute 的基本用法示例:

using UnityEngine;

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

myColor 字段标记为 ColorUsage,并传递了两个参数:true, true。这将允许在 Inspector 窗口中为 myColor 字段选择颜色,并显示颜色拾取器。

ColorUsageAttribute 的参数有两个:

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

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

在这里插入图片描述



十二、GradientUsageAttribute

GradientUsageAttribute 是一个用于 Unity Shader 中的特性(Attribute),它用于指定一个属性(Property)应该接受渐变(Gradient)类型的数据。这是在编写自定义着色器时非常有用的特性,特别是当你希望使用渐变来控制材质颜色或其他属性时。

下面是 GradientUsageAttribute 的基本用法示例:

using UnityEngine;

public class MyComponent : MonoBehaviour
{
    [GradientUsage(true)] // true 表示允许渐变类型
    public Gradient colorGradient;

    // 其他着色器相关代码...
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这个示例中,colorGradient 属性被标记为接受渐变数据的属性。这意味着你可以在 Unity 的 Inspector 中为 colorGradient 字段设置渐变,以便在着色器中使用它来控制颜色或其他属性。

GradientUsageAttribute 特性的一个重要参数是 allowHDR,当设置为 true 时,它表示允许高动态范围(High Dynamic Range,HDR)渐变。HDR 渐变允许更广泛的颜色值,对于某些视觉效果非常有用。

在这里插入图片描述



十三、SerializeField

SerializeField 用于指定字段或属性应在 Inspector 窗口中可见和序列化。

当将该特性应用于一个字段或属性时,它将允许访问并编辑它,而不需要将字段标记为 public。

以下是 SerializeField 的基本用法示例:

using UnityEngine;

public class MyComponent : MonoBehaviour
{
    [SerializeField]
    private int myField;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

myField字段被标记为 SerializeField,因此它可以在 Unity 的 Inspector 窗口中可见和编辑。

如果不想将字段标记为 public,但仍希望能够在 Inspector 窗口中编辑它们。通过添加 SerializeField,可以序列化非公开字段,使其在编辑器中可见。

在这里插入图片描述



十四、NonSerializedAttribute

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

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

以下是 NonSerializedAttribute 的基本用法示例:

using UnityEngine;

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

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

在这里插入图片描述



十五、HideInInspector

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

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

以下是 HideInInspector 的基本用法示例:

using UnityEngine;

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

publicField 将在 Inspector 窗口中显示,而 hiddenField 将被隐藏。即使 hiddenField 是一个公共字段。

由于有 HideInInspector特性,hiddenField不会在 Inspector 中显示,因此用户无法更改它的值。

在这里插入图片描述



十六、SerializableAttribute

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

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

以下是 SerializableAttribute 的基本用法示例:

using System;
using UnityEngine;

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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

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

在这里插入图片描述



十七、SerializeReference

SerializeReference是 Unity 2019.3 引入的一个特性,用于解决 Unity 中多态对象序列化和 Inspector 面板显示的问题。

这个特性允许你在 Unity 中正确序列化派生自同一个基类的不同子类对象,而不再需要手动创建一个 Object 类型的字段,然后拖拽对象到 Inspector 面板中。

在 Unity 中,当你需要在 Inspector 面板中显示一个字段,并且这个字段的类型是一个接口、抽象类或普通类的基类时,往往会遇到序列化问题。以前,你需要将这个字段声明为 Object 类型,然后在 Inspector 面板中手动将具体的派生类对象拖拽到该字段中。

使用 SerializeReference 特性后,你只需要将字段声明为你的基类类型,并在字段前面添加 SerializeReference 特性,Unity 就会自动处理序列化和在 Inspector 面板中显示。这对于管理多态对象非常有用,尤其是在你需要处理不同子类的情况时。

以下是 SerializeReference 的基本用法示例:

public class MyComponent : MonoBehaviour
{
    [System.Serializable]
    public class Shape
    {
        public string shapeName;
        public float area;
    }

    [System.Serializable]
    public class Circle : Shape
    {
        public float radius;
    }

    [System.Serializable]
    public class Square : Shape
    {
        public float sideLength;
    }

    public Shape shape = new Shape();

    public Circle circle = new Circle();

    public Shape shape_circle = new Circle();

    [SerializeReference]
    public Shape shape_circle_re = new Circle();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

在上面的示例中定义了一个基类Shape,两个子类Circle、Square ,并分别定义了四个变量。

其中shape 字段在Inspector面板上显示了其内部的两个变量shapeName和area。

circle 字段在Inspector面板上既显示了其基类Shape的变量和自身的radius变量。

shape_circle 字段在实例化Circle对象时使用的是基类Shape 类型,这个时候不会序列化子类Circle。

shape_circle_re 字段添加了属性SerializeReference后,正确的序列化了继承了Shape的子对象Circle。

在这里插入图片描述





TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

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

闽ICP备14008679号