概述
关于 Attribute特性(属性特性)传送门:http://www.cnblogs.com/landeanfen/p/4642819.html
总结版本来源于unity2017;其它版本仅供参考,欢迎补全,有错误请私信me。
RangeAttribute:[Range(最小值,最大值)]
//属性面板中,限制最大生命值取值范围(0,100)
[Range(0,100)]
public int maxHealth=100;
TooltipAttribute:[Tooltip(“这里显示描述的信息”)]
//在属性面板中,鼠标放在属性上,显示当前属性的描述就是了参数里的话
[Tooltip("这里显示描述的信息")]
public new Camera camera;
AddComponentMenu:[AddComponentMenu(层级/结构)]
//追加到组件栏目录
[AddComponentMenu("TestMenu/TestComponet")]
public class BoardBase : UIBase {
}
RequireComponent:[RequireComponent(typeof(需要的对象))]
//当前组件作用对象必须含有Transform组件,没有自动追加
[RequireComponent(typeof(Transform))]
public class BoardBase : UIBase {
ContextMenu:[ContextMenu(“自定义的操作名”)]
//可以在属性面板的ContextMenu(帮助右边的小齿轮那里)中增加选项。
[ContextMenu("Clear Data")]
public void ClearData(){
}
ContextMenuItemAttribute:[ContextMenuItemAttribute(“操作名”, “方法名”)]
//可以在属性面板当前对变量追加一个右键菜单,并执行指定的函数。
[ContextMenuItemAttribute("Reset", "ResetPath")]
[ContextMenuItemAttribute("Load", "LoadPath")]
public string webPath = "http://dp.katagames.cn";
private void ResetPath(){
webPath = "http://dp.katagames.cn";
}
private void LoadPath(){
Application.OpenURL(webPath);
}
DisallowMultipleComponent:[DisallowMultipleComponent]
//在一个Gameobject最多只能添加一个该Class的实例。
[DisallowMultipleComponent]
public class BoardBase : UIBase {
}
ExecuteInEditMode:[ExecuteInEditMode]
//这个属性让Class在Editor模式(非Play模式)下也能执行(Start,Update,OnGUI等方法)。Update方法只在Scene编辑器中有物体产生变化时,才会被调用;OnGUI方法只在GameView接收到事件时,才会被调用。
[ExecuteInEditMode]
public class BoardBase : UIBase {
}
ExecuteAlways:[ExecuteAlways]
//这个属性让Class无论在Editor模式或者Play模式下都能执行(Start,Update,OnGUI等方法)。
[ExecuteAlways]
public class BoardBase : UIBase {
}
HeaderAttribute:[Header(“Header显示的内容”)]
//这个属性可以在Inspector中变量的上面增加Header。
[Header("当前生命值")]
public int currentHP = 0;
ImageEffectOpaque:[ImageEffectOpaque]
//在OnRenderImage上使用,可以让渲染顺序在非透明物体之后,透明物体之前。
[ImageEffectOpaque]
void OnRenderImage(RenderTexture source, RenderTexture destination){
}
MultilineAttribute:[Multiline];[Multiline(行数)]
//在属性面板中,用于在多行文本区域中显示字符串值的属性
[MultilineAttribute]
public string peopleInfo;
[MultilineAttribute(5)]
public string peopleDes;
RuntimeInitializeOnLoadMethodAttribute:[RuntimeInitializeOnLoadMethod];[RuntimeInitializeOnLoadMethod(枚举参数场景加载前/加载后)]
///
/// 加载场景时调用
///
[RuntimeInitializeOnLoadMethod]
public void Main()
{
print("启动了-Main");
}
/*[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
public void Main()
{
print("启动前");
}*/
/*[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
public void Main()
{
print("启动后");
}*/
SelectionBaseAttribute:[SelectionBase]
///当一个GameObject1含有使用了该属性的Component的时候,在SceneView中选择该GameObject1整体时或者子物体时,会优先选择GameObject1。
[SelectionBase]
public class Abb : MonoBehaviour {
}
SerializeField:[SerializeField]
//在变量上使用该属性,可以强制该变量进行序列化。即可以在属性上对变量的值进行编辑。
[SerializeField]
private int attack;
SpaceAttribute:[Space];[Space(像素)]
//使用该属性可以在属性面板上增加一些空位。
[Space]
public int attack;
[Space(15)]
public int currentHealth;
TextAreaAttribute:[TextArea];[TextArea]
//该属性可以把string在Inspector上的编辑区变成一个TextArea。
[TextArea]
public string goodsInfo;
[TextArea(3,15)]
public string peopleInfo;
SharedBetweenAnimatorsAttribute:[SharedBetweenAnimators]
//用于StateMachineBehaviour上,不同的Animator将共享这一个StateMachineBehaviour的实例,可以减少内存占用。
[SharedBetweenAnimators]
public class AttackBehaviour : StateMachineBehaviour
{
public new void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
Debug.Log("OnStateEnter");
}
}
UnityAPICompatibilityVersionAttribute:[UnityAPICompatibilityVersionAttribute(版本)]
//用来声明API的版本兼容性
FormerlySerializedAsAttribute:[FormerlySerializedAs(“老的属性名”)]
//防止我们在属性视图中设计好的数值因为更改属性名而被修改
//比如我之前m_MyValue变量叫做m_MyValueB,在属性中设置数值了,现在变量名叫m_MyValue
//可以使用FormerlySerializedAs来防止数值变化
[SerializeField]
[FormerlySerializedAs("m_MyValueB")]
private string m_MyValue;
HideInInspector:[HideInInspector]
//在属性面板隐藏该属性
[HideInInspector]
public int Health = 100;
MonoPInvokeCallbackAttribute:[MonoPInvokeCallback(接收的代理类型)]DllImportAttribute:[DllImport(“DLL名称”)]
参考网站:http://www.cnblogs.com/kingBook/p/6723620.html
internal delegate void TestCallBack(string eventName);
//C++/c(非托管代码) 的方法可从c#调用。
[DllImport("__Internal")]
private static extern void _TestInit(TestCallBack callback);
//C#(托管代码)中注册方法可以从C++/c(非托管代码)调用。
[MonoPInvokeCallback(typeof(TestCallBack))]
public static void onCallBack(string eventName)
{
if (eventName == "complete")
{
//do something
}
}
SerializableAttribute:[System.Serializable] NonSerializedAttribute:[System.NonSerialized]
//序列化类,在属性面板显示对象成员变量
[System.Serializable]
public class Role
{
public string name;
public int maxHealth;
//禁止序列化,如果类进行序列化是,属性不序列化,在属性面板不显示对象成员变量
[System.NonSerialized]
public int health = 100;
}
CustomEditor:[CustomEditor(目标类型)];[CustomEditor(目标类型,子类是否可以继承使用这个自定义界面)]
using UnityEditor;
using UnityEngine;
//为某个组件制作个性化属性视图
[CustomEditor(typeof(MyComponent))]
public class MyComponentEditor : Editor
{
MyComponent script;//所对应的脚本对象
GameObject rootObject;//脚本的GameObject
SerializedObject seriObject;//所对应的序列化对象
//初始化
public void OnEnable()
{
seriObject = base.serializedObject;
var tscript = (MyComponent)(base.serializedObject.targetObject);
if (tscript != null)
{
script = tscript;
rootObject = script.gameObject;
}
}
//清理
public void OnDisable()
{
seriObject = null;
script = null;
rootObject = null;
}
//界面绘制
public override void OnInspectorGUI()
{
}
}
CallbackOrderAttribute
public class Tip: UIBase{
[UICall()]
public void UIListHandle()
{
}
}
///
/// CallbackOrderAttribute 需要回调索引的属性的基类。
///
public class UICall : CallbackOrderAttribute
{
}
CanEditMultipleObjects:[CanEditMultipleObjects()]
//自定义编辑器支持多对象编辑。
[CanEditMultipleObjects()]
//为某个组件制作个性化属性视图
[CustomEditor(typeof(MyComponent))]
public class MyComponentEditor : Editor
{
}
CustomPreviewAttribute:[CustomPreview(对象类型)]
using UnityEditor;
using UnityEngine;
//将一个class标记为指定类型的自定义预览
//预览窗口在属性窗口下 窗口名称:Preview (预览)
//默认一般是隐藏,头部是对象名称
[CustomPreview(typeof(MyComponent))]
public class MyPreview : ObjectPreview
{
public override bool HasPreviewGUI()
{
return true;
}
public override void OnPreviewGUI(Rect r, GUIStyle background)
{
GUI.skin.label.normal.textColor = Color.white;
GUI.Label(r, target.GetType() + " is being previewed");
}
}
DrawGizmo: [DrawGizmo(Gizmo类型)];[DrawGizmo(Gizmo类型,绘制的类型)]
//可以在Scene视图中显示自定义的Gizmo
[DrawGizmo(GizmoType.Selected | GizmoType.Active,typeof(MyComponent))]
static void DrawGizmoForMyScript(MyComponent scr, GizmoType gizmoType)
{
Vector3 position = scr.transform.position;
//距离大于10显示logo
if (Vector3.Distance(position, Camera.current.transform.position) > 10f)
Gizmos.DrawIcon(position, "logo.png");
}
InitializeOnLoadAttribute:[InitializeOnLoad] InitializeOnLoadMethodAttribute: [InitializeOnLoadMethod()]
using UnityEditor;
//允许一个编辑器类在Unity加载时初始化,而不需要用户操作。
//运行时也会被调用一次
[InitializeOnLoad]
public class EditorMain {
static EditorMain()
{
UnityEngine.Debug.Log("Main");
}
}
public class EditorMainTwo
{
//允许一个编辑器类方法在Unity加载时初始化,而不需要用户操作。
//运行时也会被调用一次
[InitializeOnLoadMethod()]
static void EditorMain()
{
UnityEngine.Debug.Log("MainTwo");
}
}
PreferenceItem:[PreferenceItem(“标签名”)]
public class MyPreferences
{
//定制Unity的Preference(偏好)界面。Edit->Preferences...
[PreferenceItem("My Preferences")]
public static void PreferencesGUI()
{
GUILayout.Label("更多信息:dp.katagames.cn", EditorStyles.boldLabel);
if (GUILayout.Button("前往卡塔独立游戏"))
{
Application.OpenURL("http://dp.katagames.cn");
}
}
}
OnOpenAssetAttribute:[OnOpenAsset()];[OnOpenAsset(执行顺序)]
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
public class MyAssetHandler
{
//在打开一个Asset后被调用。
[OnOpenAsset(1)]
public static bool step1(int instanceID, int line)
{
string name = EditorUtility.InstanceIDToObject(instanceID).name;
Debug.Log("Open Asset step: 1 (" + name + ")");
return false; // 我们没有自己的处理手段,如果是true需要我们自己去做处理
}
// step2 因为顺序是 2, 所以在 step1 之后执行
[OnOpenAsset(2)]
public static bool step2(int instanceID, int line)
{
Debug.Log("Open Asset step: 2 (" + instanceID + ")");
return false; // 我们没有自己的处理手段,如果是true需要我们自己去做处理
}
}
PostProcessBuildAttribute:[PostProcessBuild()];[PostProcessBuild(调用顺序)]
//该属性是在build完成后,被调用的callback。
//同时具有多个的时候,可以指定先后顺序。
[PostProcessBuild(1)]
public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)
{
Debug.Log(pathToBuiltProject);
}
PostProcessSceneAttribute:[PostProcessScene()];[PostProcessScene(顺序)];[PostProcessScene(顺序,版本)]
//此属性添加到方法中,以便在构建场景之后获得通知
//进入playmode,当application.loadlevel或application.loadleveladditive也会执行
[PostProcessScene(1)]
public static void OnPostProcessScene(BuildTarget target, string pathToBuiltProject)
{
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = new Vector3(0.0f, 0.5f, 0.0f);
}
CustomPropertyDrawer:[CustomPropertyDrawer(类型)];[CustomPropertyDrawer(类型,应用于子类)]
using UnityEngine;
using UnityEditor;
public enum IngredientUnit { Spoon, Cup, Bowl, Piece }
// 自定义序列化类
[System.Serializable]
public class Ingredient
{
public string name;
public int amount = 1;
public IngredientUnit unit;
}
public class ExampleClass : MonoBehaviour
{
public Ingredient potionResult;
public Ingredient[] potionIngredients;
}
//自定义序列化绘制
[CustomPropertyDrawer(typeof(Ingredient))]
public class IngredientDrawer : PropertyDrawer
{
// 绘制属性区域
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginProperty(position, label, property);
// 绘制Label
position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
// 不让子字段缩进
var indent = EditorGUI.indentLevel;
EditorGUI.indentLevel = 0;
// 计算矩形
var amountRect = new Rect(position.x, position.y, 30, position.height);
var unitRect = new Rect(position.x + 35, position.y, 50, position.height);
var nameRect = new Rect(position.x + 90, position.y, position.width - 90, position.height);
// 绘制数值域
EditorGUI.PropertyField(amountRect, property.FindPropertyRelative("amount"), GUIContent.none);
EditorGUI.PropertyField(unitRect, property.FindPropertyRelative("unit"), GUIContent.none);
EditorGUI.PropertyField(nameRect, property.FindPropertyRelative("name"), GUIContent.none);
// 缩进设置原来位置
EditorGUI.indentLevel = indent;
EditorGUI.EndProperty();
}
}
CustomPropertyDrawer: [CustomPropertyDrawer(属性特性类型)]; [CustomPropertyDrawer(属性特性类型,是否用在子类继承)]
using UnityEditor;
using UnityEngine;
public class RangeTest : MonoBehaviour {
[MyRange(1,10)]
public int num=5;
}
// 这不是编辑器脚本不要放在Editor中。属性特性类应放置在一个常规脚本文件中。
public class MyRange : PropertyAttribute
{
public float min;
public float max;
public MyRange(float min, float max)
{
this.min = min;
this.max = max;
}
}
//属性特性类建议当作一个编辑器脚本,放在位于一个名为Editor的文件夹中。
//告诉 RangeDrawer 他将为MyRange 做绘制
[CustomPropertyDrawer(typeof(MyRange))]
public class RangeDrawer : PropertyDrawer
{
// 绘制区块
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
// 第一获取属性特性,因为包含范围信息
MyRange range = attribute as MyRange;
// 现在绘制滑块有两种类型一种Float 一种 Int
if (property.propertyType == SerializedPropertyType.Float)
EditorGUI.Slider(position, property, range.min, range.max, label);
else if (property.propertyType == SerializedPropertyType.Integer)
EditorGUI.IntSlider(position, property, (int)range.min, (int)range.max, label);
else
EditorGUI.LabelField(position, label.text, "请使用类型 Int 或者 Float");
}
}
ColorUsageAttribute:[ColorUsage(是否显示Alpha)];[ColorUsage(是否显示Alpha, 是否是hdr,最小亮度,最大亮度,最小曝光度,最大曝光度)]
public Color color;
//配置颜色GUI
[ColorUsage(false)]
public Color color2;
[ColorUsage(true, true, 0, 8, 0.125f, 3)]
public Color color3;
PreserveAttribute:[Preserve()]
- 主要用于IL2CPP编译方式,可防止代码剥离移除类、方法、字段或属性。
- 也可以利用link.xml来配置禁止剥离项。
using UnityEngine;
using System.Collections;
using System.Reflection;
using UnityEngine.Scripting;
public class NewBehaviourScript : MonoBehaviour
{
void Start()
{
ReflectionExample.InvokeBoinkByReflection();
}
}
public class ReflectionExample
{
static public void InvokeBoinkByReflection()
{
typeof(ReflectionExample).GetMethod("Boink", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, null);
}
//没有其他代码直接调用Boink方法,所以进行代码剥离时,
//它将被删除,除非[Preserve]属性被应用。
[Preserve]
static void Boink()
{
Debug.Log("Boink");
}
}
最后
以上就是潇洒钢笔为你收集整理的Unity3D Attribute特性(属性特性)的全部内容,希望文章能够帮你解决Unity3D Attribute特性(属性特性)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复