野生遭遇系统
遭遇系统决定了玩家探索世界时何时以及出现哪些野生怪兽。MCE 支持多种遭遇方式、可配置的概率表、等级范围和时间段遭遇。
遭遇机制
- 玩家走在有遭遇数据的地块上。
- 每一步,系统根据遭遇率进行判定。
- 如果判定成功,根据加权概率从地块的遭遇表中选择一只怪兽。
- 使用选中怪兽的物种、等级和形态创建
BattleParameters对象。 BattleLauncher切换到战斗场景。
WildEncountersSet
WildEncountersSet ScriptableObject 定义了给定区域的遭遇表:
创建路径:Assets > Create > OpenMon > Wild Encounters Set
每个条目包含:
| 字段 | 描述 |
|---|---|
| Monster | 对 MonsterEntry ScriptableObject 的引用 |
| Min Level | 野生怪兽的最低等级 |
| Max Level | 野生怪兽的最高等级 |
| Probability | 此条目的相对权重(越高 = 越常见) |
每次遭遇触发时,实际等级在最低和最高之间随机选择。
概率计算
概率是相对权重,不是百分比。系统将所有权重求和并计算每个条目的几率:
几率 = 条目权重 / 所有权重之和
示例表:
| 怪兽 | 权重 | 实际几率 |
|---|---|---|
| Leafpup | 40 | 40/100 = 40% |
| Windling | 30 | 30/100 = 30% |
| Silkworm | 20 | 20/100 = 20% |
| Sparkbit | 10 | 10/100 = 10% |
遭遇类型
MCE 通过 EncounterType 枚举支持不同的遭遇方式:
| 类型 | 触发方式 | 描述 |
|---|---|---|
| Walking | 在高草丛或洞穴中行走 | 标准大世界遭遇 |
| Surfing | 在水面地块上冲浪 | 水面遭遇 |
| Fishing | 面对水面使用钓鱼竿 | 基于钓竿的遭遇(破旧钓竿、好钓竿、超级钓竿) |
| RockSmash | 对可碎岩石使用碎岩 | 基于岩石的遭遇 |
| Headbutt | 对树使用头槌 | 基于树木的遭遇 |
每个 WildEncountersSet 可以按类型分离遭遇。只有匹配当前行为(行走、冲浪、钓鱼)的遭遇会被考虑。
设置遭遇区域
方法 1:EncounterTile 组件
- 在场景中,在地图层级结构中创建一个空 GameObject。
- 添加
EncounterTile组件。 - 将
WildEncountersSet分配给 Encounters 字段。 - 调整遭遇区域的位置和大小以覆盖所需地块。
方法 2:SceneInfo 默认遭遇
每个场景的 SceneInfo 可以设置默认的 WildEncountersSet。场景中任何可行走的草地地块都将使用此遭遇表,除非被特定的 EncounterTile 覆盖 。
方法 3:按地块遭遇
如需精细控制,你可以为同一地图的不同区域分配不同的遭遇配置。放置多个 EncounterTile 组件覆盖不同区域即可。
遭遇率
遭遇率控制每步触发遭遇的频率:
- 基础率:按遭遇区域配置(典型范围:5-25%)。
- 修正值:道具(例如虫除剂将概率降为 0%)、特性(例如恶臭降低概率)和道具(例如洁净之符)。
- 步数计数器:系统追踪自上次遭遇以来的步数。长时间没有遭遇后,概率会略微提高以防止过长的空档。
时间段遭遇
不同的怪兽可以在不同的时间段出现:
| 时段 | 小时 |
|---|---|
| 早晨 | 06:00 - 11:59 |
| 白天 | 12:00 - 17:59 |
| 傍晚 | 18:00 - 20:59 |
| 夜晚 | 21:00 - 05:59 |
通过为每个时段创建单独的 WildEncountersSet 资源并通过遭遇区域的时间段配置进行分配来配置基于时间的遭遇。
形态遭遇
某些物种有根据条件不同而外观不同的形态。EncounterFormCalculator 决定野生怪兽以哪种形态出现:
- 地区形态:基于地图的区域标签。
- 季节形态:基于游戏内日历。
- 随机形态:从可用形态中随机选择。
使用 SingleFormEncounter 组件在遭遇条目中强制指定特定形态。
特殊遭遇模式
钓鱼
钓鱼遭遇要求玩家面对水面地块使用钓鱼竿道具:
- 创建包含
EncounterType.Fishing条目的WildEncountersSet。 - 将其分配给水域的遭遇配置。
- 不同等级的钓竿(破旧钓竿、好钓竿、超级钓竿)筛选可用的条目。
传说/一次性遭遇
对于只应发生一次的特殊遭遇:
- 使用 CommandGraph 事件代替随机遭遇。
- 事件在触发前检查游戏变量(例如
LegendaryDefeated)。 - 战斗后设置变量以防止再次遭遇。
- 这种方法让你完全控制遭遇的场景(过场动画、对 话、地形)。
群体遭遇
同时遇到多只野生怪兽:
- 在遭遇条目中配置群体标记。
- 战斗会生成 3-5 只指定物种的怪兽。
- 玩家逐一与它们战斗,或可以攻击群体(使用 AOE 招式,如果支持的话)。
虫除剂和遭遇预防
玩家可以使用道具防止遭遇:
| 道具 | 效果 | 持续时间 |
|---|---|---|
| 虫除剂 | 防止遇到低于玩家首位怪兽等级的怪兽 | 100 步 |
| 超级虫除剂 | 相同效果,更长持续时间 | 200 步 |
| 白金虫除剂 | 相同效果,最长持续时间 | 250 步 |
虫除剂以步数计数器实现。遭遇系统在判定遭遇前检查虫除剂计数器。
遭遇工具方法
EncounterUtils 类提供辅助方法:
// 检查当前地块是否可能遭遇
bool canEncounter = EncounterUtils.CanEncounterAt(position, encounterType);
// 获取某位置的遭遇配置
WildEncountersSet set = EncounterUtils.GetEncounterSet(position, encounterType);
// 进行遭遇判定(如果没有触发遭遇则返回 null)
WildEncounter encounter = EncounterUtils.RollEncounter(set);
最佳实践
- 平衡遭遇率。太高(>25%)让人烦躁。太低(<5%)让世界感觉空旷。8-15% 是典型值。
- 按进度调整等级。路线 1 应该有 2-5 级怪兽,而不是 50 级。
- 地图间遭遇表要有差异。每条路线应该感觉独特。
- 包含稀有遭遇。每个表中有一个 5% 概率的条目给玩家追寻的目标。
- 测试时 间段遭遇。玩家不应因在特定时间游玩而感到被惩罚。
- 尽早提供虫除剂。玩家喜欢在中期之前就能控制遭遇。