Unity插件-Mirror使用方法(三)组件介绍(Network Manager)

server/2025/3/4 9:26:35/

目录

一、插件介绍

二、主要组件

三、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 项目的起点。

网络管理器是用于管理多人游戏网络功能的核心组件。它将大量实用功能整合于一体,极大简化了多人游戏的创建、运行和调试流程。

  1. 使用 Mirror 提供的脚本模板创建新网络管理器
  2. 在初始场景中创建空游戏对象
  3. 添加新建的网络管理器组件

​注意事项:

  • 每个场景仅允许存在一个激活的网络管理器(单例模式)
  • 禁止将网络管理器组件放置在具有网络身份(Network Identity)的游戏对象上

2、核心功能

核心功能

  • 游戏状态管理
  • 生成管理​(Spawn Management)
  • 场景管理
  • 调试信息显示
  • 高度可定制性

1)传输层(Transports)

Mirror 采用独立传输组件(继承自 Transport 基类)实现网络连接:

  • 默认使用 ​KCP 传输​(基于 UDP)
  • 支持多种传输协议:TCP、UDP、WebGL、Steam 等
  • 提供 ​Multiplex 传输​ 实现多协议并行支持(如 Telepathy + WebSockets)

更换传输协议只需在 Network Manager 对象上替换组件并指定到 Transport 字段。


2)游戏状态管理

支持三种运行模式:

  1. 客户端模式​(StartClient)
  2. 专用服务器模式​(StartServer)
  3. 主机模式​(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 中设置:

  1. Player Prefab: 拖入玩家角色预制体。
  2. Network Address: 输入服务器 IP(本地测试用 localhost)。
  3. 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、高级技巧与注意事项

多玩家预制体支持

  1. 通过覆盖 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);
}

自定义连接认证

  1. 在连接时传递验证数据(如玩家名称、Token):
// 客户端连接时发送验证数据
NetworkManager.singleton.StartClient();
NetworkClient.connection.authenticationData = "Player1";// 服务器端验证
public override void OnServerAuthenticate(NetworkConnection conn) {if (conn.authenticationData.ToString() != "ValidToken") {conn.Disconnect();}
}

避免单例滥用

  1. 直接通过 NetworkManager.singleton 访问实例。
  2. 如需扩展,推荐继承而非修改原始组件。

场景同步规则

  1. 确保所有客户端和服务器加载相同的场景名称。
  2. 使用 ServerChangeScene("SceneName") 触发场景切换。

7、常见问题与解决方案

问题解决方法
玩家生成位置不正确重写 OnServerAddPlayer,手动指定生成坐标。
客户端连接后卡在加载界面检查 Online Scene 是否配置正确,且场景已添加到 Build Settings。
动态生成的对象未同步确保预制体已添加到 Spawn Prefabs 列表,并使用 NetworkServer.Spawn()
多个 Network Manager 实例冲突确保场景中只有一个 Network Manager,或通过代码控制实例化。

http://www.ppmy.cn/server/172296.html

相关文章

mysql服务层介绍,NOSQL+SQL接口(nosql介绍),语法分析器,预处理器,优化器(优化的必要性,基于成本的优化器),缓存(弊端)

目录 mysql服务层 介绍 服务管理和公共组件 备份 NOSQL,SQL接口 介绍 nosql Parser模块(语法分析器) 介绍 词法分析 语法分析 示例 预处理器 引入 介绍 优化器 介绍 优化的必要性 基于成本的优化器 缓存 介绍 弊端 mysql服务层 介绍 数据库服务层是整个…

linux下自旋锁(spin_lock)

文章目录 Linux自旋锁:单核与多核环境下的实现差异与核心原理 🖥️🔒一、自旋锁的核心特性 ⚙️🎯 适用场景: 二、单核环境下的自旋锁实现 🛑1. **实现原理** 🔄2. **关键代码解析** &#x1f4…

探索未来金融世界的钥匙——代币开发

在数字经济飞速发展的今天,区块链技术与加密货币的结合催生了一个崭新的领域——代币开发。这一领域不仅重新定义了资金流动的方式,更为全球金融体系带来了前所未有的透明度和效率,成为探索未来金融世界的钥匙。 一、代币开发的定义与意义 代…

Java 8 中,可以使用 Stream API 和 Comparator 对 List 按照元素对象的时间字段进行倒序排序

文章目录 引言I 示例对象II List 按时间字段倒序排序: 使用 `Stream` 和 `Comparator` 排序方法 1:使用 `Comparator.comparing`方法 2:使用 `Comparator.reversed`方法 3:自定义 `Comparator`输出结果III 注意事项**时间字段类型**:**空值处理**:IV 总结引言 案例:在线用…

【计算机网络——概述】

1.计算机网络在信息时代中的作用 1.1三网融合 “三网融合”的三网——电信网络、有线电视网络、计算机网络,是将前两个融入到了计算机网络。 1.2互联网两个重要基本特点 1.连通性:就是互联网使上网用户之间,不管相聚多远,都可以交…

虚拟主机 VirtualHost

一、虚拟主机介绍 作用&#xff1a;在一台服务器运行多个网站 注意&#xff1a; 建议使用虚拟主机的方式部署网站&#xff0c;方便后续扩展 类型&#xff1a; 1、基于名称的虚拟主机 2、基于IP地址的虚拟主机 配置虚拟主机语法结构&#xff1a; <VirtualHost IP:port>…

在CentOS 7上安装和配置Nginx

引言 Nginx是一款高性能的HTTP和反向代理服务器。本文将详细介绍如何在CentOS 7系统上安装、配置以及管理Nginx服务。 一、安装Nginx 步骤1&#xff1a;下载并添加Nginx YUM源 首先&#xff0c;为您的系统添加Nginx官方提供的YUM源&#xff1a; wget http://nginx.org/pac…

Python数据可视化——Matplotlib的基本概念和使用

Matplotlib是Python中最常用的绘图和数据可视化库之一&#xff0c;能够帮助我们将数据以图表的形式展示出来&#xff0c;使数据的规律和趋势更加直观。无论是在科学计算、工程分析&#xff0c;还是商业报告和机器学习领域&#xff0c;Matplotlib都能发挥重要作用。 Matplotlib…