SRPG游戏开发(三十四)第八章 游戏中的数据 - 四 数据编辑器(Data Editor)

本文介绍如何在SRPG游戏开发中创建数据编辑器,包括编辑器窗口的创建、选择数据、功能接口实现如保存加载XML/Txt文件,以及绘制主函数和按钮功能。通过数据编辑器,可以有效地管理和编辑游戏数据,避免渲染卡顿问题。
摘要由CSDN通过智能技术生成

返回总目录

第八章 游戏中的数据(Data in Game)

在之前的章节中,我们进行地图对象的生成,移动等操作。

这一章本来可以进行战斗的编写,不过数据缺失是一个问题。

所以这一章我们先来建立一些数据,以及如何编辑它们,是否需要生成配置文件等。



四 数据编辑器(Data Editor)

我们将进行一个EditorWindow的编写,并将数据显示在上面。

要解决的主要问题是显示的数量(上一节中提过的,如果数量过多,会造成渲染卡顿)。

除了上一节内容,我没有进行更详细的编辑,你可以对每个数据文件都进行PropertyDrawer的编写。


1 创建编辑器窗口(Create Editor Window)

我们先来创建一个最基本的窗口(EditorSrpgDataEditorWindow.cs):

namespace DR.Book.SRPG_Dev.Models
{
   
    public class EditorSrpgDataEditorWindow : EditorWindow
    {
   
        private static EditorSrpgDataEditorWindow s_Window;
        public static EditorSrpgDataEditorWindow OpenEditorSrpgDataEditorWindow()
        {
   
            if (s_Window != null)
            {
   
                s_Window.Focus();
                return s_Window;
            }
            s_Window = EditorWindow.GetWindow<EditorSrpgDataEditorWindow>(false, "SRPG Data");
            s_Window.minSize = new Vector2(480, 480);
            s_Window.Show();
            return s_Window;
        }

        private EditorSrpgData m_SrpgData;
        private SerializedObject m_SerializedObject;

        public EditorSrpgData srpgData
        {
   
            get {
    return m_SrpgData; }
            set
            {
   
                if (m_SrpgData == value)
                {
   
                    return;
                }
                m_SrpgData = value;

                // 删除以前的
                if (m_SerializedObject != null)
                {
   
                    m_SerializedObject.Dispose();
                    m_SerializedObject = null;
                }

                // 重新建立
                if (m_SrpgData != null)
                {
   
                    m_SerializedObject = new SerializedObject(m_SrpgData);
                }
            }
        }

        private void OnDestroy()
        {
   
            this.srpgData = null;
            s_Window = null;
        }

        // TODO 其它需要添加的
    }
}

你会看到我没有使用[MenuItem("Window/SRPG/SRPG Data Editor")],因为我不打算在菜单中打开它。

1.1 打开窗口(Open Editor Window)

将打开窗口和资源放在一起,建立文件EditorSrpgDataEditor.cs

using UnityEngine;
using UnityEditor;

namespace DR.Book.SRPG_Dev.Models
{
   
    [CustomEditor(typeof(EditorSrpgData))]
    public class EditorSrpgDataEditor : Editor
    {
   
        #region Property
        public EditorSrpgData srpgData
        {
   
            get {
    return target as EditorSrpgData; }
        }
        #endregion

        #region Unity Callback
        public override void OnInspectorGUI()
        {
   
            EditorGUI.BeginDisabledGroup(true);
            base.OnInspectorGUI();
            EditorGUI.EndDisabledGroup();

            if (GUILayout.Button("Edit Datas"))
            {
   
                EditorSrpgDataEditorWindow window = EditorSrpgDataEditorWindow.OpenEditorSrpgDataEditorWindow();
                window.srpgData = srpgData;
            }
        }
        #endregion
    }
}

1.2 选择数据(Select Data)

在窗口中不要全部渲染,最好可按文件选择我们的数据。

EditorSrpgData中添加属性:

        public enum ConfigType
        {
   
            MoveConsumption,
            Class,
            Character,
            Item,
            Text
        }

        [SerializeField]
        public ConfigType currentConfig = ConfigType.MoveConsumption;

最终效果:

EditorSrpgData Inspector

  • 图 8.9 EditorSrpgData Inspector

2 功能接口(IEditorConfigSerializer.cs)

我们的编辑器至少具有的功能:

  • 编辑数据;

  • 保存配置文件;

  • 读取配置文件。

除了这些功能外,最好还能排序(根据key),还要能检测是否有重复的key

建立文件IEditorConfigSerializer.cs

using System;

namespace DR.Book.SRPG_Dev.Models
{
   
    public interface IEditorConfigSerializer
    {
   
        Array EditorGetKeys();
        void EditorSortDatas();
        byte[] EditorSerializeToBytes();
        void EditorDeserializeToObject(byte[] bytes);
    }
}

有了接口,我们在EditorSrpgData.cs中加入方法:

        public IEditorConfigSerializer GetCurConfig()
        {
   
            switch (currentConfig)
            {
   
                case ConfigType.MoveConsumption:
                    return moveConsumptionConfig;
                case ConfigType.Class:
                    return classConfig;
                case ConfigType.Character:
                    return characterInfoConfig;
                case ConfigType.Item:
                    return itemInfoConfig;
                case ConfigType.Text:
                    return textInfoConfig;
                default:
                    return null;
            }
        }

同时我们让所有配置文件都继承这个接口:

    [Serializable]
    public abstract class BaseXmlConfig<TKey, TData> 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值