最近开始做自己的游戏啦。
然后开发游戏需要的工具,之前一直都是用现成的轮子,现在决定自己也写点小工具好了。
在搭建原型关卡的过程中,发现要把不同文件夹中的预制体拖拽到场景,此过程中需要大量的时间去切换不同的预制体文件夹,也不能把所有的预制体都集中放一起。
想了一下就用最简单的方法去解决吧,所以决定做一个如标题所示的功能:把我需要的预制体放到我自定义的窗口里,然后直接从这个自定义的窗口中去拖拽预制体。
为了完成这个功能,我们差不多需要以下几个步骤。
首先是创建继承了EditorWindow的脚本,下面的代码可以帮助我们实现一个自定义窗口:
[MenuItem("Tools/EditorWindows/ PropsPrefabEditorWindow ")]
private static void ShowWindow()
{
GetWindow<PropsPrefabEditorWindow>(" PropsPrefabEditorWindow ");
}
然后我们需要获取要实例化到场景中的预制体:
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(propsPath + "/" + name + stringPrefab);
//propsPath是预制体的路径,stringPrefab是.prefab后缀
接着是我们需要让预制体显示在窗口上,为了实现这个功能,我们首先需要获得预制体的缩略图,用以下的语句就可以实现:
Texture2D thumbnail = AssetPreview.GetAssetPreview(prefab);
把获取到的缩略图“画”到自定义的窗口上,这里就使用unity的UIElemt方案来画,需要在脚本开头使用它的命名空间:
using UnityEngine.UIElements;
...
...
...
var box = new Box();
box.style.width = 70;
box.style.height = 70;
这样一个70X70的盒子就画好了,我们再让这个盒子的背景图变成我们上面获取到的缩略图:
box.style.backgroundImage = thumbnail;
有了box,我们还需要给它加上拖拽相关的回调方法:
box.RegisterCallback<MouseDownEvent>(evt =>
{
DragAndDrop.PrepareStartDrag();
DragAndDrop.StartDrag("Dragging");
DragAndDrop.objectReferences = new Object[] { prefab };
});
box.RegisterCallback<DragUpdatedEvent>(evt =>
{
DragAndDrop.visualMode = DragAndDropVisualMode.Move;
});
最后别忘记把box添加到rootVisualElement中,否则它将不会出现在窗口上:
rootVisualElement.Add(box);
最终效果如图所示
新创建的几个窗口都放在scene窗口的左边了,是不是非常简单呢?