跳到主要内容

属性系统

属性系统是任何怪物捕捉游戏中战斗策略的支柱。MCE 包含一张完全可配置的属性相克表、双属性支持,以及用于自定义属性克制关系的编辑器工具。

概览​

每只怪物有一个或两个属性。每个招式恰好有一个属性。当招式命中目标时,游戏会根据招式属性与目标属性计算属性相克倍率。

Type Chart Editor

这张表是数据,而不是代码 —— 上面的编辑器写入的正是战斗公式在运行时 读取的那些资产。这使得 18 属性的网格成为一个起点而不是一条规则:你 可以添加一个属性、移除一个属性,或改写一个单元格,而无需重新编译。

默认倍率如下:

结果倍率消息
效果拔群2.0 倍"It's super effective!"
效果不佳0.5 倍"It's not very effective..."
无效0.0 倍"It doesn't affect [target]..."
普通1.0 倍(无消息)

对于双属性怪物,倍率会相乘。火系招式打在草/冰怪物身上会造成 2.0 x 2.0 = 4.0 倍的伤害。

默认属性相克表​

演示版附带 18 个符合标准怪物捕捉类型的属性(外加一个 Typeless 属性):

Normal、Fire、Water、Grass、Electric、Ice、Fighting、Poison、Ground、Flying、Psychic、Bug、Rock、Ghost、Dragon、Dark、Steel、Fairy

自定义属性

这 18 个属性只是一个起点。属性是普通的 MonsterType 资产,因此你可以添加、移除或重命名它们。有些游戏使用更少的属性(早期世代使用 15 个),也有些原创游戏会创建完全自定义的属性相克表。

属性相克表​

这张表存储在属性本身上:每个 MonsterType 资产都有一个 AttackMultipliers 字典(防御属性 → 倍率),用于该属性的招式。IMonsterDatabase.GetTypeEffectiveness() 方法在运行时返回倍率:

float multiplier = database.GetTypeEffectiveness(attackingType, defendingType);

需要记住的关键克制关系:

攻击属性克制(2 倍)被抵抗(0.5 倍)无效(0 倍)
FireGrass、Ice、Bug、SteelFire、Water、Rock、Dragon--
WaterFire、Rock、GroundWater、Grass、Dragon--
GrassWater、Rock、GroundFire、Grass、Poison、Flying、Bug、Dragon、Steel--
ElectricWater、FlyingElectric、Grass、DragonGround
GroundFire、Electric、Poison、Rock、SteelGrass、BugFlying
GhostPsychic、GhostDarkNormal
Normal--Rock、SteelGhost

完整的表可以在 Type Chart Editor 中查看和编辑。在某个属性的字典中缺失的配对按普通(1.0 倍)处理。

双属性​

当怪物有两个属性时,受到伤害时两个属性都会被检查:

Final Multiplier = Effectiveness(move_type vs type1) * Effectiveness(move_type vs type2)

这会产生几种有趣的情形:

招式属性目标属性计算结果
IceDragon / Flying2.0 x 2.04.0 倍(双重效果拔群)
ElectricWater / Ground2.0 x 0.00.0 倍(无效,Ground 吸收)
FightingNormal / Ghost1.0 x 0.00.0 倍(无效,Ghost 吸收)
WaterFire / Rock2.0 x 2.04.0 倍(双重效果拔群)

STAB(本系加成)​

当怪物使用与自己某个属性一致的招式时,该招式获得 1.5 倍的 STAB 加成(DamageMath.StabMultiplier)。该加成会与属性相克以及其他伤害系数相乘:

Final Damage = Base Damage * STAB * Type Effectiveness

例如,一只水系怪物对火系目标使用水系招式:

Base * 1.5 (STAB) * 2.0 (super effective) = 3.0x total

使用 Type Chart Editor​

Type Chart Editor 是一个用于查看和修改属性克制关系的交互式网格工具:

打开 OpenMon Hub(Tools > MCE > OpenMon Hub)→ Database 选项卡 → Type Chart Editor

在编辑器中:

  1. 查看模式 —— 网格显示完整的 NxN 属性相克表;标题栏会说明它列出了多少个属性。行是攻击属性,列是防御属性,每个属性的颜色标记它的行和列。
  2. 颜色编码 —— 绿色 = 效果拔群(2 倍),红色 = 效果不佳(0.5 倍),深灰色 = 无效果(0 倍),浅灰色 = 普通(1 倍)。
  3. 编辑模式 —— 点击任意单元格循环切换数值:普通 → 2 → 0.5 → 0 → 普通。每一次更改都可以用 Unity 的撤销来还原。
  4. Refresh —— 从项目中重新加载属性列表(窗口获得焦点时也会重新加载)。
  5. Save All —— 将所有属性标记为已修改并把资产保存到磁盘。

网格列出开启了 Index 的 MonsterType 资产。要添加或移除属性,请创建或删除资产(见下文)—— 编辑器本身没有添加或移除按钮。

更改属性会影响一切

修改属性相克表会影响你游戏中的所有战斗。任何更改之后都要充分测试。添加或移除属性需要更新怪物和招式的分配。

创建自定义属性​

如果你正在制作原创游戏,你可能想要自定义的属性相克表:

  1. 创建一个 MonsterType 资产:Assets > Create > MCE > Monster Database > Type,或使用 Hub 的 Database 选项卡中的 New Monster Type。为它命名(例如 Cosmic、Sound、Digital),设置其颜色和图标,并保持 Index 开启以便它出现在表中。
  2. 打开 Type Chart Editor 并点击 Refresh:新属性会作为一行和一列出现。
  3. 为它与现有属性之间的每一种交互设置相克数值。
  4. 创建使用你的新属性的怪物和招式。

自定义属性的设计技巧​

  • 在攻防两端保持平衡。一个属性应当有大致相等的优势和弱点。
  • 避免过多的免疫。免疫很强大,如果使用过度会造成令人沮丧的游戏体验。
  • 让总数保持在可控范围。15-20 个属性是最佳点。超过 25 个就很难让玩家记住。
  • 创造有趣的反制关系。最好的属性克制关系会带来风险/回报的抉择,而不是自动取胜。

在代码中查询属性​

SDK 接口(Indie、Pro、Source 和 Studio 版本)​

using System.Linq;
using OpenMon.MCE.SDK;

IReadOnlyList<MonsterType> allTypes = engine.Database.GetAllTypes();
var fire = allTypes.FirstOrDefault(type => type.name == "Fire");
var grass = allTypes.FirstOrDefault(type => type.name == "Grass");

float effectiveness = engine.Database.GetTypeEffectiveness(fire, grass);
// Returns 2.0 when both types exist in the database

直接访问(Source 和 Studio 版本)​

拥有源码访问权限时,你还可以通过 MonsterDatabase 类直接操作属性相克表,并在运行时为特殊的战斗条件修改相克数值。

最佳实践​

  1. 使用 Type Chart Editor 进行修改 —— 它会记录撤销步骤并为你保存属性资产。
  2. 如果在制作原创游戏,请为你的自定义属性编写文档。玩家需要学习这些克制关系。
  3. 用双属性测试边缘情况。4 倍弱点和双重免疫可能会让玩家感到意外。
  4. 平衡属性时要考虑招式分布。一个防御上很强、却没有好招式可用的属性,实际上是弱的。