跳到主要内容

野生遭遇系统

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

一号道路的高草丛

玩家所站的图块就是全部的触发条件。EncounterTile 标记图块及其 类型,WildEncountersSet 说明那里栖息着什么以及等级多少,地图的 SceneInfo 把 二者联系起来,而每一步踏上遭遇图块都要按几率判定。

遭遇如何运作​

  1. 玩家完成一步,踏上带有 EncounterTile 的图块(在地下城场景中则是任意图块)。
  2. 这一步按该图块 EncounterType 的遭遇几率判定。
  3. 如果判定成功,地图的 SceneInfo 提供该类型的 WildEncountersSet。系统构建当前时段和天气下可能的遭遇列表,并按权重选出一个条目。
  4. 在该条目的 MinLevel 和 MaxLevel 之间抽取一个等级。
  5. 驱虫剂或队伍首发怪物仍可取消该遭遇(见下文)。
  6. 用被选中怪物的物种、等级和形态创建一个 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 MomentNight、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
怪物权重实际几率
Leafpup4040/100 = 40%
Windling3030/100 = 30%
Silkworm2020/100 = 20%
Sparkbit1010/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):

时段时间
Dawn05:00 - 06:59
Day07:00 - 16:59
Dusk17:00 - 18:59
Night19: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。玩家使用哪种鱼竿决定由哪个集合响应。

传说 / 一次性遭遇​

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

  1. 使用带有 SingleWildFight 节点的 CommandGraph 事件,而不是随机遭遇。
  2. 用针对游戏变量(例如 LegendaryDefeated)的 IfBool 节点保护它。
  3. 战斗之后,用 SetBoolVariable 设置该变量,以防止再次遭遇。
  4. 这种方式让你完全控制遭遇的上下文(过场动画、对话、地形)。

双打野生战斗​

DoubleWildFight 节点从 CommandGraph 发起针对两只野生怪物的双打战斗。

驱虫剂与遭遇预防​

玩家可以使用道具来防止遭遇。驱虫剂是带有步数 RepelAmount 的 Repel 道具,通过 UseRepel 效果使用:

道具效果
驱虫剂(任何 Repel 道具)在 RepelAmount 步内,取消等级低于队伍首发怪物等级的遭遇

驱虫剂实现为玩家身上的步数计数器(repelCounter,每走一步递减)。检查发生在遭遇被选中且等级被抽取之后:计数器大于零且等级低于首发时,遭遇被取消。队伍首发怪物的特性也可以取消遭遇(ShouldPreventEncounter)。每个驱虫剂道具的步数由你在它的资产中决定。

在线游戏​

在 MMORPG 层,遭遇由服务器决定:客户端携带场景名称和遭遇类型发起请求(StartWildEncounter),服务器回复物种和等级。如果服务器拒绝,遭遇会被取消;它绝不会在本地被解析。参见战斗权威。

最佳实践​

  1. 平衡遭遇几率。太高(>25%)令人烦躁。太低(<5%)让世界显得空旷。通常为 8-15%。
  2. 让等级随进度缩放。一号道路应该是 2-5 级的怪物,而不是 50 级。
  3. 让不同地图的遭遇表有所区别。每条道路都应该有不同的感觉。
  4. 加入稀有遭遇。每张表中放一个低权重条目,能给玩家一个值得追寻的目标。
  5. 测试按时段的遭遇。玩家不应觉得在特定时间游玩就受到惩罚。
  6. 尽早放置驱虫剂。玩家喜欢在游戏中期之前就能控制遭遇。