Lazy loaded image
🎮Code Monkey Unity多人游戏
Words 1078Read Time 3 min
2025-7-14
2025-7-20
type
status
date
slug
summary
tags
category
icon
password
comment

1. 前置安装

  • Unity Netcode for GameObjects(版本:1.2.0)
    • 在 Package Manager 中导入:
      1. 打开 Window → Package Manager
      1. 搜索并安装 “Netcode for GameObjects”(版本 ≥ 1.2.0)。
  • Unity Transport
    • 在 Netcode 安装完成后,同样在 Package Manager 中安装 “Unity Transport”(UTP)。
  • 推荐工具
    • Quantum Console:支持在打包后实时查看日志,方便调试。

2. 核心组件:NetworkManager

  1. 在场景中新建空对象,添加 NetworkManager 组件。
  1. Transport 选择为 Unity Transport
  1. NetworkManager 下配置:
      • Player Prefab:将玩家预制体拖入。

3. 玩家预制体配置

  1. 在玩家预制体上添加 NetworkObject 组件。
  1. 将所有需要网络同步的脚本从 MonoBehaviour 改为 NetworkBehaviour,以标记它们为网络脚本。

4. 变换(Transform)同步:NetworkTransform

  • 默认行为
    • 服务器(Host/Server)权威,客户端只能被动接收同步数据。

4.1 客户端授权(Client Authority)

如果希望客户端自主移动,并向服务器汇报位置,需要重写 NetworkTransform
  • 将原来的 NetworkTransform 替换为 ClientNetworkTransform
  • 在客户端中通过 ServerRpc 告知服务器移动请求。

5. RPC 与移动控制

  • ServerRpc:客户端 → 服务器
  • ClientRpc:服务器 → 客户端
示例:
注意:RequireOwnership = false 允许非拥有者(即客户端)调用。

6. 动画同步:NetworkAnimator

  • 默认也是服务器权威
  • 同样可通过继承关闭服务器权威,实现客户端优先同步:
  • 在角色预制体上替换为 OwnerNetworkAnimator,并将所有动画控制逻辑置于继承自 NetworkBehaviour 的脚本中。

7. NetworkBehaviour 生命周期

  • 不建议Awake()/Start() 中做网络相关初始化。
  • 推荐使用:

    8. 单例(Singleton)注意

    • 多人环境下,玩家对象并非一开始就实例化,避免在 Awake() 中将自身注册到全局单例。
    • 如需单例管理,建议使用场景管理器(非玩家对象管理) 或者在 OnNetworkSpawn 中注册。

    9. 生成与销毁网络对象

    • 只可由服务端 调用 NetworkObject.Spawn()Despawn()
    • 客户端通过 ServerRpc 请求,服务器收到后执行生成/销毁。

    10. 传递复杂类型

    • RPC 仅支持基础类型。
    • 传递自定义对象时,可使用 NetworkObjectReference
      注意:网络对象 不能 作为非网络对象的子物体。

      11. 网络变量(NetworkVariable)

      • 写权限:仅服务器
      • 读权限:客户端(只读)
      • 客户端不能直接访问底层字段,需通过 API 读取 NetworkVariable<T>.Value

      12. 常用属性对照

      属性名
      类型
      含义
      IsClient
      bool
      当前实例是否运行在「客户端」(含 Host)
      IsServer
      bool
      当前实例是否运行在「服务器」(含 Host)
      IsOwner
      bool
      NetworkObject 是否被本地客户端拥有
      IsLocalPlayer*
      bool
      是否本地玩家对象(旧 API,建议用 IsOwner
      快速记忆
      • IsClient“我是不是客户端?” (能看见画面)
      • IsServer“我是不是服务器?” (掌控世界状态)
      • IsOwner“这是我控制的对象吗?” (我可以操作)
      1. 大厅功能API
      前置准备
      下载Lobby Package包
      开启Unity Game Servers服务
      公开的大厅在30秒无响应后会自动关闭,使用心跳函数
       
      上一篇
      Unity中DOTS架构与核心
      下一篇
      Unity多人联机方案(Mirror * Steamworks)

      Comments
      Loading...