刷怪、触发器、AI 与掉落 private
刷怪、触发器、AI 与掉落
回答“Spawner 如何被 Trigger 激活、谁拥有刷怪权威、随机组、AI 和掉落怎样衔接”。
8. 刷怪、触发、AI 与掉落
8.1 地图怪物生成链
flowchart LR
A[MonsterSpawnerElement] --> B[MapProcessor]
B --> C[MapEntity + Blueprint]
C --> D{关联 Trigger?}
D -- 否 --> E[MapLoaded SpawnEvent]
D -- 是 --> F[Collider TriggerEnter]
F --> G[MapTriggered SpawnEvent]
E --> H[SignalFilter]
G --> H
H --> I[SignalSpawnSystem]
I --> J[克隆 Blueprint 为 CoreEntity]
J --> K[Actor/View 或网络同步]
Blueprint 包含 ObjectType、SpawnData/SpawnId、Monster 标记、OverrideProperties、SignalFilter 和 Delay。
无 Trigger 的普通怪由 MonsterGlobalSpawnTriggerSystem 在地图加载时发 MapLoaded。有 Trigger 的怪不会自动走这条路径;碰撞进入后,MapTriggerSystem 叠加 Trigger 与目标延迟,再发 MapTriggered。SignalSpawnSystem 仅在 SignalFilter 匹配时克隆 Blueprint。
8.2 谁负责刷怪
工程有普通 Spawn System 和 HostClient* 版本。HostClient 版本通过 IsHost 门控,避免每台客户端都重复刷怪。联机战斗中,Battle 负责创建/保存 Monster 实体并分配 playerId,但当前项目没有在 Battle 服务器运行一套等价于 Unity EnemyStateMachine 的完整 AI Think。服务端把怪物控制权交给 Scene.HostPlayerId 对应的客户端;该客户端执行目标搜索、追击、NavMesh 移动和技能状态机,再把同步包发回 Battle。
新增玩法前必须选清模型:单机本地、玩家 Host 权威、独立 Battle 权威。System 组合错误会直接导致重复刷怪或完全不刷。
8.3 随机组、波次和 AI
- 地图控制出生位置、触发关系、巡逻点、范围和局部覆盖。
Monster配置控制基础属性、模型、移动、技能和掉落。MonsterRandomPool/Plan/Group与Gameplay_*表控制随机组合及玩法波次。- 服务端按权重和玩法条件选择随机组,并把模板下标放入
SceneInfo。 - 训练场和特定波次玩法还有独立 Spawner Manager/状态机,应从对应
Battle*玩法类继续追。
地图覆盖只提供出生点、巡逻点、触发关系和 AI 初始参数。实际的 Idle/Chase/Attack/Skill 状态切换由当前 Host 客户端的 EnemyStateMachine 执行;服务端 Monster 保存属性、机器状态、死亡/掉落等共享结果,并做基础校验与广播。联网模式的 HP、死亡、奖励仍应以 Battle 的结果为准,非 Host 客户端只消费同步结果。
8.4 当前项目的联网怪物控制链
刷怪系统/地图触发
-> Battle 创建 Monster + 配置属性
-> MonsterMgr 纳入场景实体列表
-> Scene.HostPlayerId 分配 Monster.playerId
-> Host 客户端 ChangeControllerSystem 接管
-> EnemyStateMachine 目标搜索与状态决策
-> MoveController/NavMesh + 技能系统执行
-> MoveBegin/StateSync/FrameStateSync 回 Battle
-> Battle 校验归属并广播给观察者
不要把服务端字段 Monster.machineState 看成服务器正在运行完整 AI。它主要是服务端保存客户端上报/同步的机器状态,用于 Boss 是否允许被技能选中等服务端规则;代码中没有对应 Unity SearchAndLockTarget 的服务端 Think 循环。
8.5 新增怪物 SOP
- 在 Monster 源表新增或复用配置 ID,确认模型枚举、HP、移动、技能、掉落。
- 随机或波次玩法同时维护 Pool、Plan、Group/Gameplay 表。
- 重新生成客户端和服务端配置。
- 地图放置 Spawner,填写 ID、SignalFilter、Delay 和覆盖项。
- 需要区域触发时建立 Trigger 到 Spawner 的目标关系。
- 运行地图检查,导出并同步同版地图到两端。
- 服务端确认 Monster Entity 创建/激活,客户端确认是网络实体而非重复本地创建。