四.场景视图拓展

新建两个文件夹Script,Editor,将我们的脚本都放在Script里,新建一个脚本ChangeObjInfor,再新建一个脚本SceneEditor

让SceneEditor继承Editor类,在这里,我们要使用Editor类,就必须把脚本放在Editor文件夹中,才能驱动这个脚本。

引用一下Editor的命名空间UnityEditor,我们需要在Scene场景中绘制一个UI,需要使用OnSceneUI的方法

private void OnSceneGUI()
    {
        Handles.BeginGUI();//开始绘制GUI
        GUILayout.BeginArea(new Rect(0, 0, 150, 200));//绘制GUI的显示区域
        GUILayout.Label("选择颜色");//添加文字提示
        if (GUILayout.Button("黄色"))//添加按钮
        {
            
        }
        GUILayout.EndArea();//结束区域
        Handles.EndGUI();//结束GUI
    }

自定义脚本

[CustomEditor(typeof(ChangeObjInfor))]

自定义完以后,我们得到脚本所挂载的物体目标

Target就是我们脚本所挂载的目标,是在Editor类里面

ChangeObjInfor theTarget = (ChangeObjInfor)target;

回到场景,我们新建一个Cube,然后把我们的ChangeObjInfor挂载到Cube上,就可以看到Scene场景中有了三个按钮,当我们点击的时候,就可以输出相应的Debug。

下面我们真正的修改一下cube的颜色,回到代码中,我们获取一下目标的材质

theTarget.GetComponent<Renderer>().sharedMaterial.color = Color.red;

我们也可以在场景中绘制一下Cube的坐标

参数;坐标 要显示的东西

Handles.Label(theTarget.transform.position, theTarget.name + ":" + theTarget.transform.position.ToString());

现在Scene就显示坐标了,当我们移动cube,坐标也会改变

五.自定义窗口

在Editor中新建一个脚本MyWindowEditor,继承EditorWindow,引用命名空间UnityEditor

首先我们在GameObject下绘制一个菜单按钮

[MenuItem("GameObject/ShowWindow")]

然后我们来绘制,在点击ShowWindow的时候弹出一个窗口

Rect theRect = new Rect(0, 0, 500, 500);//绘制窗口的大小和位置
        MyWindowEditor window =(MyWindowEditor) EditorWindow.GetWindowWithRect(typeof(MyWindowEditor), theRect, true, "我的窗口");
//绘制窗口,四个参数:类型,坐标和大小,bool值(控制窗口的类型,窗口有两种类型,一种是独立类型一种是选项卡类型,true是独立窗口),窗口名称。
        window.Show();//显示窗口

我们可以在窗口里面绘制我们需要的东西

绘制一个可以启用的分组

Unity编辑器列表控件详解 unity 编辑器拓展_编辑器

我们还可以在窗口里面打开系统自带的通知

绘制两个按钮

Unity编辑器列表控件详解 unity 编辑器拓展_自定义_02

我们可以再绘制一个关闭窗口的按钮

Unity编辑器列表控件详解 unity 编辑器拓展_编辑器_03

窗体里面常用的函数

private void OnFocus()
    {
        Debug.Log("窗口被选中");
    }
    private void OnLostFocus()
    {
        Debug.Log("窗口失去选中");
    }
    private void OnHierarchyChange()
    {
        Debug.Log("层次面板的对象发生改变");
    }
    private void OnProjectChange()
    {
        Debug.Log("项目面板的对象发生改变");
    }
    private void OnSelectionChange()
    {
        foreach (Transform item in Selection.transforms)
        
            {
            Debug.Log("被选中的物体是:" + item.name);
            }
    }
    private void OnDestroy()
    {
        Debug.Log("窗口被关闭了");
    }

六.其他扩展

我们在Script中添加一个脚本Test

1.想要实现,当我给一个物体添加Text脚本时,自动添加一个刚体组件

[RequireComponent(typeof(Rigidbody))]

我们这样添加的Rigidbody是不能删除了,防止了我们的误操作

如果我们想要挂载其他的组件也是一样的,只要在typeof里加入组件的名字

2.我们还可以把脚本当做组件来快速添加,可以把脚本放在Component里面

[AddComponentMenu("Script/Test")]

3.组件的右键操作

Unity编辑器列表控件详解 unity 编辑器拓展_编辑器_04

写一个方法,在方法上面添加

[ContextMenu("测试")]
    public void TestMenu()
    {

    }