四.场景视图拓展
新建两个文件夹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();//显示窗口
我们可以在窗口里面绘制我们需要的东西
绘制一个可以启用的分组
我们还可以在窗口里面打开系统自带的通知
绘制两个按钮
我们可以再绘制一个关闭窗口的按钮
窗体里面常用的函数
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.组件的右键操作
写一个方法,在方法上面添加
[ContextMenu("测试")]
public void TestMenu()
{
}