[策略][战棋]武器系统与新的数据导入功能!基于兴趣开发的策略战棋游戏的开发日志~ 七
大家好啊!好久没有写日志了,在前端时间基本完成移动功能以后,攻击相关的机制就谈上日程了。我没想到是,在此之前有大量的单位属性相关的内容需要敲定。所以这两周基本没有什么可以直观展示的新内容,本期就介绍一下已经大概策划好的装备系统与新的数据导入功能吧!
在原来的制作过程中,玩家在招募时,直接选择某个单位,花费资金就能招募。现在则是为单位加入了装备选择的功能,玩家选择的兵源决定了单位的基础护甲以及体能能基础属性,装备则会给予兵员自己的特殊优势。
装备系统:在招募单位时,现在需要为单位选择一套装备,不同的装备会在很大程度上影响单位的职能。装备分为武器、盾牌和马匹(骑兵使用),一下将会一一介绍:
武器:单位的武器决定了单位的基础攻击能力,以及对付某些敌人的专长(比如反骑兵,重甲敌人等等),大概会分为剑、斧、矛、长柄刀、战锤、弓、弩等等。
盾牌:如果单位使用的武器只需要单手就能操作,那么也可以再佩戴一面盾牌,盾牌会有对面向敌人方向的防御加成。
马匹:如果选择了马匹,单位就会以骑兵姿态进入战场,其移动力会大幅提升,但是单位的护甲会取兵员与马匹的平均值,贵族老爷记得骑一匹好马哦!
这么多新的数值表格,当然也需要导入到系统内,在之前的日志中我介绍过将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”键字段,不同的命名需求可以修改。
最后体现在编辑器里,就是这样:
以上就是本次日志的内容啦,最近的开发内容集中在,底层的一些数据修改,以及策划大量的装备数据,真是相当的乏味呐!接下来还有伤害计算和数值平衡性要考虑,真是想想就头大。如此乏味的内容,感谢您能看到这里!
如果对这个项目有兴趣,或者有什么建议的话,欢迎联系我哦! QQ:2763686216
那么矛是属于双手武器还是单手