冀苍鸾 发表于 2021-3-2 10:11

使用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>("Assets/Editor/AssetEdior/ItemEditor.uxml");
            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>("Assets/Editor/AssetEdior/ItemEditor.uss");
            root.styleSheets.Add(styleSheet);

    }

    public override VisualElement CreateInspectorGUI()
    {
      return root;
    }
}在OnEnable中,加载样式文件、UXML文件,在CreateInspectorGUI中,可以对按钮、字段等控件添加侦听事件。通过target字段,获取ScriptableObject实例。
获取控件并设置事件

如同HTML的Query,通过root.Q<Toggle>("NAME")查找对应名称的控件,并可以修改值,样式等。
root.Q<Toggle>("NAME").RegisterValueChangedCallback(cb =>
      {
            MYDATA.SOME_VALUE = cb.newValue;
            EditorUtility.SetDirty(MYDATA);
      });如上,当控件值改变时,便会触发这个事件。记得将这个物体设为脏物体,暗示编辑器要保存。
控件样式

通过UI Builder可以轻松查看控件的样式,可视化的编辑面板。总体来说和HTML、CSS十分相像。
这两天写的简单Tile编辑面板如下,最新版本的UI Toolkit似乎不能显示中文,比较头疼。是个bug。
页: [1]
查看完整版本: 使用UI Toolkit和Scriptable Object开发Unity编辑器插件