目录
一、插件介绍
二、主要组件
三、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博客
在 Unity Mirror 中,Network Manager 是多人游戏开发的核心组件之一,负责协调服务器与客户端之间的基础网络逻辑,如连接管理、玩家生成、场景同步等。它简化了网络架构的搭建,是几乎所有 Mirror 项目的起点。
网络管理器是用于管理多人游戏网络功能的核心组件。它将大量实用功能整合于一体,极大简化了多人游戏的创建、运行和调试流程。
注意事项:
核心功能
Mirror 采用独立传输组件(继承自 Transport 基类)实现网络连接:
更换传输协议只需在 Network Manager 对象上替换组件并指定到 Transport 字段。
支持三种运行模式:
网络地址配置规则:
NetworkClient.RegisterPrefab
NetworkManager.startPositions
列表ServerChangeScene
方法实现全客户端同步切换networkSceneName
属性重要设置:
必须勾选 Don't Destroy On Load 确保网络管理器跨场景持续存在
通过继承 NetworkManager 实现功能扩展:
OnServerAddPlayer
必须调用 NetworkServer.AddPlayer
)// 定制示例
public class CustomNetworkManager : NetworkManager {
public override void OnServerAddPlayer(NetworkConnection conn) {
// 自定义玩家生成逻辑
base.OnServerAddPlayer(conn);
}
}
参数名 | 描述 |
---|---|
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
)需手动拖入场景资源或脚本组件。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);
}
}
// 自定义玩家生成逻辑(如出生点选择)
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);
}
// 服务器切换场景时调用
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);
}
创建一个空对象,添加 NetworkManager
组件。
在 Inspector 中设置:
localhost
)。7777
)。通过代码启动服务器/客户端:
// 启动服务器
NetworkManager.singleton.StartServer();
// 启动客户端并连接
NetworkManager.singleton.StartClient();
将需要生成的预制体(如子弹)拖入 Spawn Prefabs
列表。
在代码中生成:
[Command]
void CmdShoot() {
GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation);
NetworkServer.Spawn(bullet);
}
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);
}
// 客户端连接时发送验证数据
NetworkManager.singleton.StartClient();
NetworkClient.connection.authenticationData = "Player1";
// 服务器端验证
public override void OnServerAuthenticate(NetworkConnection conn) {
if (conn.authenticationData.ToString() != "ValidToken") {
conn.Disconnect();
}
}
NetworkManager.singleton
访问实例。ServerChangeScene("SceneName")
触发场景切换。问题 | 解决方法 |
---|---|
玩家生成位置不正确 | 重写 OnServerAddPlayer ,手动指定生成坐标。 |
客户端连接后卡在加载界面 | 检查 Online Scene 是否配置正确,且场景已添加到 Build Settings。 |
动态生成的对象未同步 | 确保预制体已添加到 Spawn Prefabs 列表,并使用 NetworkServer.Spawn() 。 |
多个 Network Manager 实例冲突 | 确保场景中只有一个 Network Manager,或通过代码控制实例化。 |