当前位置: 首页 > article >正文

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,或通过代码控制实例化。

http://www.kler.cn/a/570875.html

相关文章:

  • JavaScript 私有属性的实现方式及对比
  • 文本处理Bert面试内容整理-BERT的基本原理是什么?
  • 【论文分析】语义驱动+迁移强化学习:无人机自主视觉导航的高效解决方案(语义驱动的无人机自主视觉导航)
  • 基于 Rust 与 GBT32960 规范构建高并发、高可用、高扩展服务端程序
  • EGO-Planner的无人机视觉选择(yolov5和yolov8)
  • 记录遇到的面试题
  • FPGA开发,使用Deepseek V3还是R1(1):应用场景
  • android 系统 wms详解
  • HONOR荣耀MagicBook 15 2021款 独显(BOD-WXX9,BDR-WFH9HN)原厂Win10系统
  • 为什么深度学习选择Tensor而非NumPy数组?核心优势深度解析
  • 8295智能座舱弹窗点击问题,点击window之外的区域,window不消失的问题。touchableRegion的问题分析(android 13)
  • DNS 详细过程 与 ICMP
  • aiohttp、httpx 和 requests 的区别
  • 五分钟快速学习优秀网站的HTML骨架布局设计
  • 比亚迪“灵鸢”来袭,汽车+无人机梦幻联动!
  • Qt:day1
  • LeetCode 热题 100 链表章节
  • 爬虫:一文掌握WebSocket爬虫案例实战
  • Kotlin 类委托与属性委托
  • 大白话跨域问题的原理与多种解决方法的实现