跳转至专题目录
专题推荐文章:
- 温故知新——RectTransform成员属性的再认识
- unity Scene View扩展之编辑器扩展总结
- Unity获取鼠标点击ui GameObject
本系列目录
- unity编辑器扩展之SceneUI——贴在Scene View的SceneCanvas
- unity Scene View扩展之屏蔽对Scene的所有操作
- unity Scene View扩展之显示常驻GUI
- unity Scene View扩展之显示网格
- unity Scene View扩展之加载Assets文件夹外的资源
- unity Scene View扩展之编辑器扩展总结
最近一段时间都在搞编辑器,扩展各种功能,如添加Inspector上的Add Component回调功能,Unity Package 一键更新功能, 还有现在的Scene扩展,也算小有心得了,出来总结一下。
一、不运行时也可以运行的类
比较特殊的类,比如说Editor,EditorWindow,ScriptableObject,AssetPostprocessor等特殊一点的就不说了,网上一抓一大把介绍的,主要讲讲两个重要特性ExecuteInEditMode和InitializeOnLoad。
1、ExecuteInEditMode
// ExecuteInEditMode主要是让MonoBehaviour可以在不运行时,也可以执行各个生命周期的特性
// 可以配合Mono单例使用
// 需要把组件拖到GameObject上才能执行
[ExecuteInEditMode]
public class PackageManager : MonoBehaviour
{
// 其中值得介绍的是OnEnable和OnDisable
// 因为改了代码之后会将数据清零,而且不会执行Awake和Start
// 但是会在编译前执行OnDisable,编译后会执行OnEnable
// 可以用这一个时机,对一些委托的绑定与解绑,或者数据的初始化和销毁
// 当然正常的SetActive也会触发这两个时机
void OnEnable()
{
}
void OnDisable()
{
}
}
2、InitializeOnLoad
// InitializeOnLoad主要是让一个普通类可以在编辑器下初始化
// 个人认为虽然可以用Mono调用单例也可以达到相同效果,不过有些时候并不需要创建一个GameObject
// 所以直接定义一个这么的类就好了
[InitializeOnLoad]
public static class EditorTiming
{
// 构造函数可以在编辑器打开,或者编译后执行,放心地把Init或者Reset放在这里
static EditorTiming()
{
}
}
3、单例模式
单例模式没什么好说的,无论时普通的Singleton<T>,还是MonoSingleton<T>,都可以在网上找到,这