27.Scene窗口拓展-Handles-Handles是什么及响应函数
27.1 知识点
Handles公共类的作用
Handles类提供了很多API,让我们可以在Scene窗口中绘制我们的自定义内容。它和GUI、EditorGUI类似,只不过它专门提供给Scene窗口使用。
想要在Scene窗口中显示自定义内容,我们需要在对应的响应函数中进行处理。
Scene窗口更新响应函数
关键点:
前两个步骤和自定义Inspector窗口显示内容一致:
单独为某一个脚本实现一个自定义脚本,并且脚本需要继承Editor,一般该脚本命名为自定义脚本名 + Editor。
在该脚本前加上特性,命名空间:UnityEditor,特性名:CustomEditor(想要自定义脚本类名的Type)。
在该脚本中实现void OnSceneGUI()方法,该方法会在我们选中挂载自定义脚本的对象时自动更新。注意:只有选中时才会执行,没有选中不执行。
声明自定义脚本
public class TestSceneMono : MonoBehaviour
{
}
声明继承Editor的编辑器脚本,加上特性并实现OnSceneGUI方法
[CustomEditor(typeof(TestSceneMono))]
public class TestSceneMonoEditor : Editor
{
private void OnSceneGUI()
{
// 选中挂载TestSceneMono的对象会打印
Debug.Log("Scene窗口拓展相关逻辑");
}
}
自定义窗口中监听Scene窗口更新响应函数
可以在自定义窗口显示时
监听更新事件:SceneView.duringSceneGui += 事件函数
窗口隐藏或销毁时移除事件:SceneView.duringSceneGui -= 事件函数
using UnityEditor;
using UnityEngine;
public class TestSceneMonoWindow : EditorWindow
{
[MenuItem("编辑器拓展教程/TestSceneMonoWindow")]
private static void OpenTestSceneMonoWindow()
{
TestSceneMonoWindow win = EditorWindow.GetWindow<TestSceneMonoWindow>();
win.Show();
}
private void OnEnable()
{
SceneView.duringSceneGui += SceneUpdate;
}
private void OnDestroy()
{
SceneView.duringSceneGui -= SceneUpdate;
}
private void SceneUpdate(SceneView view)
{
// 当打开窗口且场景视图存在任何更新会打印
Debug.Log("自定义窗口拓展Scene相关内容");
}
}
总结
Scene窗口拓展功能主要是提供给自定义脚本和自定义窗口的。我们采用对应的规则进行处理,便可以在之后的教程中利用场景更新响应函数来自定义一些Scene窗口的显示内容。
27.2 知识点代码
Lesson27_Scene窗口拓展_Handles_Handles是什么及响应函数
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson27_Scene窗口拓展_Handles_Handles是什么及响应函数 : MonoBehaviour
{
void Start()
{
#region 知识点一 Handles公共类的作用
//Handles类提供了很多API
//让我们可以在Scene窗口中绘制我们的自定义内容
//它和GUI、EditorGUI类似,只不过它专门提供给Scene窗口使用
//想要在Scene窗口中显示自定义内容
//我们需要在对应的响应函数中进行处理
#endregion
#region 知识点二 Scene窗口更新响应函数
//关键点:
//前两个步骤 和自定义Inspector窗口显示内容 一致
//1.单独为某一个脚本实现一个自定义脚本,并且脚本需要继承Editor
// 一般该脚本命名为 自定义脚本名 + Editor
//2.在该脚本前加上特性
// 命名空间:UnityEditor
// 特性名:CustomEditor(想要自定义脚本类名的Type)
//3.在该脚本中实现void OnSceneGUI()方法
// 该方法会在我们选中挂载自定义脚本的对象时自动更新
// 注意:只有选中时才会执行,没有选中不执行
#endregion
#region 知识点三 自定义窗口中监听Scene窗口更新响应函数
//可以在自定义窗口显示时
//监听更新事件
//SceneView.duringSceneGui += 事件函数
//窗口隐藏或销毁时移除事件
//SceneView.duringSceneGui -= 事件函数
#endregion
#region 总结
//Scene窗口拓展功能
//主要是提供给自定义脚本和自定义窗口的
//我们采用对应的规则进行处理
//便可以在之后的教程中利用场景更新响应函数来自定义一些Scene窗口的显示内容
#endregion
}
}
TestSceneMonoWindow
using UnityEditor;
using UnityEngine;
public class TestSceneMonoWindow:EditorWindow
{
[MenuItem("编辑器拓展教程/TestSceneMonoWindow")]
private static void OpenTestSceneMonoWindow()
{
TestSceneMonoWindow win = EditorWindow.GetWindow<TestSceneMonoWindow>();
win.Show();
}
private void OnEnable()
{
SceneView.duringSceneGui += SceneUpdate;
}
private void OnDestroy()
{
SceneView.duringSceneGui -= SceneUpdate;
}
private void SceneUpdate(SceneView view)
{
//当打开窗口且场景视图存在任何更新会打印
Debug.Log("自定义窗口拓展Scene相关内容");
}
}
TestSceneMono
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestSceneMono : MonoBehaviour
{
}
TestSceneMonoEditor
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(TestSceneMono))]
public class TestSceneMonoEditor : Editor
{
private void OnSceneGUI()
{
//选中挂载TestSceneMono的对象会打印
Debug.Log("Scene窗口拓展相关逻辑");
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com