属性系统
属性系统是任何怪物捕捉游戏中战斗策略的支柱。MCE 包含一张完全可配置的属性相克表、双属性支持,以及用于自定义属性克制关系的编辑器工具。
概览
每只怪物有一个或两个属性。每个招式恰好有一个属性。当招式命中目标时,游戏会根据招式属性与目标属性计算属性相克倍率。

这张表是数据,而不是代码 —— 上面的编辑器写入的正是战斗公式在运行时 读取的那些资产。这使得 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 倍) |
|---|---|---|---|
| Fire | Grass、Ice、Bug、Steel | Fire、Water、Rock、Dragon | -- |
| Water | Fire、Rock、Ground | Water、Grass、Dragon | -- |
| Grass | Water、Rock、Ground | Fire、Grass、Poison、Flying、Bug、Dragon、Steel | -- |
| Electric | Water、Flying | Electric、Grass、Dragon | Ground |
| Ground | Fire、Electric、Poison、Rock、Steel | Grass、Bug | Flying |
| Ghost | Psychic、Ghost | Dark | Normal |
| Normal | -- | Rock、Steel | Ghost |
完整的表可以在 Type Chart Editor 中查看和编辑。在某个属性的字典中缺失的配对按普通(1.0 倍)处理。
双属性
当怪物有两个属性时,受到伤害时两个属性都会被检查:
Final Multiplier = Effectiveness(move_type vs type1) * Effectiveness(move_type vs type2)
这会产生几种有趣的情形:
| 招式属性 | 目标属性 | 计算 | 结果 |
|---|---|---|---|
| Ice | Dragon / Flying | 2.0 x 2.0 | 4.0 倍(双重效果拔群) |
| Electric | Water / Ground | 2.0 x 0.0 | 0.0 倍(无效,Ground 吸收) |
| Fighting | Normal / Ghost | 1.0 x 0.0 | 0.0 倍(无效,Ghost 吸收) |
| Water | Fire / Rock | 2.0 x 2.0 | 4.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
在编辑器中:
- 查看模式 —— 网格显示完整的 NxN 属性相克表;标题栏会说明它列出了多少个属性。行是攻击属性,列是防御属性,每个属性的颜色标记它的行和列。
- 颜色编码 —— 绿色 = 效果拔群(2 倍),红色 = 效果不佳(0.5 倍),深灰色 = 无效果(0 倍),浅灰色 = 普通(1 倍)。
- 编辑模式 —— 点击任意单元格循环切换数值:普通 → 2 → 0.5 → 0 → 普通。每一次更改都可以用 Unity 的撤销来还原。
- Refresh —— 从项目中重新加载属性列表(窗口获得焦点时也会重新加载)。
- Save All —— 将所有属性标记为已修改并把资产保存到磁盘。
网格列出开启了 Index 的 MonsterType 资产。要添加或移除属性,请创建或删除资产(见下文)—— 编辑器本身没有添加或移除按钮。
修改属性相克表会影响你游戏中的所有战斗 。任何更改之后都要充分测试。添加或移除属性需要更新怪物和招式的分配。
创建自定义属性
如果你正在制作原创游戏,你可能想要自定义的属性相克表:
- 创建一个
MonsterType资产:Assets > Create > MCE > Monster Database > Type,或使用 Hub 的 Database 选项卡中的 New Monster Type。为它命名(例如Cosmic、Sound、Digital),设置其颜色和图标,并保持 Index 开启以便它出现在表中。 - 打开 Type Chart Editor 并点击 Refresh:新属性会作为一行和一列出现。
- 为它与现有属性之间的每一种交互设置相克数值。
- 创建使用你的新属性的怪物和招式。
自定义属性的设计技巧
- 在攻防两端保持平衡。一个属性应当有大致相等的优势和弱点。
- 避免过多的免疫。免疫很强大,如果使用过度会造成令人沮丧的游戏体验。
- 让总数保持在可控范围。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 类直接操作属性相克表,并在运行时为特殊的战斗条件修改相克数值。
最佳实践
- 使用 Type Chart Editor 进行修改 —— 它会记录撤销步骤并为你保存属性资产。
- 如果在制作原创游戏,请为你的自定义属性编写文档。玩家需要学习这些克制关系。
- 用双属性测试边缘情况。4 倍弱点和双重免疫可能会让玩家感到意外。
- 平衡属性时要考虑招式分布。一个防御上很强、却没有好招式可用的属性,实际上是弱的。