第八章 游戏中的数据(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;
最终效果:
- 图 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>