一、拓展源生组件
可以在摄像机组件最上面添加一个拓展按钮,并且只能在最上面和最下面添加不能再中间添加
代码:
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(Camera))]//自定义编辑器
public class Script_03_09 : Editor
{
public override void OnInspectorGUI()//重写方法
{
//public static bool Button (GUIContent content, GUIStyle style, params GUILayoutOption[] options);
//text 要在按钮上显示的文本。
//image 要在按钮上显示的 Texture。
//content 该按钮的文本、图像和工具提示。
//style 要使用的样式。如果省略,则使用当前 GUISkin 的 button 样式
//options (可选)一个布局选项列表,用于指定额外的布局属性。此处传递的任何值都将覆盖 style 定义的设置。
if (GUILayout.Button("拓展按钮"))
{
}
base.OnInspectorGUI();//是否绘制父类的原有元素
}
}
二、拓展继承组件
1.使用与上面相同的方法
using UnityEngine;
using UnityEditor;
using System.Reflection;
[CustomEditor(typeof(Transform))]
public class Script_03_10 : Editor
{
public override void OnInspectorGUI()
{
if (GUILayout.Button("拓展按钮"))
{
}
base.OnInspectorGUI();
}
}
使用这种方式会使面版变得非常丑陋
2.使用c#反射方式
如果你希望在拓展面版后还保持原有的布局,可以使用这个方法
using UnityEngine;
using UnityEditor;
using System.Reflection;
[CustomEditor(typeof(Transform))]
public class Script_03_10 : Editor
{
public Editor m_Editor;
private void OnEnable()
{
//Editor.CreateEditor 为 targetObject 或 targetObjects 创建自定义编辑器。
//Assembly.GetAssembly 获取在其中定义指定类型的当前加载的程序集。
m_Editor = Editor.CreateEditor(target, Assembly.GetAssembly(typeof(Editor)).GetType("UnityEditor.TransformInspector", true));
}
public override void OnInspectorGUI()
{
if (GUILayout.Button("拓展按钮"))
{
}
//调用系统绘制方法
m_Editor.OnInspectorGUI();
// base.OnInspectorGUI();
}
}
三、组件不可编辑
unity中我们可以让组件处于不可编辑状态
1、单个组件禁止
这里我们将Transform原有组件禁止掉,但不影响上下两个拓展按钮
代码示例:
using UnityEngine;
using UnityEditor;
using System.Reflection;
[CustomEditor(typeof(Transform))]
public class Script_03_11 : Editor
{
private Editor m_Editor;
void OnEnable()
{
//Editor.CreateEditor 为 targetObject 或 targetObjects 创建自定义编辑器。
//Assembly.GetAssembly 获取在其中定义指定类型的当前加载的程序集。
m_Editor = Editor.CreateEditor(target, Assembly.GetAssembly(typeof(Editor)).GetType("UnityEditor.TransformInspector", true));
}
public override void OnInspectorGUI()//实现此函数以创建自定义检视面板。
{
if (GUILayout.Button("拓展按钮上"))
{
}
GUI.enabled = false;//设置组件禁用状态
m_Editor.OnInspectorGUI();//绘制原有信息 这代码里指position rotation scale这几栏
GUI.enabled = true;//启用
if (GUILayout.Button("拓展按钮下"))
{
}
}
}
多个组件禁止
我们可以拓展Hierarchy视图的菜单键,对选定对象同一禁止
代码示例:
using UnityEditor;
using UnityEngine;
public class Script_03_12
{
[MenuItem("GameObject/3D Object/Lock/Lock",false,0)]//路径
static void Lock()
{
if (Selection.gameObjects != null)//是否选定对象
{
foreach (var gameObject in Selection.gameObjects)//遍历对象
{
gameObject.GetComponent<Transform>().hideFlags = HideFlags.NotEditable;//单个组件不可编辑
//gameObject.hideFlags = HideFlags.NotEditable;//选定的物体所有组件不可编辑
}
}
}
[MenuItem("GameObject/3D Object/Lock/UnLock",false,0)]
static void UnLock()
{
if (Selection.gameObjects!=null)
{
foreach (var gameObject in Selection.gameObjects)
{
gameObject.hideFlags = HideFlags.None;
}
}
}
}
HideFlags可以使用按位或(|)同时保持多个属性
HideFlags.None:清除状态
HideFlags.DontSave: 设置对象不会保存(仅编辑模式下使用,运行时剔除掉)
HideFlags.DontSaveInBuild: 设置对象构建后不会被保存
HideFlags.DontSaveInEditor:设置对象编辑模式下不会被保存
HideFlags.DontUnloadUnusedAsset: 设置对象不会被 Resources.UnloadUnused-Assets()卸载无用资源时卸掉
HideFlags.HideAndDontSave: 设置对象隐藏,并且不会被保存
HideFlags.HideInInspector: 设置对象在控制面板视图中隐藏
HideFlags.NotEditable:设置对象不可被编辑
4、Context菜单拓展
选择组件鼠标右击可以弹出Context菜单,我们可以在原有的菜单上拓展出新的菜单栏
代码
using UnityEditor;
using UnityEngine;
public class Script_03_13
{
//context菜单/transform组件/拓展对象名
[MenuItem("CONTEXT/Transform/New Context 1")]//路径
static void NewContext1(MenuCommand command)
{
Debug.Log(command.context.name);//打印组件所属名字
}
[MenuItem("CONTEXT/Transform/New Context 2")]
static void NewContext2(MenuCommand command)
{
Debug.Log(command.context.name);
}
}
其中[MenuItem(“CONTEXT/Transform/New Context 1”)]表示菜单拓展在Transform组件上,如果想拓展到其他组件上,如摄像机,只需要将Transform改成Camera即可