大家好,
这是一份针对Unity的东西,但是我认为UE5的蓝图也会有同样的想法。
我在我的多人游戏中发现的一个小设计点,昨天让我省去了很多预设/网络相关的问题。要是要增加新的船只类型,游戏会变得非常无聊,而当我在单人模式下添加不同的机器人行为时,使用相同的Kenny低保真船只变得很难向玩家传达变化和差异。
最初,显而易见的方法是:
>
这在单人模式下是有效的,但是当你记得这是一个多人游戏时,所有玩家都需要看到正确的船只,网络化的对象需要保持一致,生成更多麻烦,开始创建一个预设动物园,仅仅是为了一个视觉差异。
所以我改变了我的方法。
我有 一个逻辑玩家预设。
这个预设并不关心船只的外观。它只代表玩家/网络/模拟的方面。
船只视觉效果是通过 PlayerSlotsNet.cs 来选择的。例如:
玩家插槽0 -> 船只视觉效果0
玩家插槽1 -> 船只视觉效果1
玩家插槽2 -> 船只视觉效果2
每个人都收到相同的网络化插槽数据,每个客户端本地激活正确的视觉子物体。网络负载为零,代码库受损非常低,因为我仍然实例化同一个预设。
预设结构大致如下:
预设根
逻辑游戏对象
视觉根变体
视觉变体1
视觉变体2
视觉变体3
锚定位置
特效
枪支/烟囱/其他锚点
关键点是 视觉完全与模拟分离。我的模拟不知道mesh、子物体、粒子系统、烟囱变换或Unity视觉相关的任何东西。
模拟说:
这个船只存在
这个船只的位置
这个船只的旋转
这个船只的血量
这个船只的玩家插槽/视觉id
然后视觉层说:
插槽说视觉2,所以我启用视觉变体2
这就是全部了。
视觉层是只读的。它读取网络/模拟状态并呈现它。它永远不会将游戏状态写回。
这个规则帮助了很多:
>
它也使预设更容易理解。
以前是:
红船只预设
蓝船只预设
重船只预设
快船只预设
网络化的红船只预设
网络化的蓝船只预设
...
现在我有:
一个网络化的玩家预设
一个视觉变体父级
一个决定哪个子物体可见的整数
锚定位置也尽可能地保持在变体外。
所以像:
特效生成点
烟囱点
相机目标
UI/船只名称标签锚点
命中VFX锚点
即使船只外观mesh变化也可以保持稳定。 (这是一种阻碍,但只是因为我在约束中紧密地保持它们,所以我昨晚就能在一夜之间完成变体工作)
这意味着游戏可以在不触摸模拟或网络代码的情况下切换船只视觉效果。
对我来说,最大的教训是,在多人游戏中,视觉多样性并不总是需要成为网络预设多样性。
这不是一个巨大的突破,但它使项目变得更加干净,并且消除了大量可能的麻烦bug和编辑大量不同预设的视觉和锚点。
评论 (0)