使用UI Toolkit和Scriptable Object开发Unity编辑器插件
配置文件,是每个游戏必不可缺的东西。可以用JSON,YAML等文件表达,但修改它们需要修改文本文件,并不友好。因此,我们可以使用Scriptable Object制作结构化的不可变的游戏配置文件,和Unity编辑器集成在一起,所见即所得的操纵数据。虽然Scriptable Object也是通过Yaml序列化到硬盘的,但通过Unity独有的流程,可以直接在Scriptable Object中储存其他文件的引用。
使用新的编辑器框架——UI Toolket(UI Elements),我们可以以前端的方式快速编写美观的编辑器插件了,不需要其他插件的支持。我们可以为一种类型的Scriptable Object指定一个编辑器,只需要选中那个文件,就可以使用对应的编辑器进行编辑。
创建基本数据的Scriptable Object
这步声明数据的储存格式,只需要新建一个类,继承自ScriptableObject即可。再给这个类加上Attribute,例如,就可以在右键菜单中方便的创建了。
创建对应的编辑器
我们想给这个数据一个独特的编辑器,而不是仅仅只是通过Unity查看数据本身,因此需要创建一个UI Toolkit编辑器。
右键,Asset/UI Toolkit/Editor Window,自动创建三个文件。因为我们需要的是编辑器,而不是编辑器窗口,因此将.cs的基类修改为Editor。并加上Attribute:。
基本结构如下:
public class ItemEditor : Editor
{
ItemTile self;
VisualElement root;
public void OnEnable()
{
// Each editor window contains a root VisualElement object
root = new VisualElement();
self = (ItemTile)target;
// Import UXML
var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(&#34;Assets/Editor/AssetEdior/ItemEditor.uxml&#34;);
VisualElement labelFromUXML = visualTree.Instantiate();
root.Add(labelFromUXML);
// A stylesheet can be added to a VisualElement.
// The style will be applied to the VisualElement and all of its children.
var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>(&#34;Assets/Editor/AssetEdior/ItemEditor.uss&#34;);
root.styleSheets.Add(styleSheet);
}
public override VisualElement CreateInspectorGUI()
{
return root;
}
}在OnEnable中,加载样式文件、UXML文件,在CreateInspectorGUI中,可以对按钮、字段等控件添加侦听事件。通过target字段,获取ScriptableObject实例。
获取控件并设置事件
如同HTML的Query,通过root.Q<Toggle>(&#34;NAME&#34;)查找对应名称的控件,并可以修改值,样式等。
root.Q<Toggle>(&#34;NAME&#34;).RegisterValueChangedCallback(cb =>
{
MYDATA.SOME_VALUE = cb.newValue;
EditorUtility.SetDirty(MYDATA);
});如上,当控件值改变时,便会触发这个事件。记得将这个物体设为脏物体,暗示编辑器要保存。
控件样式
通过UI Builder可以轻松查看控件的样式,可视化的编辑面板。总体来说和HTML、CSS十分相像。
这两天写的简单Tile编辑面板如下,最新版本的UI Toolkit似乎不能显示中文,比较头疼。是个bug。
页:
[1]