目录
一、插件介绍
二、主要组件
三、Network Manager
1、组件介绍
2、核心功能
1)传输层(Transports)
2)游戏状态管理
3)生成管理(Spawn Management)
玩家预制件
预制件注册
出生点控制
4)场景管理
场景配置
动态场景切换
5)高级定制
3、关键属性与配置
基础配置
构建配置
网络参数
场景管理
玩家配置
调试与资源
其他说明
4、核心方法与回调
主机模式:
当主机启动时:
当客户端连接时:
当客户端断开连接时:
当主机停止时:
客户端模式
当客户端启动时:
当客户端停止时:
服务器模式
当服务器启动时:
当客户端连接时:
当客户端断开连接时:
当服务器停止时:
示例:
1. 连接与断开事件
2. 玩家生成控制
3. 场景切换
5、典型使用场景示例
场景1:基础多人游戏设置
场景2:动态生成非玩家对象
6、高级技巧与注意事项
多玩家预制体支持
自定义连接认证
避免单例滥用
场景同步规则
7、常见问题与解决方案
一、插件介绍
Unity插件-Mirror使用方法(一)Mirror介绍-CSDN博客
二、主要组件
Unity插件-Mirror使用方法(二)组件介绍-CSDN博客
三、Network Manager
1、组件介绍
在 Unity Mirror 中,Network Manager 是多人游戏开发的核心组件之一,负责协调服务器与客户端之间的基础网络逻辑,如连接管理、玩家生成、场景同步等。它简化了网络架构的搭建,是几乎所有 Mirror 项目的起点。
网络管理器是用于管理多人游戏网络功能的核心组件。它将大量实用功能整合于一体,极大简化了多人游戏的创建、运行和调试流程。
- 使用 Mirror 提供的脚本模板创建新网络管理器
- 在初始场景中创建空游戏对象
- 添加新建的网络管理器组件
注意事项:
- 每个场景仅允许存在一个激活的网络管理器(单例模式)
- 禁止将网络管理器组件放置在具有网络身份(Network Identity)的游戏对象上
2、核心功能
核心功能
- 游戏状态管理
- 生成管理(Spawn Management)
- 场景管理
- 调试信息显示
- 高度可定制性
1)传输层(Transports)
Mirror 采用独立传输组件(继承自 Transport 基类)实现网络连接:
- 默认使用 KCP 传输(基于 UDP)
- 支持多种传输协议:TCP、UDP、WebGL、Steam 等
- 提供 Multiplex 传输 实现多协议并行支持(如 Telepathy + WebSockets)
更换传输协议只需在 Network Manager 对象上替换组件并指定到 Transport 字段。
2)游戏状态管理
支持三种运行模式:
- 客户端模式(StartClient)
- 专用服务器模式(StartServer)
- 主机模式(StartHost,同时作为客户端和服务器)
网络地址配置规则:
- 客户端模式:支持域名(如 "game.example.com")或 IP 地址
- 服务器/主机模式:监听本地网络 IP 地址
3)生成管理(Spawn Management)
玩家预制件
- 必须指定玩家预制件(Player Prefab)
- 预制件必须包含 Network Identity 组件
- 自动为每个连接玩家生成实例
预制件注册
- 通过检查器添加可生成预制件列表
- 或使用代码注册:
NetworkClient.RegisterPrefab
- 持久化网络管理器需注册所有可能场景的预制件
出生点控制
- 随机生成(Random):从可用出生点随机选择
- 循环生成(Round Robin):按顺序选择出生点
- 可通过代码自定义:使用
NetworkManager.startPositions
列表
4)场景管理
场景配置
- 离线场景(Offline Scene):网络断开时加载
- 在线场景(Online Scene):服务器启动时加载
动态场景切换
- 使用
ServerChangeScene
方法实现全客户端同步切换 - 网络场景名存储在
networkSceneName
属性 - 场景切换会销毁前场景所有游戏对象
重要设置:
必须勾选 Don't Destroy On Load 确保网络管理器跨场景持续存在
5)高级定制
通过继承 NetworkManager 实现功能扩展:
- 覆盖虚方法时需保留基础功能(如
OnServerAddPlayer
必须调用NetworkServer.AddPlayer
) - 推荐使用 Mirror 提供的脚本模板快速创建定制类
// 定制示例
public class CustomNetworkManager : NetworkManager {public override void OnServerAddPlayer(NetworkConnection conn) {// 自定义玩家生成逻辑base.OnServerAddPlayer(conn);}
}
3、关键属性与配置
基础配置
参数名 | 描述 |
---|---|
Dont Destroy On Load | 不在加载时销毁(跨场景保持对象存活) |
Run In Background | 在后台运行(应用失去焦点时仍执行网络逻辑) |
Headless Builds | 无头构建(服务器模式自动启用) |
构建配置
参数名 | 描述 |
---|---|
Auto Start Server Build | 自动启动服务器构建(构建时直接启动服务器) |
Auto Connect Client Build | 自动连接客户端构建(构建时直接连接指定地址) |
网络参数
参数名 | 描述 |
---|---|
Send Rate | 发送速率(默认 60 次/秒,控制数据包发送频率) |
Transport | 传输协议(如 KCP、Telepathy、WebSocket) |
Network Address | 网络地址(默认 localhost ,支持域名或 IP) |
Max Connections | 最大连接数(默认 100,限制服务器接受连接数) |
Authenticator | 认证方式(用于玩家身份验证) |
场景管理
参数名 | 描述 |
---|---|
Offline Scene | 离线场景(网络断开时加载的场景资源) |
Online Scene | 在线场景(服务器启动时加载的场景资源) |
玩家配置
参数名 | 描述 |
---|---|
Player Prefab | 玩家预制体(必须包含 NetworkIdentity 组件) |
Auto Create Player | 自动创建玩家(连接时自动生成玩家对象) |
Player Spawn Method | 玩家生成方法(Random 随机 / Round Robin 轮询) |
调试与资源
参数名 | 描述 |
---|---|
Time Interpolation GUI | 时间插值调试界面(可视化网络延迟补偿) |
Registered Spawnable Prefabs | 注册的可生成预制体列表(动态生成对象需在此注册) |
其他说明
- 列表为空状态:
Registered Spawnable Prefabs: List is Empty
表示未注册任何动态生成预制体。 - 参数依赖:部分参数(如
Transport
)需手动拖入场景资源或脚本组件。
4、核心方法与回调
主机模式:
当主机启动时:
- OnStartServer
- OnStartHost
- OnServerConnect
- OnStartClient
- OnClientConnect
- OnServerSceneChanged
- OnServerReady
- OnServerAddPlayer
- OnClientChangeScene
- OnClientSceneChanged
当客户端连接时:
- OnServerConnect
- OnServerReady
- OnServerAddPlayer
当客户端断开连接时:
- OnServerDisconnect
当主机停止时:
- OnStopHost
- OnServerDisconnect
- OnStopClient
- OnStopServer
客户端模式
当客户端启动时:
- OnStartClient
- OnClientConnect
- OnClientChangeScene
- OnClientSceneChanged
当客户端停止时:
- OnStopClient
- OnClientDisconnect
服务器模式
当服务器启动时:
- OnStartServer
- OnServerSceneChanged
当客户端连接时:
- OnServerConnect
- OnServerReady
- OnServerAddPlayer
当客户端断开连接时:
- OnServerDisconnect
当服务器停止时:
- OnStopServer
示例:
1. 连接与断开事件
public class CustomNetworkManager : NetworkManager {// 服务器启动时调用public override void OnStartServer() {Debug.Log("Server started on port: " + port);}// 客户端连接成功时调用public override void OnClientConnect(NetworkConnection conn) {base.OnClientConnect(conn);Debug.Log("Client connected: " + conn.connectionId);}// 客户端断开时调用public override void OnClientDisconnect(NetworkConnection conn) {base.OnClientDisconnect(conn);Debug.Log("Client disconnected: " + conn.connectionId);}
}
2. 玩家生成控制
// 自定义玩家生成逻辑(如出生点选择)
public override void OnServerAddPlayer(NetworkConnection conn) {// 默认生成在原点,可修改为随机位置Vector3 spawnPos = new Vector3(Random.Range(-5, 5), 0, 0);GameObject player = Instantiate(playerPrefab, spawnPos, Quaternion.identity);NetworkServer.AddPlayerForConnection(conn, player);
}// 是否允许玩家加入(如人数限制)
public override bool OnServerAddPlayer(NetworkConnection conn) {if (numPlayers >= maxPlayers) return false;return base.OnServerAddPlayer(conn);
}
3. 场景切换
// 服务器切换场景时调用
public override void OnServerSceneChanged(string sceneName) {if (sceneName == "BattleScene") {SpawnEnemyBoss(); // 生成Boss}
}// 客户端加载场景时调用
public override void OnClientSceneChanged(NetworkConnection conn) {base.OnClientSceneChanged(conn);Debug.Log("Client loaded scene: " + SceneManager.GetActiveScene().name);
}
5、典型使用场景示例
场景1:基础多人游戏设置
创建一个空对象,添加 NetworkManager
组件。
在 Inspector 中设置:
- Player Prefab: 拖入玩家角色预制体。
- Network Address: 输入服务器 IP(本地测试用
localhost
)。 - Port: 设置端口号(如
7777
)。
通过代码启动服务器/客户端:
// 启动服务器
NetworkManager.singleton.StartServer();// 启动客户端并连接
NetworkManager.singleton.StartClient();
场景2:动态生成非玩家对象
将需要生成的预制体(如子弹)拖入 Spawn Prefabs
列表。
在代码中生成:
[Command]
void CmdShoot() {GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation);NetworkServer.Spawn(bullet);
}
6、高级技巧与注意事项
多玩家预制体支持
- 通过覆盖
OnServerAddPlayer
,可以根据条件生成不同预制体:
public GameObject warriorPrefab;
public GameObject magePrefab;public override void OnServerAddPlayer(NetworkConnection conn) {GameObject prefab = conn.authenticationData == "Warrior" ? warriorPrefab : magePrefab;GameObject player = Instantiate(prefab);NetworkServer.AddPlayerForConnection(conn, player);
}
自定义连接认证
- 在连接时传递验证数据(如玩家名称、Token):
// 客户端连接时发送验证数据
NetworkManager.singleton.StartClient();
NetworkClient.connection.authenticationData = "Player1";// 服务器端验证
public override void OnServerAuthenticate(NetworkConnection conn) {if (conn.authenticationData.ToString() != "ValidToken") {conn.Disconnect();}
}
避免单例滥用
- 直接通过
NetworkManager.singleton
访问实例。 - 如需扩展,推荐继承而非修改原始组件。
场景同步规则
- 确保所有客户端和服务器加载相同的场景名称。
- 使用
ServerChangeScene("SceneName")
触发场景切换。
7、常见问题与解决方案
问题 | 解决方法 |
---|---|
玩家生成位置不正确 | 重写 OnServerAddPlayer ,手动指定生成坐标。 |
客户端连接后卡在加载界面 | 检查 Online Scene 是否配置正确,且场景已添加到 Build Settings。 |
动态生成的对象未同步 | 确保预制体已添加到 Spawn Prefabs 列表,并使用 NetworkServer.Spawn() 。 |
多个 Network Manager 实例冲突 | 确保场景中只有一个 Network Manager,或通过代码控制实例化。 |