0.对属性进行修饰               //头文件:using UnityEngine ;using UnityEditor;

[SerializeField]                   //序列化,暴露在属性面板,可以编辑,但是私有,不能在脚本中类外面拿到
 [HideInInspector]              //在属性面板隐藏[Header("aaa")]                 //标题栏,上面一行显示字段
 [Tooltip("bbb")]                 //提示字段,指向的时候显示[Space(100)]                      //间隔距离
 [Range(0,11)]                     //限制范围float value1;
[InitializeOnLoadMethod]  //在加载时 调用 对函数和类进行限定 函数必须是 Static
 static void InitializeOnLoad()
 {}
[AddComponentMenu("Delegates/Events/EventTimer")] //类前面用 可以把该脚本类 放在 Component 下。
[AddComponentMenu("Delegates/Events/EventTimer")]
 public class TimerEvents : MonoBehaviour
 {}

1.菜单栏拓展 [MenuItem]   // 头文件:using UnityEditor;

//菜单名字(必须有子菜单), 是否是 test1 的验证函数(默认不是,即为菜单的执行函数), 优先级(默认1000,两优先级差>10,出现横线)
 //Assets 下 Property 的优先级是99998,一般的菜单的优先级是1000(这个是)
     //菜单名字;是否是 test1按钮 的验证函数(如果是false,则说明是按钮的执行函数,true,说明是验证函数);优先级
     //如果错误的写了两个执行函数 会只执行后面的函数,前面的函数被覆盖
     [MenuItem("GameObject/test1", false, 1011)]   
     static void test1()
     {
         Debug.Log("打印test1");
     }
     //菜单名字;是否是 test1 的验证函数 (true,说明是验证函数), 函数的返回值决定该按钮 能否按下/能否执行
     [MenuItem("GameObject/test1", true)]
     static bool test1_Validate()
     {
         return true;//根据返回值,确定是否可以执行 菜单按钮的执行函数
     }
     [MenuItem("GameObject/test2", false)] //必须有子菜单
     static void test2()
     {
         Debug.Log("打印test2");
     }

2.Scene视图自定义菜单    
SceneView.duringSceneGui += (SceneView) =>{}  // 头文件:using UnityEditor;

[InitializeOnLoadMethod] //在加载时 调用的方法
     static void InitializeOnLoad()
     {
         //Scene视图屏幕监听事件
         SceneView.duringSceneGui += (SceneView) =>
         {
             if (Event.current != null && Event.current.button == 1 && Event.current.type == EventType.MouseUp)
             {
                 //Debug.Log("右键抬起");
                 Rect pos = new Rect(Event.current.mousePosition.x, Event.current.mousePosition.y - 100,100,100) ;
                 GUIContent[] CONTENTS = new GUIContent[] {new GUIContent("test1") , new GUIContent("XFKT/aaa/test2") };                //在pos 生成  选项框GUIContent ,默认选中下标1,执行点击的回调函数,用户数据
                 EditorUtility.DisplayCustomMenu(pos, CONTENTS,1,(data,opt,select)=>{
                     Debug.LogFormat("data:{0},opt:{1},select:{2},value={3}", data, opt, select, opt[select]);
                 },1);
                 Event.current.Use();//点击之后不再传递,如果不写 会一直使用鼠标事件
             }
         };
     }

3.快捷键设置   //注意: 带验证函数的子菜单不能添加快捷键

[MenuItem("Assets/test5   &#s", false, 99999)]

⑴特殊符号:

%-----Window的 CTRL /  MacOS 的 Command
 # -----SHIT  
 &-----ALT[MenuItem("Assets/test5   &#s", false, 99999)]  
     static void test5()
     {
         Debug.Log("按下了 ALT + SHIF + S"); 
     }


⑵一般符号

①字母键: A B C D  a b c d 

②数字键: 0 1 2 3 4 5 6 7 8 9

③功能键 :F1、F2、F3 : _F1/_F2_/F3

[MenuItem("Edit/Active GameObject _F1")]
     static void test6()
     {
         Debug.Log("按下了F1");
     }

④方向键: 上、下、左、右 : _UP/_DOWN/_LEFT/_RIGHT (只能是大写)

static void test7()
     {
         Debug.Log("按下了 ALT + ↑");
     }
 [MenuItem("Assets/test8   _UP", false, 99999)]
     static void test8()
     {
         Debug.Log("按下了   ↑");
     }

*****注意*****:
     除了 特殊键【CTRLE(%) SHIT(#) ALT(&)】 可以任意组合以外(最多可以用三个), 每次  一般键(字母键 数字键 功能键 方向键) 只能选择一种中的一个。
超过一种或者一个 都会导致快捷键失效。
***************

[MenuItem("Assets/test9   _%&UP", false, 99999)]
     static void test9()
     {
         Debug.Log("按下了CTRL+ ALT + ↑");
     }

4.Project视图 拓展 和菜单栏拓展一样,只是父菜单写Assets就好。Property 的优先级是99998,一般的菜单的优先级是1000

[MenuItem("Assets/test5", false, 1011)]   
 static void test5()
 {
      Debug.Log("Project视图拓展5");
 }