ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

局域网联机游戏原型搭建:Unity+Mirror大世界探索方案

局域网联机游戏原型搭建:Unity+Mirror大世界探索方案 《BigWalk》这个项目目标是做一个小型可局域网在线联机游玩的游戏元宇宙原型。从名字来看它的玩法核心包含两点Big 代表大世界探索地图Walk 代表玩家以步行方式在大地图中自由移动。这类玩法对网络层的要求并不高不像竞技射击类需要 60Hz 以上的高频同步但依然要把房间管理、位置同步、消息广播、异常断线这些基础问题处理好。本文不是某个现成整合包的评测而是一套可以直接参考落地的构建方案。我们会从技术选型、网络架构、环境准备、部署启动、功能验证、协议设计、性能观察和常见排错入手把局域网联机游戏原型从零到可玩状态的全链路过一遍。如果你正在做课程设计、游戏开发练习或者想在宿舍/教室局域网里跑一个多人大世界 Demo这篇文章可以直接作为实施清单使用。1. 核心能力速览能力项说明项目类型多人联机大世界探索游戏原型游戏元宇宙玩法定位大地图步行探索、玩家同屏交互、房间内文本聊天网络模型Host/Client房主即服务器可选专用 Headless 服务端同步策略状态同步为主事件型逻辑用 RPC 广播目标引擎Unity Mirror也可替换为 Godot ENet 或 Unreal 自带复制局域网接入同一子网内通过 IP端口连接支持手动输入地址加入默认端口7777UDP可按实际环境修改最低环境一台开发机 两台联机设备即可验证多人规模原型阶段建议 4 到 16 人超出后需优化同步频率批量能力可挂载虚拟机器人客户端做压力测试扩展接口网络消息协议可扩展预留调试管理通道表格里的端口、帧率、人数上限都是在方案设计阶段给出的默认参考值实际项目完全可以根据需求调整。下面会分别说明这些参数是怎么定的以及调整后需要注意什么。2. 适用场景与使用边界局域网联机非常适合这几类场景课堂教学演示、校园比赛临时服、宿舍联机、技术原型验证以及想快速验证“大世界同屏交互”玩法的小团队。它的核心优势是延迟低、不需要公网服务器、不依赖外部账号体系整个网络环境由自己控制。但也要清楚它的边界。第一它不解决公网玩家接入问题如果团队不在同一物理房间需要通过其他方式组网后才能访问。第二局域网内默认不设复杂认证任何能访问该网段的设备都可能看到房间列表所以不适合承载正式运营、含付费道具的业务。第三《BigWalk》如果后续加入用户生成内容、图片/音频上传、语音对话等功能要特别注意素材版权和用户隐私不能拿未经授权的素材放进项目里做演示或发布。合规方面重点提醒三点不要在未授权情况下采集或抓取局域网内其他设备的流量不要利用局域网联机功能绕过游戏平台规则项目里出现的角色、音乐、图标等素材如果是第三方资源需要确认授权范围。3. 局域网联机方案选型3.1 帧同步还是状态同步《BigWalk》这种大世界探索玩法我更推荐状态同步。原因是地图大、实体多、交互分散帧同步会把大量输入指令广播给所有客户端网络带宽和计算成本会随人数上升得非常快。状态同步只需要同步变化的状态例如位置、朝向、动画状态、当前所在区域逻辑计算集中在服务器端客户端按固定频率插值渲染即可。帧同步适合格斗、RTS 这类需要严格一致性判定的游戏但在大世界里玩家各自探索互相影响相对有限状态同步在带宽和多端一致性之间更容易取得平衡。3.2 传输层选择局域网环境网络质量通常较好丢包率低延迟稳定在几毫秒到几十毫秒。传输层可以直接使用基于 UDP 的可靠传输方案例如Unity 自带 NetworkTransport 或 Unity TransportUTPMirror 默认的 TelepathyTCP或 KCPUDP 可靠Godot ENet独立游戏服务器框架中的 LiteNetLib、KCP如果采用 Unity Mirror默认配置即可满足原型阶段使用。Mirror 把传输层、消息序列化、游戏对象同步都封装好了网络代码写起来比直接用 Socket 快很多。需要注意的是一旦选定传输层后期替换成本较高所以第一步就要根据目标平台确定方案。3.3 房间发现方式局域网最常见的房间发现方式是 UDP 广播。房主启动后向局域网内广播房间信息客户端监听广播包并自动填入房间列表。另一种更简单的方式是手动输入房主 IP客户端直接连接固定 IP 端口。《BigWalk》原型阶段建议两种都支持默认自动发现找不到房时允许手动填 IP。广播半径一般限制在当前网段跨网段路由器隔离时自动发现会失效手动 IP 是兜底方案。4. 环境准备与前置条件搭建这个项目需要准备以下环境。不同引擎有细微差别这里以 Unity Mirror 为例。4.1 开发机环境Unity 2022.3 LTS 或更高版本安装时勾选 Windows/Mac/Linux Build Support从 Unity Asset Store 或 Mirror 官方仓库导入 Mirror 包开发机建议 8GB 内存以上显卡无硬性要求原型场景足够简单时集成显卡也能跑局域网内至少有两台设备其中一台可以作为 Host4.2 局域网网络条件联机设备需要在同一子网。如果你把开发机、测试机都接到同一个家用路由器或交换机下通常就是同一子网。需要注意路由器开启 DHCP 没问题但建议给房主设备配置静态 IP避免重启后 IP 变化导致其他客户端无法加入不要开启“AP 隔离”之类的功能否则设备之间无法互相访问Windows 防火墙需要放行所选端口或者临时允许 Unity 项目通过防火墙4.3 磁盘与项目结构预留至少 5GB 空间包含引擎缓存、项目资源和构建产物。建议把项目目录划分清楚BigWalk/ Assets/ Scripts/ Network/ Gameplay/ UI/ Prefabs/ Scenes/ Packages/ Builds/ Server/ Client/这样后续打包服务器和客户端时可以分目录输出避免混淆。5. 联机架构设计《BigWalk》的架构推荐采用 Host/Client 模式作为第一版。房主设备同时运行服务器逻辑和玩家客户端其他玩家通过局域网连接房主。这可以省掉一台专用服务器适合原型验证。5.1 核心对象划分场景中维护以下网络对象NetworkManager负责连接、房间创建、场景切换Player 预制体包含 NetworkTransform、网络动画同步、玩家控制脚本WorldManager管理地图分块加载、生成 NPC 和可交互资源ChatManager负责聊天消息的 RPC 广播RoomManager维护房间内玩家列表、加入/离开逻辑5.2 同步组件和脚本Player 预制体上挂 NetworkTransform使用默认的同步间隔同时监听OnStartLocalPlayer区分本地控制和远程控制。关键代码如下using UnityEngine; using Mirror; public class PlayerController : NetworkBehaviour { public float moveSpeed 5f; private CharacterController controller; void Start() { controller GetComponentCharacterController(); } void Update() { if (!isLocalPlayer) return; float horizontal Input.GetAxis(Horizontal); float vertical Input.GetAxis(Vertical); Vector3 direction new Vector3(horizontal, 0, vertical); controller.Move(direction * moveSpeed * Time.deltaTime); } }远程玩家的位置由 NetworkTransform 自动插值。如果发现角色抖动可以调整 NetworkTransform 的同步间隔或者在本地做平滑插值。5.3 房间创建与加入Mirror 的NetworkManager本身就提供 Host、Server、Client 三种启动模式。在 UI 上做三个按钮分别绑定using UnityEngine; using Mirror; public class LobbyUI : MonoBehaviour { public void OnHostClicked() { NetworkManager.singleton.StartHost(); } public void OnClientClicked(string serverAddress) { NetworkManager.singleton.networkAddress serverAddress; NetworkManager.singleton.StartClient(); } }这里 networkAddress 需要设置为房主设备在局域网内的 IP。可以在局域网设置里查看也可以在代码里读取本机网卡 IP 自动填入减少手动输入错误。6. 部署启动与局域网访问6.1 房主启动流程在 Unity 编辑器里直接点击 Play 并调用 StartHost就是一种最简单的启动方式。但更贴近真实使用的方式是打包客户端因为编辑器会占用大量性能联机测试时帧率容易受影响。打包步骤# 打开 Build Settings选择目标平台然后执行 Build ./BigWalkClient.exe启动后可以看到主菜单点击“创建房间”按钮。此时该程序同时承担服务器和玩家客户端角色局域网内的其他设备就可以通过“加入房间”按钮连接。6.2 客户端加入流程客户端启动后在输入框填写房主设备的局域网 IP例如192.168.1.100端口保持默认7777。点击“加入房间”如果一切正常玩家角色会出现在地图出生点。在控制台或 UI 上显示连接状态是必要的。Mirror 提供NetworkClient.isConnected和NetworkServer.active可以在 UI 上显示当前模式void Update() { if (NetworkServer.active NetworkClient.isConnected) statusText.text Host 模式; else if (NetworkServer.active) statusText.text Server 模式; else if (NetworkClient.isConnected) statusText.text Client 模式; else statusText.text 未连接; }6.3 防火墙放行Windows 防火墙默认会阻止未识别的程序监听端口。第一次启动时系统会弹出防火墙授权窗口勾选“专用网络”并允许访问。如果客户端连不上优先检查这一步。也可以手动放行# 以管理员身份运行 PowerShell New-NetFirewallRule -DisplayName BigWalk UDP 7777 -Direction Inbound -Protocol UDP -LocalPort 7777 -Action Allow6.4 专用服务器模式当参与者超过 4 人或者房主不想占用自己电脑性能时可以把项目构建成无头服务器if (SystemInfo.graphicsDeviceType GraphicsDeviceType.Null) { // 无头模式直接启动服务器 NetworkManager.singleton.StartServer(); }在构建设置里选择“Server”构建目标Unity 会自动生成无图形界面的服务器程序。把它放到一台常开的电脑或者云服务器上客户端连接该设备的局域网 IP 即可。这种方式更接近真实部署。7. 功能测试与效果验证7.1 本地双开测试第一步先在开发机上同时运行一个服务器实例和一个客户端实例。在 Unity 编辑器里启动 Host再在旁边运行一个打包好的客户端或者用编辑器“Play Mode”加“Multiplayer Play Mode”插件来做双开。判断成功的标准第二个客户端能加入房间两个角色都能移动彼此能看到对方位置变化关闭 Host 后客户端能收到断线提示。7.2 局域网双机测试准备两台电脑A 机作为 HostB 机作为 Client。在 A 机用ipconfig查看局域网 IPv4 地址B 机在加入界面填写该地址。这里最容易出的问题是防火墙。如果 B 机一直卡在“连接中”去 A 机检查防火墙规则并确认 A 机网络配置文件是“专用网络”而不是“公用网络”。7.3 多人同步测试加入至少三个角色分别操作移动、跳跃、播放动画。观察以下指标角色位置是否平滑是否出现明显回跳动画是否同步视角切换是否正常如果出现回跳优先把 NetworkTransform 的插值参数调大或者降低服务器发送频率避免每帧都发送位置信息造成带宽浪费。7.4 聊天消息测试在 UI 输入框输入文本并发送所有客户端都应该看到消息同时显示发送者名字。这是验证 RPC 广播是否正常的最快路径。using Mirror; public class ChatManager : NetworkBehaviour { public void SendChat(string message) { CmdSendChat(message); } [Command(requiresAuthority false)] private void CmdSendChat(string message) { RpcReceiveChat(${connectionToClient.connectionId}: {message}); } [ClientRpc] private void RpcReceiveChat(string message) { Debug.Log(message); } }如果只有发送者能看到消息说明 Command/Rpc 的权限或通道配置有问题。7.5 断线重连测试把客户端进程强制结束检查服务器和其他客户端是否正常。再把客户端重新打开并加入检查是否能恢复之前的玩家状态。大项目里常会加断线重连机制把玩家数据暂时保存在短时间重新连接后恢复这一项至少要先验证“断线不影响其他人”。7.6 批量机器人压力测试原型阶段可以用脚本批量生成机器人客户端目的是观察服务器在 8、16、32 个角色同时移动时的表现。可以使用 Unity 的StartClient创建多个客户端或者直接在服务器端生成 AI 控制器复用同一个客户端逻辑。public class BotSpawner : MonoBehaviour { public GameObject botPrefab; public int count 16; void Start() { for (int i 0; i count; i) { GameObject bot Instantiate(botPrefab); bot.name $Bot_{i}; } } }这种测试能快速暴露网络同步瓶颈建议在正式联机测试前先跑一遍。8. 网络消息协议与扩展接口8.1 消息类型定义局域网联机中网络消息分为三类连接管理、世界状态、玩家交互。建议把消息类型集中定义方便后期维护。public enum NetMsgType : byte { JoinRoom 1, LeaveRoom 2, PlayerMove 11, PlayerAnim 12, ChatMsg 21, }Mirror 内部已经处理了 GameManager、Player 等消息这里主要扩展自定义消息。自定义消息类可以这样写public struct ChatMessage : NetworkMessage { public uint senderId; public string content; }在客户端注册消息处理NetworkClient.RegisterHandlerChatMessage(OnChatMessage); void OnChatMessage(ChatMessage msg) { chatLog.text $\nPlayer {msg.senderId}: {msg.content}; }8.2 预留管理调试接口局域网原型阶段可以预留一个管理接口用于查看当前在线人数、调试机器人数量、发送服务器公告。最简单的做法是在 Host 端加一个本地调试面板不做 Web 接口。如果团队后续想从外部控制服务器可以加一个小型 HTTP API 服务监听另一个端口与游戏 UDP 通信分开。需要注意有 HTTP 管理通道后必须限制访问范围不能监听公网地址否则局域网内其他人也能控制服务器。8.3 批量任务扩展游戏业务里的“批量任务”通常指批量生成 NPC、批量发送通知、批量加载地图区块。在《BigWalk》里WorldManager 可以维护一批 NPC 的同步public class WorldManager : NetworkBehaviour { public Transform[] spawnPoints; public GameObject npcPrefab; [Server] public void SpawnNpcs() { foreach (Transform point in spawnPoints) { GameObject npc Instantiate(npcPrefab, point.position, point.rotation); NetworkServer.Spawn(npc); } } }批量生成的 NPC 会随服务器自动同步到所有客户端不需要为每个 NPC 手写连接代码。9. 资源占用与性能观察9.1 显存与内存游戏联机是否吃显存主要看场景复杂度。《BigWalk》如果是低多边形风格、贴图尺寸小、同屏物体数量有限集显都能跑如果加入高精度模型、大尺寸贴图、大量动态光影显存需求会快速提高。原型阶段建议控制场景资源先保证联机逻辑顺畅再回头优化画面。9.2 带宽估算一个角色每帧同步位置、朝向、动画状态如果按 30Hz 发送每个数据包大约 50 到 100 字节。10 个玩家时服务器每秒接收约 30KB客户端每秒接收约 300KB这个量级在局域网内完全无压力。但如果把同步频率提到 60Hz并且每个角色同步大量自定义属性带宽会成倍增长。更稳妥的做法是降低同步频率例如 10Hz 到 15Hz然后在客户端做插值。人物移动看起来还是会平滑同时带宽开销低。Mirror 的 NetworkTransform 支持设置 Sync Interval可以分别实验 0.1、0.05、0.02 三个档位观察效果。9.3 CPU 与物理计算服务器端要跑物理引擎如果 32 个玩家角色同时使用 CharacterControllerCPU 占用会明显增加。可以做一个简单实验16 个机器人时打开 Unity Profiler看 Physics.Simulate 和 Network 模块占用的毫秒数。如果 Physics 占比过高把场景中非必要刚体全部换成静态碰撞体或者降低物理更新频率。9.4 如何观察性能Windows 上用任务管理器看 CPU 和内存Unity 中用 Profiler 看网络、物理和渲染也可以在游戏里加一个简单的 FPS 显示脚本同步记录网络延迟。这些数据要统一记录做压测后对比判断优化是否有效。10. 常见问题与排查方法问题现象可能原因排查方式解决方案客户端找不到房间列表UDP 广播被防火墙拦截查看客户端日志和防火墙规则放行 UDP 端口或用手动 IP 连接客户端提示无法连接房主 IP 填写错误或端口未放行在客户端 ping 房主 IP确认 IP 正确检查防火墙和端口角色位置回跳/抖动NetworkTransform 同步频率过高或插值不足打开 Profiler 查看同步包降低同步频率调整插值参数加入房间后黑屏场景没有正确同步检查 NetworkManager 的 Online Scene 设置在 NetworkManager 中配置场景注册只有自己能看到聊天消息RPC 权限或注册错误查看 Console 日志检查requiresAuthority和 Handler 注册房主关闭后所有人掉线Host/Client 模式没有 RoomManager 转移对照组测试原型阶段接受此行为或迁移专用服务器多人同屏后帧率下降模型面数过高或网络序列化开销大Profiler 查看 Rendering/Network优化场景资源降低同步频率局域网内 IP 变化导致无法连接DHCP 动态分配ipconfig查看当前 IP在路由器中绑定静态 IP杀毒软件拦截游戏程序安全软件误报查看安全日志将项目目录加入信任列表排查的第一步永远是看日志。UI 上可以加一个 Log 面板把连接事件、错误信息、异常堆栈显示出来能省掉大量反复切换窗口的时间。11. 最佳实践与合规提醒11.1 实施建议第一次联机测试先把人数控制在 2 到 4 人用最简单的场景验证网络链路。确认链路通了再去加玩法系统否则一旦网络和玩法耦合在一起出问题很难定位。网络对象和数据流的命名从一开始就要规范例如所有玩家相关对象统一前缀Player_所有聊天消息统一chat_开头。项目到后期会积累大量脚本和预制体命名混乱的话维护成本会指数上升。每台联机设备分配固定编号或角色名日志里记录设备标识和玩家的对应关系方便多人测试时定位问题。11.2 工程目录管理服务端和客户端资源要分开维护。服务器不需要渲染相关资源不打包 UI 和音效可以减小构建体积并降低内存占用。模型和动画素材放在共享公共目录构建时按类型引用。输出日志、崩溃报告单独建Logs目录和临时文件区分开。11.3 合规提醒做多人联机测试时至少要在项目里加一个简单的“测试环境”标识避免和正式环境混淆。如果将来把《BigWalk》用于发布或教学公开课所有素材必须确认授权角色模型、皮肤贴图、背景音乐、UI 图标来源清楚。局域网联机不涉及公网用户数据但仍要遵守个人信息保护的基本要求不要在日志里记录无关的个人信息不要采集玩家聊天内容用于其他用途。12. 下一步扩展方向《BigWalk》原型跑通后有几个清晰的扩展方向可以按优先级推进。先把“房间退出和重新加入”的完整流程做好这是多人游戏体验稳定的基础。接着把地图分块加载做出来玩家进入某个区域时只同步该区域的 NPC 和交互对象这样地图可以扩大到几百米乘几百米而不会拖垮同步性能。如果需要在更大范围测试可以把服务器构建成 Headless 模式放在独立机器上然后挂载 30 到 50 个虚拟机器人做一晚稳定性测试看日志有没有内存泄漏、断线重连处理是否正常。从原型到可玩的《BigWalk》游戏元宇宙最核心的不是画面和玩法堆料而是把网络层的每个基础环节都验证到位连接建立、状态同步、消息广播、异常恢复、带宽控制。希望你照着这份清单搭完之后能对自己的局域网联机项目有更直观的判断。
返回列表