野生遭遇系统
遭遇系统决定玩家在探索世界时,何时出现哪些野生怪物。MCE 支持多种遭遇类型、加权表、等级范围、按时段和天气的遭遇,以及驱虫剂。

玩家所站的图块就是全部的触发条件。EncounterTile 标记图块及其
类型,WildEncountersSet 说明那里栖息着什么以及等级多少,地图的 SceneInfo 把
二者联系起来,而每一步踏上遭遇图块都要按几率判定。
遭遇如何运作
- 玩家完成一步,踏上带有
EncounterTile的图块(在地下城场景中则是任意图块)。 - 这一步按该图块
EncounterType的遭遇几率判定。 - 如果判定成功,地图的
SceneInfo提供该类型的WildEncountersSet。系统构建当前时段和天气下可能的遭遇列表,并按权重选出一个条目。 - 在该条目的
MinLevel和MaxLevel之间抽取一个等级。 - 驱虫剂或队伍首发怪物仍可取消该遭遇(见下文)。
- 用被选中怪物的物种、等级和形态创建一个
BattleParameters对象,BattleLauncher过渡到战斗场景。
遭遇类型
EncounterType 枚举命名了各种遭遇:
| 类型 | 典型用途 |
|---|---|
Grass | 高草丛 |
Water、Surfing | 水面图块;在其上冲浪 |
Cave | 洞穴地面。标记为地下城的场景(其 SceneInfo 中的 IsDungeon)在每个图块上都使用 Cave,无需绘制图块 |
FishingOldRod、FishingGoodRod、FishingSuperRod | 使用各种鱼竿钓鱼 |
Diving | 水下 |
RockSmash、HeadButt | 击碎岩石;撞树 |
BugContest | 捕虫大赛 |
Other | 你的游戏定义的任何内容 |
设置遭遇区域
步骤 1:遭遇图块
遭遇图块是预制体带有 EncounterTile 组件的图块。该组件有一项设置 Encounter Type。要制作你自己的,创建一个带该组件的预制体,选择类型,并把该预制体用作图块资产的 GameObject;然后把这个图块绘制在应出现怪物的瓦片地图图层上。引擎包含现成的,例如 Assets/OpenMon/Game/Prefabs/World/Water/Water/WaterEncounterTile.prefab。
步骤 2:WildEncountersSet
通过 Assets > Create > MCE > Battle > Encounters > WildEncountersSet(或 Hub 的 Database 选项卡中的 New Wild Encounter Set)创建一个。集合有三个列表:
| 列表 | 含义 |
|---|---|
| Base Encounters | 总会出现的怪物 |
| Encounters Per Moment | Night、Dawn、Day 或 Dusk 额外出现的怪物 |
| Encounters Per Weather | 在某种战斗外天气(Sunny、Rain、Fog、Sandstorm、Snowstorm)下额外出现的怪物 |
某一时刻可能的遭遇是基础列表,加上当前时段的条目,再加上当前天气的条目。
每个条目是一个 WildEncounter:
| 字段 | 说明 |
|---|---|
| Monster | 对 MonsterEntry 的引用 |
| Form Calculator | 决定出现哪种形态的资产(见下文) |
| Min Level / Max Level | 等级范围,1 到 100(最大值不会低于最小值) |
| Weight | 该条目的相对权重(越高越常见) |
步骤 3:地图的 SceneInfo
地图的 SceneInfo 资产把遭遇类型与集合联系起来。在它的 Encounters 组中,每种类型添加一个条目:Grass → 你的草地集合,Surfing → 你的水域集合,依此类推。没有条目的类型没有野生怪物。同一资产还可以按类型保存:
- 一个战斗场景设定(该类遭遇的战斗背景/地形;若未设置则使用图块自身的数据),
- 地图自己的遭遇几率(见下文),
- 此处是否可以钓鱼,以及该场景是否是地下城。
概率计算
权重是相对的,不是百分比。系统将所有权重求和,每个条目的几率就是它的权重除以总和:
Chance = Entry Weight / Sum of All Weights
| 怪物 | 权重 | 实际几率 |
|---|---|---|
| Leafpup | 40 | 40/100 = 40% |
| Windling | 30 | 30/100 = 30% |
| Silkworm | 20 | 20/100 = 20% |
| Sparkbit | 10 | 10/100 = 10% |
每一步的遭遇几率
一步是否会触发 遭遇,是第二个独立的判定:
- 全局几率是
MCESettings资产的TileEncounterChance表:每种遭遇类型一个值(0 到 1)。表中缺失的类型按 0 计算,并只记录一次警告。 - 地图可以在其
SceneInfo中用自己的几率(OwnEncounterChances)针对某个类型覆盖它。这种类型同样使用地图的奔跑倍率(默认 1)和骑行倍率(默认 0.8)。没有自己的几率时,全局规则会让骑行时的判定降低同样的 0.8。 - 对于
EncountersWithModifiableChances(MCESettings)中列出的类型,队伍首发怪物的特性和携带道具会对几率相乘(例如减少野生遭遇的道具)。 - 遭遇笛类道具会改变几率,直到下一次地图切换。
- 钓鱼使用地图针对所用鱼竿的自有几率;没有时,鱼总会上钩。
野生闪光几率是 MCESettings 中的 WildShinyChance(默认 1/512)。
按时段与天气的遭遇
时段遵循 TimeManager.DayProgress(在一个游戏日内从 0 到 1,日长为 MCESettings 中的 DayLengthInSeconds):
| 时段 | 时间 |
|---|---|
Dawn | 05:00 - 06:59 |
Day | 07:00 - 16:59 |
Dusk | 17:00 - 18:59 |
Night | 19:00 - 04:59 |
把只在特定时段(或天气 )出现的怪物放入同一个集合的 Encounters Per Moment(或 Per Weather)列表中;无需单独的资产。
形态遭遇
WildEncounter 通过其 Form Calculator 选择形态,这是一个有两个方法的 EncounterFormCalculator 资产:GetEncounterForm(sceneInfo, encounterType) 返回要生成的形态,GetAllPossibleForms() 列出它能产生的所有形态(图鉴会用到)。
MCE 附带 SingleFormEncounter(Create > MCE > Battle > Encounters > Calculators > SingleFormEncounter),它总是返回一个固定的形态。对于取决于地区或日历的形态,请继承 EncounterFormCalculator:
[CreateAssetMenu(menuName = "MyGame/Encounters/Form By Region")]
public class FormByRegion : EncounterFormCalculator
{
[SerializeField] private Region NorthRegion;
[SerializeField] private Form NorthForm;
[SerializeField] private Form SouthForm;
public override Form GetEncounterForm(SceneInfo sceneInfo, EncounterType encounterType) =>
sceneInfo.Asset.Region == NorthRegion ? NorthForm : SouthForm;
public override List<Form> GetAllPossibleForms() => new() { NorthForm, SouthForm };
}
特殊遭遇模式
钓鱼
钓鱼遭遇需要地图 SceneInfo 上的 CanFishHere,以及其 Encounters 组中每种鱼竿类型(FishingOldRod、FishingGoodRod、FishingSuperRod)的 WildEncountersSet。玩家使用哪种鱼竿决定由哪个集合响应。
传说 / 一次性遭遇
对于只应发生一次的特殊遭遇:
- 使用带有 SingleWildFight 节点的 CommandGraph 事件,而不是随机遭遇。
- 用针对游戏变量(例如
LegendaryDefeated)的 IfBool 节点保护它。 - 战斗之后,用 SetBoolVariable 设置该变量,以防止再次遭遇。
- 这种方式让你完全控制遭遇的上下文(过场动画、对话、地形)。