大家好啊!好久没有写日志了,在前端时间基本完成移动功能以后,攻击相关的机制就谈上日程了。我没想到是,在此之前有大量的单位属性相关的内容需要敲定。所以这两周基本没有什么可以直观展示的新内容,本期就介绍一下已经大概策划好的装备系统与新的数据导入功能吧!
在原来的制作过程中,玩家在招募时,直接选择某个单位,花费资金就能招募。现在则是为单位加入了装备选择的功能,玩家选择的兵源决定了单位的基础护甲以及体能能基础属性,装备则会给予兵员自己的特殊优势。
装备系统:在招募单位时,现在需要为单位选择一套装备,不同的装备会在很大程度上影响单位的职能。装备分为武器、盾牌和马匹(骑兵使用),一下将会一一介绍:
武器:单位的武器决定了单位的基础攻击能力,以及对付某些敌人的专长(比如反骑兵,重甲敌人等等),大概会分为剑、斧、矛、长柄刀、战锤、弓、弩等等。
盾牌:如果单位使用的武器只需要单手就能操作,那么也可以再佩戴一面盾牌,盾牌会有对面向敌人方向的防御加成。
马匹:如果选择了马匹,单位就会以骑兵姿态进入战场,其移动力会大幅提升,但是单位的护甲会取兵员与马匹的平均值,贵族老爷记得骑一匹好马哦!
这么多新的数值表格,当然也需要导入到系统内,在之前的日志中我介绍过将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


暂无关于此日志的评论。