[SerializeField]
private int hiddenValue;
此Attribute允许将私有变量显示在Unity Inspector中,尽管它不是public。
[HideInInspector]
public float hideInInspector;
使Inspector忽略该字段,不显示在编辑界面中。
[Range(0f, 1f)]
public float opacity;
对数值型字段添加范围限制,并在Inspector中以滑动条的形式呈现。
[Header("Player Settings")]
public string playerName;
public int playerHealth;
在Inspector中为一系列属性创建标题分组。
[ExecuteInEditMode]
public class CameraFollow : MonoBehaviour
{
void Update()
{
// 这个脚本在编辑器非播放模式下也会执行Update方法
}
}
标记一个MonoBehaviour使其在编辑器中的Edit Mode也能执行特定逻辑。
首先,定义一个自定义Attribute:
using System;
public class CustomTagAttribute : PropertyAttribute
{
public string TagName { get; set; }
public CustomTagAttribute(string tagName)
{
TagName = tagName;
}
}
然后,创建一个对应的PropertyDrawer以在Inspector中展示效果:
using UnityEngine;
using UnityEditor;
[CustomPropertyDrawer(typeof(CustomTagAttribute))]
public class CustomTagPropertyDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var tagAttr = attribute as CustomTagAttribute;
EditorGUI.LabelField(position, $"{label.text} ({tagAttr.TagName})");
// 根据需要实现自定义绘制逻辑
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property);
}
}
最后,在Unity脚本中使用自定义Attribute:
public class MyScript : MonoBehaviour
{
[CustomTag("Important Field")]
public int myIntegerField;
}
现在,myIntegerField
将在Inspector中显示时带有额外的信息“Important Field”。注意,对于这个自定义Attribute,我们还需要为其编写对应的PropertyDrawer来真正地改变Inspector中的显示方式。上述例子简化了PropertyDrawer的实现,实际应用中可能需要更复杂的操作来修改Inspector样式或行为。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class CustomAuthorAttribute : Attribute
{
public string AuthorName { get; set; }
public string Version { get; set; }
public CustomAuthorAttribute(string author, string ver)
{
AuthorName = author;
Version = ver;
}
}
上述代码定义了一个名为CustomAuthorAttribute
的自定义Attribute,它可以应用于类或方法上,并带有作者名称和版本信息。
[CustomAuthor("John Doe", "1.0")]
public class MyClass
{
// 类的成员...
}
[CustomAuthor("Jane Smith", "2.1")]
public void MyMethod()
{
// 方法体...
}
这里,我们已经在MyClass
类和MyMethod
方法上应用了CustomAuthorAttribute
,分别指定了作者和版本信息。
Type myType = typeof(MyClass);
var attributes = myType.GetCustomAttributes(typeof(CustomAuthorAttribute), true);
if (attributes.Length > 0)
{
CustomAuthorAttribute attr = (CustomAuthorAttribute)attributes[0];
Console.WriteLine($"Class '{myType.Name}' was authored by {attr.AuthorName}, version: {attr.Version}");
}
MethodInfo methodInfo = myType.GetMethod(nameof(MyMethod));
var methodAttributes = methodInfo.GetCustomAttributes(typeof(CustomAuthorAttribute), true);
if (methodAttributes.Length > 0)
{
CustomAuthorAttribute methodAttr = (CustomAuthorAttribute)methodAttributes[0];
Console.WriteLine($"Method 'MyMethod' was authored by {methodAttr.AuthorName}, version: {methodAttr.Version}");
}
这个示例展示了如何通过反射技术从类和方法中获取并打印出它们所关联的CustomAuthorAttribute
属性值。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(41-50)
————————————————
?最后我们放松一下眼睛