跳到主要内容

野生遭遇系统

遭遇系统决定了玩家探索世界时何时以及出现哪些野生怪兽。MCE 支持多种遭遇方式、可配置的概率表、等级范围和时间段遭遇。

遭遇机制

  1. 玩家走在有遭遇数据的地块上。
  2. 每一步,系统根据遭遇率进行判定。
  3. 如果判定成功,根据加权概率从地块的遭遇表中选择一只怪兽。
  4. 使用选中怪兽的物种、等级和形态创建 BattleParameters 对象。
  5. BattleLauncher 切换到战斗场景。

WildEncountersSet

WildEncountersSet ScriptableObject 定义了给定区域的遭遇表:

创建路径:Assets > Create > OpenMon > Wild Encounters Set

每个条目包含:

字段描述
MonsterMonsterEntry ScriptableObject 的引用
Min Level野生怪兽的最低等级
Max Level野生怪兽的最高等级
Probability此条目的相对权重(越高 = 越常见)

每次遭遇触发时,实际等级在最低和最高之间随机选择。

概率计算

概率是相对权重,不是百分比。系统将所有权重求和并计算每个条目的几率:

几率 = 条目权重 / 所有权重之和

示例表:

怪兽权重实际几率
Leafpup4040/100 = 40%
Windling3030/100 = 30%
Silkworm2020/100 = 20%
Sparkbit1010/100 = 10%

遭遇类型

MCE 通过 EncounterType 枚举支持不同的遭遇方式:

类型触发方式描述
Walking在高草丛或洞穴中行走标准大世界遭遇
Surfing在水面地块上冲浪水面遭遇
Fishing面对水面使用钓鱼竿基于钓竿的遭遇(破旧钓竿、好钓竿、超级钓竿)
RockSmash对可碎岩石使用碎岩基于岩石的遭遇
Headbutt对树使用头槌基于树木的遭遇

每个 WildEncountersSet 可以按类型分离遭遇。只有匹配当前行为(行走、冲浪、钓鱼)的遭遇会被考虑。

设置遭遇区域

方法 1:EncounterTile 组件

  1. 在场景中,在地图层级结构中创建一个空 GameObject。
  2. 添加 EncounterTile 组件。
  3. WildEncountersSet 分配给 Encounters 字段。
  4. 调整遭遇区域的位置和大小以覆盖所需地块。

方法 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 组件在遭遇条目中强制指定特定形态。

特殊遭遇模式

钓鱼

钓鱼遭遇要求玩家面对水面地块使用钓鱼竿道具:

  1. 创建包含 EncounterType.Fishing 条目的 WildEncountersSet
  2. 将其分配给水域的遭遇配置。
  3. 不同等级的钓竿(破旧钓竿、好钓竿、超级钓竿)筛选可用的条目。

传说/一次性遭遇

对于只应发生一次的特殊遭遇:

  1. 使用 CommandGraph 事件代替随机遭遇。
  2. 事件在触发前检查游戏变量(例如 LegendaryDefeated)。
  3. 战斗后设置变量以防止再次遭遇。
  4. 这种方法让你完全控制遭遇的场景(过场动画、对话、地形)。

群体遭遇

同时遇到多只野生怪兽:

  • 在遭遇条目中配置群体标记
  • 战斗会生成 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);

最佳实践

  1. 平衡遭遇率。太高(>25%)让人烦躁。太低(<5%)让世界感觉空旷。8-15% 是典型值。
  2. 按进度调整等级。路线 1 应该有 2-5 级怪兽,而不是 50 级。
  3. 地图间遭遇表要有差异。每条路线应该感觉独特。
  4. 包含稀有遭遇。每个表中有一个 5% 概率的条目给玩家追寻的目标。
  5. 测试时间段遭遇。玩家不应因在特定时间游玩而感到被惩罚。
  6. 尽早提供虫除剂。玩家喜欢在中期之前就能控制遭遇。