背景
我已经花了大约六个月的时间开发一个“朋友圈”标题,但是我一直在遇到软件架构能力的限制。
我认为我遇到了一个“技能问题”。
尽管如此,我还是想听听其他开发者在 Unity 中开发小规模网络多人游戏的经历,希望我不是太苛刻自己,或者说有共同的开发痛点。
从技术角度来讲,我不仅在开发游戏本身,还在试图建立可重用的系统(以最小的依赖为原则)。
例如,让我们假设我坐在那里,试图让游戏/应用程序启动到一个点,到那时我有:
- 应用程序生命周期和场景服务的基本DI或服务注册。
- Update()定时的对象hook,但不需要是MonoBehaviours。
- 一种场景管理控制器,既能处理网络场景操作,也能处理本地场景操作(在网络会话之前/之后)。
在单人游戏中,这很容易做到,但是在网络多人游戏中,这个最后一点(场景控制)就变得更加困难。然后为了使这个启动系统足够灵活和可重用,好吧,我添加了更多的复杂性。最后,我不想制作一个依赖第三方库的框架,所以我不会使用GitHub上的vContainer等第三方DI解决方案。
这只是启动系统,甚至没有使用场景加载或输入处理等服务。仅仅是启动游戏并“插入东西”。
一旦实际的网络编程进入了我的视野,我就开始寻找更强大的方法来管理连接,通过使用中继fallback来处理玩家的NAT配置,并在正确的时间同步正确的数据。
困境之地
好吧,低依赖和可重用的要求确实是自我伤害。
但Unity是否有足够的工具来构建客户端-主机监听服务器的多人游戏?
它有。基本上。
我正在使用6.3 LTS,所以我的想法是:
使用协作示例项目“Boss Room”作为起点,了解Unity如何为客户端-服务器拓扑设计了东西,然后只是适应那些设计在主机服务器上处理客户端-服务器拓扑的部分。
这个方法在我身上基本上起作用了,但不是没有很多的挫折感——主要是NGO文档从来没有给出清晰的答案,而不断地试图鼓励使用Unity的中继或其他多人服务。
挑战主要是“Boss Room”没有更新(和不会更新)到Unity 6.0 LTS(最后更新2025-08-07),而Netcode for GameObjects包在v2.4.3(当前NGO版本为6.0+的2.13)。
Boss Room使用了vContainer来处理DI。
这些挑战并不是不可逾越的,但我确实发现它们很困难。
所以在决定任何事情之前,我还研究了其他推荐的网络选项和“网络”的其他选项。
例如,FishNet,Mirror,Photon和FacePunch等。
FWIW:我没有使用FishNet,因为我很固执己见,希望Unity能够让他们的东西足够好,以便我可以避免另一个依赖项。然而,我确实试过了,它很好。
如果你像我一样固执己见,可能应该试着变得更不固执己见,因为FishNet 可能能为我节省一些挫折和生命中的小时。
最后,我基本上决定使用NGO v2.11.x来完成客户端-主机监听服务器的独立游戏。它需要一些学习和可能比使用FishNet或其他传输+框架快一些,因为Unity的一些文档在NGO上更混乱一些。这值得我,因为我认为如果这失败了,我可以轻松地开始一个新的多人游戏项目,因为我基本上只是在使用Unity API。
我目前的状态
我已经重写了我的整个“游戏开发框架”(可重用的项目模块)大约2.5次。
我不后悔任何一次重写,每次都是因为我发现我的架构在进一步开发中使得开发变得比需要的更困难。
这意味着,我基本上没有在游戏的机制上取得任何进展,哈哈。
我认为这是可以接受的。
游戏机制并不难实现。它们并不需要像构建一个“游戏开发框架”一样复杂的软件设计技能。
因为我建立了模块,我必须质疑我对软件设计原则的假设,例如SOLID,并深入学习我一直使用但从来没有准确掌握的设计模式。
我最终优化了简单性和易于使用和思考的API。
性能不是一个问题,灵活性(文本书中设计模式 可以给出的灵活性)与维护大量 boilerplate代码的代价相比,并不重要。
我仍在努力的部分,以及我对你的问题
有时我会看到其他独自开发者和小团队能够快速开发他们的“朋友圈”标题,我会感到自己很糟糕。
我会想象所有的架构挑战我遇到的,以及所有与NGO,InputSystem和UIToolkit的挫折感。
我会想,“我一定是个傻子,我对这个事情的理解太差了。
为什么这会花费我这么长时间,而这个其他开发者却能在我花费时间来使多人框架可行的时间内开发出一个整个游戏?”
这就是问题的核心。
我试图了解如何在多人开发中取得更快的进展。
我试图通过学习其他人不同的做法或共同的问题来安慰自己。
我的理论是,如果我使用了一个预先存在的第三方解决方案,如FishNet和一个模板(GitHub上有很多),我可能会取得更快的进展。
如果我完全忽略了保持可维护的系统的想法。
但我担心,如果我使用了一个第三方解决方案,玩家可能会遇到游戏破坏的问题,然后我就无法理解我的代码库,因为基础是由另一个人写的。
读懂别人的代码比写自己的代码要难得多。
TL;DR - 没有一个简短的总结,但问题仍然存在。
如果你已经开发或正在开发一个小规模的多人项目:
- 你是否快速发展?
- 你使用哪些工具?
- 你是否担心维护依赖项?
- 你是否使用模板,框架或其他预建模块?
- 你如何确保在第三方解决方案中修复玩家可能出现的问题?
- 你是否发现了一些文章或教程,感觉这些概念在某种程度上是可扩展的?
评论 (0)