战棋战略制作组

创建于:2022-06-27

创建人: mioku

16 信息 15 成员
海量的小元素汇聚成巨大的历史流向,一只蝴蝶扇动翅膀。在庞大的世界框架中纵横捭阖,与偶然的随机性和必然的历史对抗,这就是大战略的魅力!

[策略][战棋]武器系统与新的数据导入功能!基于兴趣开发的策略战棋游戏的开发日志~ 七

mioku 2022-11-05

        大家好啊!好久没有写日志了,在前端时间基本完成移动功能以后,攻击相关的机制就谈上日程了。我没想到是,在此之前有大量的单位属性相关的内容需要敲定。所以这两周基本没有什么可以直观展示的新内容,本期就介绍一下已经大概策划好的装备系统与新的数据导入功能吧!

       在原来的制作过程中,玩家在招募时,直接选择某个单位,花费资金就能招募。现在则是为单位加入了装备选择的功能,玩家选择的兵源决定了单位的基础护甲以及体能能基础属性,装备则会给予兵员自己的特殊优势。

装备系统:在招募单位时,现在需要为单位选择一套装备,不同的装备会在很大程度上影响单位的职能。装备分为武器、盾牌和马匹(骑兵使用),一下将会一一介绍:

    武器:单位的武器决定了单位的基础攻击能力,以及对付某些敌人的专长(比如反骑兵,重甲敌人等等),大概会分为剑、斧、矛、长柄刀、战锤、弓、弩等等。

    盾牌:如果单位使用的武器只需要单手就能操作,那么也可以再佩戴一面盾牌,盾牌会有对面向敌人方向的防御加成。

    马匹:如果选择了马匹,单位就会以骑兵姿态进入战场,其移动力会大幅提升,但是单位的护甲会取兵员与马匹的平均值,贵族老爷记得骑一匹好马哦!


        这么多新的数值表格,当然也需要导入到系统内,在之前的日志中我介绍过将csv数据文件导入到Unity编辑器内,存储为ScriptObject资源文件。随着数据量的变大,以及在修改单位的数值策划时,原来将csv文件当字符串处理的粗暴方法修改起来十分麻烦。于是我索性写了一版新的数据导入功能。

        现在,数据文件由csv改为xslx类型,也就是Excel表格啦。我随便搜了搜,用了名为EPPLUS的一个插件来读取xslx文件,然后就大概介绍一下处理数据的函数吧。

/// <summary>
    /// 通过键值对生成asset
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fieldsPairValue">列名Pair值</param>
    /// <param name="assetPath">存储路径</param>
    /// <returns></returns>
    public static T GenerateScriptableObject<T>(Dictionary<string,string> fieldsPairValue,string assetPath) where T :  ScriptableObject
    {
        //根据Name来找到实体
        T obj = AssetDatabase.LoadAssetAtPath(assetPath + fieldsPairValue["Name"] + ".asset", typeof(T)) as T;
        bool isExist = (obj != null);
        if (obj == null) obj = ScriptableObject.CreateInstance<T>();

        try
        {
            //遍历键值对 通过反射将值写入对应的字段
            foreach (var field in fieldsPairValue.Keys)
            {
                var fieldType = obj.GetType().GetField(field)?.FieldType;
                if (fieldType == null) 
                {
                    Debug.LogWarning($"资源'{obj.GetType()}'不包含'{field}'字段!");
                    continue;
                }
                //字段可能为处理枚举类型
                if ( fieldType.IsEnum)
                {
                    obj.GetType().GetField(field).SetValue(obj, System.Enum.Parse(fieldType, fieldsPairValue[field]));
                }
                else 
                {
                    obj.GetType().GetField(field).SetValue(obj, Convert.ChangeType(fieldsPairValue[field], fieldType));
                }
            }
        }
        catch (System.Exception e)
        {
            Debug.LogError($"使用Excel生成失败,错误内容:{e.Message}");
        }
        //如果生成的实体在本地文件中不存在,就创建对应的实体文件
        if (!isExist)
        {
            AssetDatabase.CreateAsset(obj, WeaponAssetPath + fieldsPairValue["Name"] + ".asset");
            return obj;
        }
        //应用修改
        EditorUtility.SetDirty(obj);
        AssetDatabase.SaveAssets();
        return obj;
    }

可以通过读取表格文件的一行数据与表格的列名拼成一个键值对(列名需要与对应类的字段名相同),来调用这个函数。

由于是通过反射实现的,列之间顺序变化也一样可以使用,同时还支持写入枚举类型的值,这个函数很好的满足了我现在需要导入的数据的功能,我个人觉得这个函数功能还是相当方便的,写好的时候得意了一阵嘿嘿。不过其实本身没有什么复杂的逻辑,欢迎提一些实现逻辑的建议。

需要一提的是,生成的资源文件名是取决于传入的“Name”键字段,不同的命名需求可以修改。

最后体现在编辑器里,就是这样:

Image title

Image title

Image title


以上就是本次日志的内容啦,最近的开发内容集中在,底层的一些数据修改,以及策划大量的装备数据,真是相当的乏味呐!接下来还有伤害计算和数值平衡性要考虑,真是想想就头大。如此乏味的内容,感谢您能看到这里!

如果对这个项目有兴趣,或者有什么建议的话,欢迎联系我哦! QQ:2763686216


(转发自:原日志地址
 
lemon 2022-11-07

那么矛是属于双手武器还是单手

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册