Unity编辑扩展:功能篇之Json数据编辑器

本文详述如何在Unity中扩展编辑器功能,实现Json数据的编辑器,包括数据类结构设定、数据缓存初始化、序列化与反序列化、编辑器界面创建与功能实现。通过示例代码解析,讲解数据编辑工具的关键步骤,帮助开发者掌握Unity编辑器扩展技巧。
摘要由CSDN通过智能技术生成

请添加图片描述

前言

编辑器扩展算是比较纯粹的功能开发,基本没有什么理论知识,都是一些Unity相关接口的使用与数据类型的设计操作等。在本篇文章主要的文字描述基本都是在做代码解释,为了使内容接受度更高,我会尽量描述到代码结构中的每个细节。如果有对此不太了解又很感兴趣的小伙伴可以尝试手动过一遍代码,相信很快很快就可以掌握编辑器开发方面的使用技巧

在前篇文章中有对编辑器扩展UI控件方面的一些基础内容做了简单的描述,大概说明了Unity编辑器界面相关控件的创建接口,链接为:

Unity编辑器扩展 UI控件篇

在掌握编辑器界面控件使用的基础上,利用该控件完成数据编辑工具,对于编辑器扩展来说,通常来说都是以数据编辑为基础的功能扩展。而数据的存储通常以Json为媒介来记录信息,掌握了Json数据的编辑后,可以很方便的在此基础上扩展自己的功能逻辑

一、 设定数据类结构

通常来说,功能模块使用数据的结构通常以类为基本单位。在本数据编辑工具开发案例中,需要先设定几个数据类,作为数据转换的基础

在文章开头的动图中,核心数据块的结构如下,排序数值字段与唯一标识身份ID,除此之外就是一些功能性数据。在本案例中设定了一些字符串与枚举类型的数据字段

在这里插入图片描述
为提升通用性,封装排序数值字段与唯一标识身份IDBaseData作为数据类的基类,基于其特性直接设定两个Int数据值类型即可。而后续所有需编辑数据类作为BaseData的派生类设定。如下面代码中的CharacterData,在继承基类的基础上设定自身需编辑器的核心数据字段,这里简单的设计了字符串与枚举等几个数据,该数据类的数据内容与上图中的UI节点相对应,后面提到的数据节点代指该类


public class BaseData
{
   
    /// 编辑器状态下排序
    public int SortNum;
    /// 唯一ID
    public int ID;
}

public class CharacterData : BaseData
{
   
    public string name;
    public CharacterType type;
    public DetialCharacterData detialData;
}

public class MainData
{
   
    public Dictionary<string, CharacterData> CharacterDatas;
}

除了需要编辑的数据类外,编辑器本身也需要设定缓存一组数据来维护界面显示的相关格式,如节点的位置、节点被选中的状态等状态。创建数据类命名为EditorNodeData,并代称节点编辑器数据,而关于类中相关字段的具体使用方式会在后面数据初始化时提到:

public class EditorNodeData 
{
   
    public int sortNum;
    public int DataID = 0;
    public bool isInstace;
    public bool isSelect;
    public Rect rect;
}
二、将缓存数据初始化

开始编辑器界面绘制前,定义一些数据字段作为临时缓存使用, 并对数据做初始化:

  • mainDataMainData 类型数据,用来管理由Json反序列化数据与序列化为Json数据,即Json数据编辑时的内存缓存数据载体
  • selectNode:记录选中节点的节点编辑器数据
  • editorNodes:所有节点编辑器数据
  • canvasScrollPosition:用于背景拖动的坐标缓存数据

在初始化数据时,除了对各种数据容器实例化外,比较重要的是读取Json内容并反序列化到mainData,用来载入上次编辑后的保存的节点数据内容,具体的反序列化过程会在后面的内容中提到

    private MainData mainData;
    private Rect viewRect;
    private Vector2 canvasScrollPosition;
    private EditorNodeData selectNode;
    private Dictionary<int, EditorNodeData> editorNodes;
    void InitData()
    {
   
        mainData = JsonToMainData();
        if(mainData == null) mainData = new MainData();
        if (mainData.CharacterData == null) mainData.CharacterData = new Dictionary<string, CharacterData>();
        editorNodes = new Dictionary<int, EditorNodeData>();
        viewRect = new Rect(0, 0, position.width, position.height);
        canvasScrollPosition = new Vector2(0, 0);
        InitNodasData();
    }
    

完成对mainData的反序列化后,通过对数据节点编辑初始化编辑器界面对应的数据对象。具体到细节中,对排序字段与ID字段来说,字节读取mainData数据即可。同时由于反序列化而来的数据已存在实体,默认设定isInstancetrue。最为关键的编辑器辅助数据就是rect矩形定位字段,用来确定当前数据具象化的UI节点在场景中的位置

    public void InitNodasData()
    {
   
        if (mainData == null) return;
        foreach (var data in mainData.CharacterDatas.Values)
        {
   
            EditorNodeData node = new EditorNodeData();
            node.sortNum = data.SortNum;
            node.DataID = data.ID;
            node.rect = new Rect(20 + node.sortNum * 250, 80, 230, 160);
            node.isInstance = true;
            if (250 + node.sortNum * 250 > viewRect.width) 
            {
   
                viewRect.width += 250;
            }
            editorNodes.Add(node.sortNum, node);
        }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之凌儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值