前言

在导入别人插件的时候,常常会发现上面菜单栏中会多出几个菜单,在后来的学习中发现,原来unity还可以自定义特性

unity中的特性类分别定义在两个命名空间中。

unityEngine 和 unityEditor.

AddComponentMenu特性在 UnityEngine中,

Unity3D中常用的一些特性定义在UnityEngine中;

1:AddComponentMent ,添加 组件菜单

unity 自定义组件 unity 自定义类_Unity开发

[AddComponentMenu("Transform/DeBugPlatform")]

这个要加在 一个Mono脚本前声明

[AddComponentMenu("Transform/DeBugPlatform")]

public class AttrDebugPlatfom:MonoBehaviour

{

void Start()

{

      Debug.Log( Application.platform.ToString());

}

}

这个作用就是运行时Debug平台。

可以把鼠标放到上面,VS F12 追踪到源可以发现AddComponentMenu 类是从 System.Attribute类中派生而来的

符合 CLS(Common Language Specification) 关于定制的要求,至少需要一个公共构造器。

例如以下

namespace UnityEngine{

public class AddComponentMent:System.Attribute

{

    public AddCompoentMenu(string compoentName)

    {.....

    }

}

}

在UnityEditor中是和编辑器相关的一些功能

MenuItem特性

unity 自定义组件 unity 自定义类_System_02

 

这是个编辑器类最好放在Assets/Editor文件下

using UnityEditor;

using UnityEngine;

public class MyMenu:MonBehaviour

{

[MenuItem("May/shortcut Key %g ")]

static void DoSomeThingWithShortcutKey()

{

    Debug.Log("Do SomeThing With Shot cut key");

}

}

这里的%g

在windows系统中代表快捷键ctrl+g Os X是 cmd+g

增加二倍重力的菜单项  官方例子

[MenuItem("May/Rigbody/Double Mass")]

static void DoubleMass(MenuCommand command)

{

    Rigbody body=(Rigbody)command.context;

     body.mass*=2;

      print("body's mass is"+body.mass);

}

//增加一个菜单来创建自定义GameObjects;

[MenuItem("GameObject/MyCategory/Custom Game Object",false,10)]

static void CreatCustomGameObject(MenuCommand menuCommand)

{

     GameObject go = new  GameObject("Custom Game Object");

     GameObjectUtility. SetParentAndAlign(go, menuCommand.context as GameObject);

     Undo.RegisterCreatedObjectUndo(go,“Create”+go.name);

    Selection.activeObject=go;

}

有时候需要经常调整物体属性,数值之类。 一个MenuItem就可

[MenuItem("CONTEXT/CubeInfo/SetColorAndVector")]

static void  SetCubeInfo(MenuCommand command)

{

CubeInfo cubeInfo=(CubeInfo)command.context;//获取CubeInfo脚本,物体上有挂载才行

cubeInfo.cubeScale=new Vector3(1f,1f,1f);

cubeInfo.cubeColor=Color.white;   //初始化脚本数据、

//MenuCommand的 基本使用,来一次性 初始化修改数据  对数量大的数据特别好用 。更多请访问unityAPI

}

以很方便的解决这些问题;

比如:

using UnityEngine;

using Systems;

CubeInfo:MonoBehaviour

{

public Vector3 cubeScale=new Vector3(1.5f,1.5f,1.5f);

public Color CubeColor=Color.red;

}

Update()

{

    this.transform.localScale= cubeScale;    

    gameObject.GetComponent<MeshRenderer>().material.color=cubeColor;

    //修改cube比例和颜色

}

 还可以对脚本 判断有没有选中激活

[MenuItem("MyMenu/Log Selected Transform Name",true)]

 static bool ValidateLogSelectedTransformName()

{

 return Selection.activeTransform!=null;

}

还可以定义增加的定制特性类

System.AttributeUsageAttribute 类实例

特性的适用范围 适用于引用类型 不必适用于值类型或方法,或属性

制定引用类型

[AttributeUsage(AttributeTargets.Class,Inherited=false)]

public class CustomAttribute: System.Attribute

{

    string name;

        public CustomAttribute(string name)

        {

            this.name=name;

        }

}

AttributeUsageAttribute 类是指定另一特性类的用法的简单类 

 它的构造函数为:

public AttributeUsageAttribute( AttributeTargets vaildOn)

{

        m_attributeTarget =validOn;

}

internal  AttributeUsageAttribute(AttributeTarget validOn, bool allowMultiple,bool inherited)

{

      m_attributeTarget =validOn;

    m_allowMultiple =allowMultiple;

    m_inherited=inherited;

}

AttributeTargets类型的参数 vaildOn  来指定 特性的适用范围 

 它需要 一个AttributeTargets 类型 的参数 vaildOn 指明 特性的适用范围。 

AttributeTargets 枚举的定义的代码如下

//AttributeTargets  这个 枚举值的定义如下

public enum AttributeTargets

{

    Assembly =0x0001,

    Module=0x0002,

    Class=0x0004,

     Struct =0x0008,

    Enum =0x0010,

    Constructor=0x0020,

   Method= 0x0040,

    Property =0x0080,

    Field =0x100,

     Event=0x200,

     Interface=0x400,

     Parameter=0x800,

    Delegate =0x1000,

  All=     Assembly |  Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate

ClassMembers = | Class | Struct | Enum | Constructor | Method | Property | Field |      Event | Delegate | Interface

}

对CustomAttribute定义 实例化的  AttributeUsageAttribute 实例时 ,将 AttributeTargets.Class 作为参数传入

AttributeUsageAttribute 类的 构造函数,因此CustomAttribute 特性只能作用于引用类型。 

定义这个特性

[CustomAttribute('ChenClass')]

class ChenClass

{

     public static void main(){}

}