第八章 游戏中的数据(Data in Game)
在之前的章节中,我们进行地图对象的生成,移动等操作。
这一章本来可以进行战斗的编写,不过数据缺失是一个问题。
所以这一章我们先来建立一些数据,以及如何编辑它们,是否需要生成配置文件等。
文章目录
三 为编辑器做准备(Editors Preparation)
属性编辑器的方式有很多种,由于这不是重点,所以我们选择方式是ScriptableObject
,这在Unity中就能完成,不用再去寻找其它第三方工具。你可以直接使用它当成保存媒介,也可以保存成xml或文本文件。我选择保存成文件,而它将做为编辑器使用。
所以接下来的工作建立的文件,将全部放入Editor
文件夹下。
1 编辑器资源(Editor Asset)
我们的方法是使用ScriptableObject
来编辑我们的数据,这看起来很简单,直接写入属性就可以了 (当然,你要把它们的文件放在Editor
文件夹下) 。
新建文件EditorSrpgData.cs
并写入我们需要编辑的属性:
#if UNITY_EDITOR
using UnityEngine;
namespace DR.Book.SRPG_Dev.Models
{
[CreateAssetMenu(fileName = "EditorSrpgData.asset", menuName = "SRPG/Editor SRPG Data")]
public class EditorSrpgData : ScriptableObject
{
[SerializeField]
public MoveConsumptionInfoConfig moveConsumptionConfig;
[SerializeField]
public ClassInfoConfig classConfig;
[SerializeField]
public CharacterInfoConfig characterInfoConfig;
[SerializeField]
public ItemInfoConfig itemInfoConfig;
[SerializeField]
public TextInfoConfig textInfoConfig;
}
}
#endif
- 图 8.2 EditorSrpgData Inspector
但我们应该发现这样有许多问题,典型的是:
-
在
ItemInfoConfig
中的ItemInfo
里,uniqueInfo
不会被序列化; -
在
MoveConsumptionInfoConfig
中的MoveConsumptionInfo
里,这些属性有固定的数量; -
在Inspector面板中如果数据有上千上万条时(主要发生在物品与文本上),就算只是查看列表,而不展开属性也会非常的卡,甚至未响应。
以上就是举了几个例子,我们应该能够更好的编辑它们。
2 序列化物品子属性(Serialize Item Unique Info)
当你将ItemInfo
加入到一个MonoBehaviour
或者ScriptableObject
中时,应该注意到属性uniqueInfo
不会被Unity序列化,更别提是按照itemType
的类型序列化了。这不太友好,所以我们用额外属性来使它可以被序列化,这还需要让ItemInfo
继承ISerializationCallbackReceiver
。
添加可序列化的额外属性:
#if UNITY_EDITOR
[Serializable]
public class EditorUniqueInfoCollection
{
public WeaponUniqueInfo weaponUniqueInfo = new WeaponUniqueInfo();
public OrnamentUniqueInfo ornamentUniqueInfo = new OrnamentUniqueInfo();
public ConsumableUniqueInfo consumableUniqueInfo = new ConsumableUniqueInfo();
public UniqueInfo this[ItemType itemType]
{
get
{
switch (itemType)
{
case ItemType.Weapon:
return weaponUniqueInfo;
case ItemType.Ornament:
return ornamentUniqueInfo;
case ItemType.Consumable:
return consumableUniqueInfo;
}
return null;
}
set
{
if (value == null)
{
return;
}
Type type = value.GetType();
if (type == typeof(UniqueInfo))
{
return;
}
if (type == typeof(WeaponUniqueInfo))
{
weaponUniqueInfo = value