大家好!我想和大家分享我为3D合作类生存游戏开发的武器系统架构。目标是在保持清洁和多人游戏支持的同时,实现复杂的协同作用(像Magicraft或Noita一样)。

以下是技术的分解:三个支柱:

1. 将“火”与“冲击”分离 我将武器分为了两个不同的ScriptableObject层:

  • AttackLogic: 定义了攻击方式(例如,ProjectileAttackMeleeSwingChainLightning)。 它不关心碰撞时的效果。
  • HitEffect: 定义了碰撞时的效果(例如,AoEExplosionStatusApply)。 这样我就可以使用同样的“弹射”逻辑来制作火箭、毒液瓶或大气。

2. 剩余有效载荷系统(秘方) 最有帮助的部分是如何处理.hit序列。 每个 HitEffect 都有一个方法: void OnHit(..., List<HitEffect> remainingPayload) 当弹射体碰撞时,它会取出一个事件列表。第一个效果(例如爆炸)执行,然后将剩余的列表传递给下一个目标。这就创建了递归“叠加”效果,没有混乱的硬编码。

3. 逻辑桥梁(递归方法) 我用一个特殊的LogicTriggerEffect来弥合逻辑的差距。这是一个能在碰撞点触发新的 AttackLogic 的HitEffect 。

  • 例子: 剑( Melee Logic)-> 撞击 -> LogicTriggerEffect -> ChainLightning(Attack Logic)。 Lightning只是另一个 AttackLogic,因此它可以有自己的 HitEffect,创建无限的协同作用。

为什么有用: 现在我就可以通过在调试器中拖拽三个脚本文件来创建“彗星召唤者”人设,而不需要任何新的C#代码。

希望这个系统能帮助更多人创建模块化系统!如果你有关于remainingPayload逻辑或NPC同步的问题,请告诉我!

本文已花费数小时,我现在只想让大家知道我构建了什么,并潜在地,如果你有兴趣,我可以提供更多详细的信息!

如果你想支持我,你可以查看我的游戏!

Riftbound Survivors