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

目录

一、插件介绍

二、主要组件

三、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,或通过代码控制实例化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗橘子宣布成为星球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值