SRPG游戏开发(三十三)第八章 游戏中的数据 - 三 为编辑器做准备(Editors Preparation)

本文介绍了在SRPG游戏开发中如何为编辑器做准备,包括编辑器资源、序列化物品子属性以及移动消耗的显示。通过创建自定义的PropertyDrawer,实现了在Unity中更方便地编辑和显示游戏数据,解决了Inspector面板性能问题和数据清晰度的问题。
摘要由CSDN通过智能技术生成

返回总目录

第八章 游戏中的数据(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

editor_srpg_data_inspector

  • 图 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 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值