基于兴趣开发的策略战棋游戏开发日志(7-9)

作者:mioku
2022-12-03
2 0 0

前情回顾

宏大的计划目标是要制作一款策略玩法类似(欧陆风云/十字军之王),同时通过战棋玩法表现局部战略的游戏!

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

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

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

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

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

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

这么多新的数值表格,当然也需要导入到系统内,在之前的日志中我介绍过将 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”键字段,不同的命名需求可以修改。

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

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

这回日志总算能有一些能够展示内容了(尽管 UI 简陋异常),现在玩家可以在招募页面中进行兵源,以及各种装备的选择搭配。直接上图吧:

兵源:左边的列表中列出了可选择的部队兵源,不同兵源的身体素质和护甲会有很大的区别。一些低级的兵源甚至无法使用部分武器/盾牌,以及无法驾驭马。

武器:选择兵源后,可以选择部队配备的武器,如果选择双手才能使用的武器,将无法使用盾牌。

盾牌:盾牌是相当实用的装备,佩戴盾牌可以很好保住你士兵的小命。

点击招募就能在指定单元格招募出选择的单位啦!

马匹:较高级的兵源可以选择马匹,选择马匹后,单位就会以骑兵的身份进入战斗,机动能力和作战方式也会有很大的不同。

数据栏:右边粉色的数据栏会显示当前所选择的兵源,以及装备的属性,为玩家提供一定参考。

这就是新招募页面的现有功能了,事实上目前单位招募相关的内容只完成了最基础的功能,还有大量的内容需要制作:

  • 装备/地形/单位数据的策划(目前只做了几个样例数据)、
  • UI 界面设计(默认 UI 组件的样式真是太简陋了!)、
  • 动态反馈效果(现在的内容毫无反馈感,冰冰冷冷的!)

那么简陋的内容还请大家多多包涵呀 ><!


唉!开发日志写到第 8 篇,但连游戏基础玩法的内容也还没实现多少。在计划制作许多内容时,每当正式投入实现,才发现还有那么多基础内容没有准备好。不过,一点点的成果是在积累的,我已经在很多目标前半途而废,这次一定要走到终点呀!!!我就是加把劲骑士了!

最近一段时间的完成内容大概如下:

  1. 制定数据模型,完成第一版装备数据
  2. 完成单位的动画控制,方便及时调用
  3. 实现了一个初期的伤害计算公式
  4. 制作了单位移动攻击的简单呈现

让我们一个一个来讲:

1. 第一版的装备数据已经策划完成了。尽管数值平衡相当糟糕,不过总算能将攻击机制推进下去了。在完成了数值策划后,单位可选的武器也明显变多了。

来个铁罐头骑兵!

重装斧骑兵还是很有压迫力的吧!

2. 本人对动画控制器(Animator)的了解很浅,在之前的制作过程中已经做过好几版的动画控制器,但在切换控制状态时始终有些不顺手。最近在深入了解了一下 Animator 相关的参数后,采用了 Any State 大法,控制机制果然简单很多。

AnyState大法

在策略类游戏这种单位动画切换不频繁,也几乎没有复杂过渡要求的游戏类型中,Any State 方法还是蛮不错的,不过我对 Animator 的实施方法所知还是有限,欢迎有 dalao 给出建议!

3. 在之前的一段时间里,我反复纠结于伤害计算的公式类型。查看了一些资料后决定使用 基础伤害*(1+伤害影响) 的这种类型,目前只是简单的实现了一下,伤害公式 F 大致为:

F=基础伤害*[1+D(守方专项加成,功方专项加成)*防守效果系数]*[1+攻防能力加成*进攻效果系数]

其中函数 D(x,y)(x-y<=0) 时结果为 0 ,在 (x-y>0) 时结果为 x-y 。即若防守方的防御加成大于攻防的专项加成时伤害将会被减免。而攻方溢出的专项加成并不会有进一步的伤害增益。因此在面对具体局势时,玩家需要好好考虑武器的专项能力。

这只是伤害公式的初版,还有很多影响内容没有加入,后续随着制作内容的细化,也会同步跟进。

4. 最后就是攻击效果的呈现了,以下是移动并攻击的动画:

移动并攻击动画

现在单位在计划行动时的路线提示被替换为了逐渐向红色递进的样式。

单位移动过程直接使用了匀速,后续在移动开始和结束时会考虑设置一定的加速度,效果应该会好一些。

当单位攻击时会有一个还有些粗糙的伤害数字反馈。这是用 Unity 的一个名为 Feel 的插件实现的,最近半价(仍然好贵!),能实现相当不错的反馈效果,后续的各种玩家输入,以及 UI 呈现都会试着使用这个插件来优化反馈效果。


以上就是最近一段时间完成的攻击相关机制了,接下来会对攻击机制进行一定的细化,也会补充一些 UI 提示。呈现的内容并不多,不过也亏最近比较清闲,摸鱼时努力制作总算在今天能发出日志。近两周的开发内容完成后,很多内容就能开始着手开发了!(各类地形,兵种的设计,建筑/经济内容等等)。

莫名有种拨开云雾的感觉,这种逐步实现目标内容的感受真是相当不错!要是你脑海里也有想要制作的游戏,恰好有些闲暇时间的话。很推荐试试哦!

内容还是略显粗糙,很感谢你能看到这里!

如果你对开发内容有建议,或是对策略游戏开发有兴趣的话,很欢迎联系我!QQ: 2763686216