引子
最近在做一个有关序列帧的东西,如图,就是这种,我需要给他分解成 向前向后向左向右四种方向的动作组,(之后还会有攻击防御等–)。
功能上很简单,就是把图片的SpriteMode改成multiple把图片切分成小图,然后分组按照序列帧播放。
之后写一个脚本,把要按照序列播放的子sprite分别拖入对应的数组即可
但是产生了个问题,当我想预览某一组动画的时候,我只能启动游戏去用代码或者游戏功能来观看这个序列帧播放,我在想如果能不用启动游戏就能直接预览这些序列帧会方便很多,就像Spine那样,点击哪个动画下边就可以播放哪个
于是便开始写编辑器!
实现大体思路
经过所搜,下边的这个预览窗口,即Unity的Preview窗口是可以在Editor类里进行自定义拓展的,他是一个独立的空间,既不属于Scene空间,也不属于Prefab编辑器空间,而是一个独立的空间。想要在这里显示一个东西,需要在这个空间里新建物体,然后新建摄像机,对准物体渲染,然后把得到的图片取出。经过摸索,大体步骤如下
1.建立一个Editor空间下的类(要继承Editor类) ,和普通拓展编辑器一样使用[CustomEditor(typeof(XXXX))]关联到你的功能类。
2.在编辑器类里声明一个PreviewRenderUtility对象,以下简称Utlity。
3.新建你想要显示的物体,并且用Utility.AddSingleGO()方法把他加入空间,也要把Utility的camera对准你的物体。
4.复写OnInteractivePreviewGUI方法,使用Utility的BeginPreview()和EndPreview()包裹住中间你想做的显示操作EndPreview()会返回一张图片。
5.最后用GUI.DrawTexture()显示这张图片。
细节要点1:OnInteractivePreviewGUI() 和 OnPreviewGUI()
如名字所描述的一样,这两个函数都是绘制这个PreviewGUI的函数,OnInteractivePreviewGUI()就是可以允许用户进行交互的那种,比如滑动鼠标滚轮进行缩放,拖拽物体旋转,等等,一般3d模型展示常有这种效果,如果是有这样的需求的话,那么就必须使用OnInteractivePreviewGUI()来进行复写,如果是只是静态显示一些信息,那么用OnPreviewGUI就够了
细节要点2: 要开启HasPreviewGUI()
这个也是自己踩过的坑,一开始窗口上怎么都啥也没有,后来参考spine的源码发现了要把这个开启,这样才行
public override bool HasPreviewGUI()
{
return true;
}
细节要点3 :物体新建之后要AddSingleGO()
如代码所示,新建的物体,(我这里就是一个SpriteRender)要作为参数使用这个方法,我所理解的就是这样就把他加入到这个Preview空间里去了。
void Init()
{
if(mPreviewRenderUtility == null)
{
mPreviewRenderUtility = new PreviewRenderUtility(true);
Camera c = mPreviewRenderUtility.camera;
c.orthographic = true;
c.cullingMask = PreviewCameraCullingMask;
c.nearClipPlane = 0.01f;
c.farClipPlane = 1000f;
c.transform.LookAt(Vector3.zero);
c.transform.position = new Vector3(0, 0, -10f);
mPreviewCam = c;
DestroyPreviewGameObject();
}
if(mPreviewGo == null)
{
mPreviewGo = new GameObject("Pre", typeof(SpriteRenderer))
{
layer = PreviewLayer,
hideFlags = HideFlags.HideAnd