当前位置:   article > 正文

unity自定义特性7.2_unity特性自定义

unity特性自定义

前言

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

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

unityEngine 和 unityEditor.

AddComponentMenu特性在 UnityEngine中,

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

1:AddComponentMent ,添加 组件菜单

[AddComponentMenu("Transform/DeBugPlatform")]

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

  1. [AddComponentMenu("Transform/DeBugPlatform")]
  2. public class AttrDebugPlatfom:MonoBehaviour
  3. {
  4. void Start()
  5. {
  6.       Debug.Log( Application.platform.ToString());
  7. }
  8. }

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

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

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

例如以下

  1. namespace UnityEngine{
  2. public class AddComponentMent:System.Attribute
  3. {
  4.     public AddCompoentMenu(string compoentName)
  5.     {.....
  6.     }
  7. }
  8. }

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

MenuItem特性

 

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

  1. using UnityEditor;
  2. using UnityEngine;
  3. public class MyMenu:MonBehaviour
  4. {
  5. [MenuItem("May/shortcut Key %g ")]
  6. static void DoSomeThingWithShortcutKey()
  7. {
  8.     Debug.Log("Do SomeThing With Shot cut key");
  9. }
  10. }

这里的%g

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

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

  1. [MenuItem("May/Rigbody/Double Mass")]
  2. static void DoubleMass(MenuCommand command)
  3. {
  4.     Rigbody body=(Rigbody)command.context;
  5.      body.mass*=2;
  6.       print("body's mass is"+body.mass);
  7. }

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

  1. [MenuItem("GameObject/MyCategory/Custom Game Object",false,10)]
  2. static void CreatCustomGameObject(MenuCommand menuCommand)
  3. {
  4.      GameObject go = new  GameObject("Custom Game Object");
  5.      GameObjectUtility. SetParentAndAlign(go, menuCommand.context as GameObject);
  6.      Undo.RegisterCreatedObjectUndo(go,“Create”+go.name);
  7.     Selection.activeObject=go;
  8. }

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

  1. [MenuItem("CONTEXT/CubeInfo/SetColorAndVector")]
  2. static void  SetCubeInfo(MenuCommand command)
  3. {
  4. CubeInfo cubeInfo=(CubeInfo)command.context;//获取CubeInfo脚本,物体上有挂载才行
  5. cubeInfo.cubeScale=new Vector3(1f,1f,1f);
  6. cubeInfo.cubeColor=Color.white;   //初始化脚本数据、
  7. //MenuCommand的 基本使用,来一次性 初始化修改数据  对数量大的数据特别好用 。更多请访问unityAPI
  8. }

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

比如:

  1. using UnityEngine;
  2. using Systems;
  3. CubeInfo:MonoBehaviour
  4. {
  5. public Vector3 cubeScale=new Vector3(1.5f,1.5f,1.5f);
  6. public Color CubeColor=Color.red;
  7. }
  8. Update()
  9. {
  10.     this.transform.localScale= cubeScale;    
  11.     gameObject.GetComponent<MeshRenderer>().material.color=cubeColor;
  12.     //修改cube比例和颜色
  13. }

 

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

  1. [MenuItem("MyMenu/Log Selected Transform Name",true)]
  2.  static bool ValidateLogSelectedTransformName()
  3. {
  4.  return Selection.activeTransform!=null;
  5. }
  6.    

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

System.AttributeUsageAttribute 类实例

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

制定引用类型

  1. [AttributeUsage(AttributeTargets.Class,Inherited=false)]
  2. public class CustomAttribute: System.Attribute
  3. {
  4.     string name;
  5.         public CustomAttribute(string name)
  6.         {
  7.             this.name=name;
  8.         }
  9. }

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

 

 它的构造函数为:

  1. public AttributeUsageAttribute( AttributeTargets vaildOn)
  2. {
  3.         m_attributeTarget =validOn;
  4. }
  5. internal  AttributeUsageAttribute(AttributeTarget validOn, bool allowMultiple,bool inherited)
  6. {
  7.       m_attributeTarget =validOn;
  8.     m_allowMultiple =allowMultiple;
  9.     m_inherited=inherited;
  10. }

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

 

 

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

 

AttributeTargets 枚举的定义的代码如下

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

  1. public enum AttributeTargets
  2. {
  3.     Assembly =0x0001,
  4.     Module=0x0002,
  5.     Class=0x0004,
  6.      Struct =0x0008,
  7.     Enum =0x0010,
  8.     Constructor=0x0020,
  9.    Method= 0x0040,
  10.     Property =0x0080,
  11.     Field =0x100,
  12.      Event=0x200,
  13.      Interface=0x400,
  14.      Parameter=0x800,
  15.     Delegate =0x1000,
  16.   All=     Assembly |  Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate
  17. ClassMembers = | Class | Struct | Enum | Constructor | Method | Property | Field |      Event | Delegate | Interface
  18. }

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

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

 

定义这个特性

  1. [CustomAttribute('ChenClass')]
  2. class ChenClass
  3. {
  4.      public static void main(){}
  5. }

http://www.cnblogs.com/murongxiaopifu

参考小黄书 围绕 官方API讲 的书,很不错的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/585578
推荐阅读
相关标签
  

闽ICP备14008679号