Unity-Mirror网络框架-从入门到精通之Chat示例

news2025/1/7 21:32:49

文章目录

    • 前言
    • Chat聊天室
    • Authentication授权
    • ChatAuthenticator
    • Chat示例中的授权流程
    • 聊天Chat
    • 最后

前言

在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计。它使得开发者能够轻松实现网络连接、数据同步和游戏状态管理。本文将深入介绍Mirror的基本概念、如何与其他网络框架进行比较,以及如何从零开始创建一个使用Mirror的简单网络项目。
在这里插入图片描述

Chat聊天室

1.用户输入账号,然后使用Host或者Client链接服务器
在这里插入图片描述
2.登录成功后,即可开始聊天
在这里插入图片描述

Authentication授权

在说到聊天功能之前,我们先来说下Authentication授权机制
什么是授权机制呢?
Authenticator 是一个用于在连接服务器阶段实现身份验证的。它允许您为每个连接实现自己的身份验证逻辑,例如使用用户名和密码、设备ID或其他自定义方法来区分用户。
当服务器接受一个客户端的身份验证请求时,会触发 OnServerAuthenticated 事件,
而当客户端成功验证后,会触发 OnClientAuthenticated 事件。
这些事件可用于执行后续步骤,如允许玩家进入游戏或实现相关功能

ChatAuthenticator

Chat 示例中,ChatAuthenticator 继承自 NetworkAuthenticator,专门用于处理聊天功能的身份验证。这意味着在用户尝试连接到聊天系统时,ChatAuthenticator 可以提供关于其身份验证的具体实现,例如管理等待连接的用户、注册消息处理程序以及确保每个用户的身份都是唯一的。通过自定义的 ChatAuthenticator,开发者可以针对聊天系统的具体需求,实施灵活的身份验证方案

Chat示例中的授权流程

1.当Username的Input输入用户名有变化后回调,设置playerName

        // Called by UI element UsernameInput.OnValueChanged
        public void SetPlayername(string username)
        {
            playerName = username;
            LoginUI.instance.errorText.text = string.Empty;
            LoginUI.instance.errorText.gameObject.SetActive(false);
        }

2.连接服务器
当服务器接受一个客户端的身份验证请求时,会触发 OnServerAuthenticate 事件,用来处理客户端的授权。

        /// Called on server from OnServerConnectInternal when a client needs to authenticate
        public override void OnServerAuthenticate(NetworkConnectionToClient conn)
        {
            // do nothing...wait for AuthRequestMessage from client
        }

3.客户端链接服务器后,处理授权
一旦服务器处理了该客户端的身份验证请求并确认该客户端的身份有效,客户端会收到 OnClientAuthenticate 的回调。
OnClientAuthenticate 通常用于执行身份验证成功后的特定逻辑,比如更新用户界面、设置一些客户端的用户名,状态、准备进入游戏等。

        /// Called on client from OnClientConnectInternal when a client needs to authenticate
        public override void OnClientAuthenticate()
        {
            NetworkClient.Send(new AuthRequestMessage { authUsername = playerName });
        }

4.服务器处理username的唯一性判断,然后反馈给客户端

        /// 当接受到客户端的AuthRequestMessage消息后
        public void OnAuthRequestMessage(NetworkConnectionToClient conn, AuthRequestMessage msg)
        {
            if (connectionsPendingDisconnect.Contains(conn)) return;

            // 检查用户名通过webServer,数据库或者playFab等其他方法。
            if (!playerNames.Contains(msg.authUsername))
            {
                // Add the name to the HashSet
                playerNames.Add(msg.authUsername);
                conn.authenticationData = msg.authUsername;

                //给客户端回复验证成功消息
                AuthResponseMessage authResponseMessage = new AuthResponseMessage
                {
                    code = 100,
                    message = "Success"
                };

                conn.Send(authResponseMessage);
                // Accept the successful authentication
                ServerAccept(conn);
            }
            else
            {
                connectionsPendingDisconnect.Add(conn);

                //回复客户端失败消息
                AuthResponseMessage authResponseMessage = new AuthResponseMessage
                {
                    code = 200,
                    message = "Username already in use...try again"
                };

                conn.Send(authResponseMessage);

                //必须设置isAuthenticated 为false,代表失败了
                conn.isAuthenticated = false;

                //延迟1s,断开客户端链接
                StartCoroutine(DelayedDisconnect(conn, 1f));
            }
        }

5.客户端接受验证结果
客户端 接收到 服务器的username的验证后返回的消息,

        /// Called on client when the server's AuthResponseMessage arrives
        public void OnAuthResponseMessage(AuthResponseMessage msg)
        {
            if (msg.code == 100)
            {
                Debug.Log($"Authentication Response: {msg.code} {msg.message}");

                // 授权验证通过了
                ClientAccept();
            }
            else
            {
                Debug.LogError($"Authentication Response: {msg.code} {msg.message}");

                // 验证失败,同时在所有客户端执行StopHost
                NetworkManager.singleton.StopHost();

                // 提示错误信息
                LoginUI.instance.errorText.text = msg.message;
                LoginUI.instance.errorText.gameObject.SetActive(true);
            }
        }

聊天Chat

1.客户端发送消息
发送消息使用了一个Command,代表从客户端往服务器发送消息,因为聊天消息,需要经过服务器转发,所以直接通过服务器发送聊天信息

        [Command(requiresAuthority = false)]
        void CmdSend(string message, NetworkConnectionToClient sender = null)
        {
            if (!connNames.ContainsKey(sender))
                connNames.Add(sender, sender.identity.GetComponent<Player>().playerName);

            if (!string.IsNullOrWhiteSpace(message))
                RpcReceive(connNames[sender], message.Trim());
        }

2.通过ClientRpc,让客户端接收到消息。

        [ClientRpc]
        void RpcReceive(string playerName, string message)
        {
            string prettyMessage = playerName == localPlayerName ?
                $"<color=red>{playerName}:</color> {message}" :
                $"<color=blue>{playerName}:</color> {message}";
            AppendMessage(prettyMessage);
        }

3.UI刷新聊天界面
这里就不在赘述了,不同的聊天软件可能有不同的UI界面。

        void AppendMessage(string message)
        {
            StartCoroutine(AppendAndScroll(message));
        }

最后

好了,聊天室的示例就到这里。
其实,聊天示例中,最重要的就是Authentication 机制,通过研究该示例,也可以让大家学会Authentication 的用法。

另外属性[Command]和[RPCClient]的用法,也可以让用户明白如何在客户端和服务器之间交互调用函数。这个也是Mirror网络框架的最核心的逻辑。希望大家通过一个简单的聊天功能理解Command和RPC原理。

好了,这篇文章就到这里,希望对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复杂园区网基本分支的构建

目录 1、各主机进行网络配置。2、交换机配置。3、配置路由交换&#xff0c;进行测试。4、配置路由器接口和静态路由&#xff0c;进行测试。5、最后测试任意两台主机通信情况 模拟环境链接 拓扑结构 说明&#xff1a; VLAN标签在上面的一定是GigabitEthernet接口的&#xff0c…

这是什么操作?强制迁移?GitLab 停止中国区用户访问

大家好&#xff0c;我是鸭鸭&#xff01; 全球知名代码托管平台 GitLab 发布通告&#xff0c;宣布不再为位于中国大陆、香港及澳门地区的用户提供访问服务&#xff0c;并且“贴心”建议&#xff0c;可以访问极狐 GitLab。 极狐 GitLab 是一家中外合资公司&#xff0c;宣称获得…

CDP集成Hudi实战-spark shell

[〇]关于本文 本文主要解释spark shell操作Hudi表的案例 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]使用Spark-shell 1-配置hudi Jar包 [rootcdp73-1 ~]# for i in $(seq 1 6); do s…

设计模式学习[15]---适配器模式

文章目录 前言1.引例2.适配器模式2.1 对象适配器2.2 类适配器 总结 前言 这个模式其实在日常生活中有点常见&#xff0c;比如我们的手机取消了 3.5 m m 3.5mm 3.5mm的接口&#xff0c;只留下了一个 T y p e − C Type-C Type−C的接口&#xff0c;但是我现在有一个 3.5 m m 3.…

数据挖掘——数据预处理

数据挖掘——数据预处理 数据预处理数据预处理 ——主要任务数据清洗如何处理丢失的数据如何处理噪声数据如何处理不一致数据 数据集成相关分析相关系数(也成为皮尔逊相关系数)协方差 数据规约降维法&#xff1a;PCA主成分分析降数据——抽样法数据压缩 数据预处理 数据预处理…

Unity-Mirror网络框架-从入门到精通之CCU示例

文章目录 前言什么是CCU&#xff1f;测试结果最后 前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架&#xff0c;专为多人游戏开发设计。它使得开发者能够轻松实现网络连接、数据同步和游戏状态管理。本文…

如何在 Ubuntu 22.04 上安装 Nagios 服务器教程

简介 在本教程中&#xff0c;我们将解释如何在 Ubuntu 22.04 上安装和配置 Nagios&#xff0c;使用 Apache 作为 Web 服务器&#xff0c;并通过 Let’s Encrypt Certbot 使用 SSL 证书进行保护。 Nagios 是一个强大的监控系统&#xff0c;它可以帮助组织在 IT 基础设施问题影…

大语言模型训练所需的最低显存,联邦大语言模型训练的传输优化技术

联邦大语言模型训练的传输优化技术 目录 联邦大语言模型训练的传输优化技术大语言模型训练所需的最低显存大语言模型训练所需的最低显存 基于模型微调、压缩和分布式并行处理的方法,介绍了相关开源模型及技术应用 核心创新点 多维度优化策略:综合运用基于模型微调、模型压缩和…

Javascript算法——贪心算法(一)

贪心算法详解&#xff08;JavaScript&#xff09;&#xff08;局部最优->全局最优&#xff09; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下的最优选择&#xff08;局部最优&#xff09;的算法设计方法。通过局部最优解的累积&…

141.《mac m系列芯片安装mongodb详细教程》

文章目录 下载从官网下载安装包 下载后双击解压出文件夹安装文件名修改为 mongodb配置data存放位置和日志log的存放位置启动方式一方式二方式二:输入mongo报错以及解决办法 本人电脑 m2 pro,属于 arm 架构 下载 官网地址: mongodb官网 怎么查看自己电脑应该下载哪个版本,输入…

【ArcGISPro/GeoScenePro】裁剪和打包栅格数据

检查并处理扫描地图 数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 使用标准相机或扫描仪创建的数字影像通常存储在 RGB 颜色模型中,这意味着这些影像将由红色、绿色和蓝色三个栅格组成。 此扫描地图在提供给您之前已在坐标系…

【C++】B2109 统计数字字符个数

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述与输入输出要求题目&#xff1a;统计数字字符个数样例输入输出 &#x1f4af;方法分析与代码实现方法 1&#xff1a;使用 fgets 读取输入并手动判断数字字符代码实…

基于32单片机的智能语音家居

一、主要功能介绍 以STM32F103C8T6单片机为控制核心&#xff0c;设计一款智能远程家电控制系统&#xff0c;该系统能实现如下功能&#xff1a; 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关&#xff1b; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…

git理解记录

文章目录 1. 背景2. 基本概念3. 日常工作流程4. 其他常见操作4.1 merge合并操作4.2 tag打标签操作4.3 remoute远程操作4.4 撤销修改 git理解记录 1. 背景 git作为分布式版本控制系统&#xff0c;开源且免费&#xff0c;相比svn集中式版本控制系统存在速度快(HEAD指针指向某次co…

开启宝塔Nginx防火墙支付返回失败解决方法

1.把/plugin.php加到Nginx防火墙URL白名单 包括支付服务器回调ip 2.如果支持带参数 /plugin.php?idzhifufm:notify 加到Nginx防火墙标准模式-URL白名单带参数 如果上面都不行 就把下面的IP加入白名单 39.107.193.172 47.94.194.103 47.104.216.190

平安产险安徽分公司携手安徽中医药临床研究中心附属医院 共筑儿童安全防护网

为响应金融知识普及教育号召&#xff0c;平安产险安徽分公司联动安徽中医药临床研究中心附属医院&#xff0c;于近日在朝霞小学举办了一场儿童安全防范与健康守护活动。此次活动旨在提升学生的安全防范意识&#xff0c;守护儿童健康成长&#xff0c;同时有力推动金融知识与传统…

Elasticsearch:Lucene 2024 年回顾

作者&#xff1a;来自 Elastic Chris Hegarty 2024 年对于 Apache Lucene 来说又是重要的一年。在本篇博文中&#xff0c;我们将探讨主要亮点。 Apache Lucene 在 2024 年表现出色&#xff0c;发布了许多版本&#xff0c;包括三年来的首次重大更新&#xff0c;其中包含令人兴奋…

Unity打包问题集(持续更新)

1.报错&#xff1a;CommandWithNoStdoutInvokationFailure: Unable to start ADB server. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details. 大致意思就是打不开ADB的服务器&#xff0c;请检查安卓…

SpringBoot环境和Maven配置

SpringBoot环境和Maven配置 1. 环境准备2. Maven2.1 什么是Maven2.2 为什么要学 Maven2.3 创建一个 Maven项目2.4 Maven核心功能2.4.1 项目构建2.4.2 依赖管理2.4.3 Maven Help插件 2.5 Maven 仓库2.5.1本地仓库2.5.2 中央仓库2.5.3 私有服务器, 也称为私服 2.6 Maven设置国内源…

【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 一、在media文件夹中添加想要使用的图片素材​ 二、在entry/src/main/ets/page目录下创建Welcome.ets文件 1. 整体结构与组件声…