属性系统
属性系统是任何怪兽捕获游戏中战斗策略的核心。MCE 包含一个完全可配置的属性克制表、双属性支持以及用于自定义属性匹配的编辑器工具。
概述
每只怪兽拥有一到两个属性。每个招式恰好拥有一个属性。当招式命中目标时,游戏会根据招式属性与目标属性的关系计算属性克制倍率。
默认倍率如下:
| 结果 | 倍率 | 消息 |
|---|---|---|
| 效果拔群 | 2.0x | "效果拔群!" |
| 效果不佳 | 0.5x | "效果不佳……" |
| 免疫 | 0.0x | "对[目标]没有效果……" |
| 普通 | 1.0x | (无消息) |
对于双属性怪兽,倍率以乘法方式叠加。火系招式对草/冰系怪兽造成 2.0 x 2.0 = 4.0x 伤害。
默认属性表
MCE 预设了 18 种属性,符合标准怪兽捕获类型游戏:
Normal、Fire、Water、Grass、Electric、Ice、Fighting、Poison、Ground、Flying、Psychic、Bug、Rock、Ghost、Dragon、Dark、Steel、Fairy
这 18 种属性是默认设置。你可以使用属性表编辑器添加、删除或重命名属性。一些游戏使用更少的属性(早期作品使用 15 种),而一些原创游戏创建全新的自定义属性表。
属性克制表
完整的 18x18 属性表存储为 ScriptableObject 数据库。IMonsterDatabase.GetTypeEffectiveness() 方法在运行时返回倍率:
float multiplier = database.GetTypeEffectiveness(attackingType, defendingType);
关键克制关系:
| 攻击属性 | 克制(2x) | 被抵抗(0.5x) | 免疫(0x) |
|---|---|---|---|
| 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 |
完整的属性表可在属性表编辑器中查看和编辑。
双属性
当怪兽拥有两个属性时,受到伤害时两个属性都会被计算:
最终倍率 = 克制关系(招式属性 vs 属性1) * 克制关系(招式属性 vs 属性2)
这产生了一些有趣的场景:
| 招式属性 | 目标属性 | 计算 | 结果 |
|---|---|---|---|
| Ice | Dragon / Flying | 2.0 x 2.0 | 4.0x(双重克制) |
| Electric | Water / Ground | 2.0 x 0.0 | 0.0x(免疫,Ground 吸收) |
| Fighting | Normal / Ghost | 1.0 x 0.0 | 0.0x(免疫,Ghost 吸收) |
| Water | Fire / Rock | 2.0 x 2.0 | 4.0x(双重克制) |
STAB(本系加成)
当怪兽使用与自身属性之一相同的招式时,该招式获得 1.5x 本系加成。此加成在属性克制之后应用:
最终伤害 = 基础伤害 * STAB * 属性克制
例如,水属性怪兽对火属性目标使用水系招式:
基础 * 1.5(STAB)* 2.0(效果拔群)= 3.0x 总计
使用属性表编辑器
属性表编辑器是一个用于查看和修改属性匹配关系的交互式网格工具:
MCE > Tools > Type Chart Editor
在编辑器中:
- 查看模式 -- 网格显示完整的 NxN 属性表。行是攻击属性,列是防御属性。
- 颜色编码 -- 绿色 = 效果拔群(2x),红色 = 效果不佳(0.5x),黑色 = 免疫(0x),灰色 = 普通(1x)。
- 编辑模式 -- 点击任何单元格循环切换克制值。
- 添加属性 -- 向属性表添加新的行和列。
- 移除属性 -- 移除一个属性(会警告受影响的怪兽和招式)。
修改属性表会影响游戏中的所有战斗。任何更改后请彻底测试。添加或移除属性需要更新怪兽和招式的分配。
创建自定义属性
如果你正在制作原创游戏,可能需要自定义属性表:
- 打开属性表编辑器。
- 点击添加属性并为新属性命名(例如
Cosmic、Sound、Digital)。 - 设置与所有现有属性的克制关系。
- 创建使用新属性的怪兽和招式。
自定义属性设计建议
- 平衡攻防。一个属性的优势和劣势应大致相当。
- 避免过多免疫。免疫效果强大,过度使用会造成令人沮丧的游戏体验。
- 保持总数可控。15-20 种属性是最佳范围。超过 25 种会让玩家难以记忆。
- 创造有趣的博弈。最好的属性匹配应该创造风险/收益的决策,而非自动获胜。
在代码中查询属性
SDK 接口(所有版本)
using OpenMon.MCE.SDK;
// 通过 SDK 接口
float effectiveness = engine.Database.GetTypeEffectiveness(
MonsterType.Fire,
MonsterType.Grass
);
// 返回 2.0
IReadOnlyList<MonsterType> allTypes = engine.Database.GetAllTypes();
直接访问(Source 版本)
拥有源代码访问权限后,你还可以直接通过 MonsterDatabase 类操作属性 表,并在运行时为特殊战斗条件修改克制值。
最佳实践
- 使用属性表编辑器进行修改——不要直接编辑属性表 ScriptableObject。
- 记录你的自定义属性(如果你正在制作原创游戏)。玩家需要学习属性匹配关系。
- 测试双属性的边界情况。4x 弱点和双重免疫可能会出乎玩家意料。
- 考虑招式分布来平衡属性。一个防御强大但没有好招式可用的属性实际上是弱势的。