mcpField
U
unity-networking

unity-networking

github.com/josiahsiegel开发5999 次安装19 周前更新
代码仓库

关于 unity-networking

面向 Unity 多人游戏及后端功能开发者的参考资料,比较网络框架,并介绍权威模型、多人游戏模式、REST 与 WebSocket 通信以及 Unity Gaming Services。

主要功能

  1. 01网络框架比较
  2. 02Netcode for GameObjects 设置与组件
  3. 03权威模型和 RPC 模式
  4. 04大厅、对象生成与场景同步
  5. 05REST 与 WebSocket 集成
  6. 06Unity Gaming Services 概览

适用场景

  1. 01为 Unity 游戏选择网络框架
  2. 02设计服务器权威的玩家操作
  3. 03构建大厅与 Relay 连接流程
  4. 04将游戏功能连接到后端 API 或服务

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill unity-networking

安装后在 Claude Code 中输入/unity-networking确认已加载。

详细介绍

Unity 网络与多人游戏

概述

Unity 多人游戏系统和后端服务实现参考。涵盖主要网络框架、权限模型、常见多人游戏模式,以及 Unity Gaming Services 集成。

网络框架对比

框架类型适用场景许可证
Netcode for GameObjects (NGO)客户端托管 / 专用Unity 原生项目、UGS 集成免费(Unity)
Mirror客户端托管 / 专用开源替代方案、成熟的生态系统MIT
Photon PUN 2云托管快速原型开发、基于房间的游戏免费层级 + 付费
Photon Fusion 2云托管 / 可自托管竞技游戏、基于 Tick 的模拟免费层级 + 付费
Fish-Net客户端托管 / 专用对性能要求高的场景、Mirror 替代方案MIT

Netcode for GameObjects (NGO)

设置
  1. 通过 Package Manager 安装:com.unity.netcode.gameobjects
  2. 将 NetworkManager 添加到场景中的 GameObject
  3. 选择传输方式(默认使用 Unity Transport)
  4. 为网络化预制件添加 NetworkObject 组件
  5. 在 NetworkManager 的预制件列表中注册预制件
核心组件
组件用途
NetworkManager管理连接、生成和场景管理
NetworkObject所有网络化 GameObject 都必须添加此组件
NetworkBehaviour网络化脚本的基类(替代 MonoBehaviour)
NetworkVariable<T>带所有权 / 权限控制的同步变量
NetworkTransform自动同步位置 / 旋转
NetworkAnimator自动同步 Animator 参数
RPC(远程过程调用)
public class PlayerCombat : NetworkBehaviour
{
    NetworkVariable<int> _health = new(100,
        NetworkVariableReadPermission.Everyone,
        NetworkVariableWritePermission.Server);

    [ServerRpc]
    void AttackServerRpc(ulong targetId)
    {
        // Runs on server - validate and apply damage
        if (!IsServer) return;
        var target = NetworkManager.SpawnManager.SpawnedObjects[targetId];
        target.GetComponent<PlayerCombat>().TakeDamage(10);
    }

    [ClientRpc]
    void PlayHitEffectClientRpc(Vector3 position)
    {
        // Runs on all clients - visual feedback only
        Instantiate(hitVFX, position, Quaternion.identity);
    }

    void TakeDamage(int amount)
    {
        _health.Value -= amount;
        PlayHitEffectClientRpc(transform.position);
    }
}
RPC 类型方向用途
[ServerRpc]客户端 -> 服务端玩家操作、请求
[ClientRpc]服务端 -> 所有客户端VFX、音效、UI 更新
[ClientRpc(SendTo.Owner)]服务端 -> 所有者客户端针对所有者的反馈
NetworkVariable 权限
// Server-writable (default) - authoritative state
NetworkVariable<int> score = new(0, writePerm: NetworkVariableWritePermission.Server);

// Owner-writable - client-authoritative (use sparingly)
NetworkVariable<Vector3> cursorPos = new(writePerm: NetworkVariableWritePermission.Owner);

使用 OnValueChanged 回调来响应 UI 变化:

_health.OnValueChanged += (oldVal, newVal) => healthBar.value = newVal;

权限模型

模型描述适用场景
服务端权威服务端验证所有操作,客户端保持轻量竞技游戏、反作弊至关重要的场景
客户端权威客户端拥有自身状态,服务端负责转发合作游戏、基于信任的场景
客户端预测 + 服务端校正客户端在本地进行预测,服务端负责校正FPS、快节奏动作游戏
中继 / 监听服务器一名玩家负责托管,其他玩家通过中继连接休闲游戏、小型大厅
服务端权威流程
Client: Press "Attack" -> Send ServerRpc(targetId)
Server: Validate range/cooldown -> Apply damage -> Update NetworkVariable
Server: Send ClientRpc for VFX
All Clients: Play hit effect

永远不要信任客户端数据。在服务端验证位置、冷却时间、弹药和视线范围。

常见多人游戏模式

大厅系统
1. Player authenticates (UGS Auth / custom)
2. Player creates or joins lobby (UGS Lobby / custom)
3. Lobby fills -> host starts game
4. Relay allocation for NAT traversal (UGS Relay)
5. All players connect to relay
6. NetworkManager starts host/client
生成与销毁
// Server-side spawning
var instance = Instantiate(prefab, spawnPoint, Quaternion.identity);
instance.GetComponent<NetworkObject>().SpawnWithOwnership(clientId);

// Server-side despawning
networkObject.Despawn(); // Removes from all clients
场景管理

使用 NetworkManager.SceneManager.LoadScene("GameScene", LoadSceneMode.Single) 同步加载场景。只能由服务端 / 主机调用。

REST API 和 WebSocket 集成

REST API(UnityWebRequest)
async Awaitable<T> GetAsync<T>(string url)
{
    using var request = UnityWebRequest.Get(url);
    request.SetRequestHeader("Authorization", $"Bearer {token}");
    await request.SendWebRequest();
    if (request.result != UnityWebRequest.Result.Success)
        throw new Exception(request.error);
    return JsonUtility.FromJson<T>(request.downloadHandler.text);
}

简单类型使用 JsonUtility,复杂序列化使用 Newtonsoft.Json(com.unity.nuget.newtonsoft-json)。始终对 UnityWebRequest 使用 using,以防止内存泄漏。

WebSocket(NativeWebSocket / WebSocketSharp)

对于实时的非游戏通信(聊天、通知),请使用 WebSocket 库。NativeWebSocket 可跨平台运行,包括 WebGL。

Unity Gaming Services (UGS)

服务包用途
身份验证com.unity.services.authentication匿名登录/平台登录
Lobbycom.unity.services.lobby房间创建、匹配
Relaycom.unity.services.relayP2P 的 NAT 穿透
Cloud Savecom.unity.services.cloudsave服务端玩家数据
Leaderboardscom.unity.services.leaderboards排名计分板
Economycom.unity.services.economy虚拟货币、购买
Analyticscom.unity.services.analytics玩家行为追踪
Matchmakercom.unity.services.matchmaker基于技能的匹配

使用任何服务前,请先初始化 UGS:

await UnityServices.InitializeAsync();
await AuthenticationService.Instance.SignInAnonymouslyAsync();

Firebase 和 PlayFab

对于需要 Realtime Database、Cloud Functions 和 FCM 推送通知的独立/移动项目,请使用 Firebase。对于需要玩家分群、A/B 测试和自动化规则处理的 LiveOps 重度游戏,请使用 PlayFab。两者都通过各自的下载页面提供 Unity SDK。

更多资源

参考文件
  • references/netcode-advanced.md -- 客户端预测与校正的实现、兴趣管理、网络 LOD、带宽优化、自定义序列化、传输层配置
  • references/backend-services.md -- UGS 详细设置指南、Firebase/PlayFab 集成模式、REST API 架构、身份验证流程、排行榜与经济系统实现

评论

支持 Markdown