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

文章目录

    • 前言
    • 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.OnValueChangedpublic 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 authenticatepublic 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 authenticatepublic 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 HashSetplayerNames.Add(msg.authUsername);conn.authenticationData = msg.authUsername;//给客户端回复验证成功消息AuthResponseMessage authResponseMessage = new AuthResponseMessage{code = 100,message = "Success"};conn.Send(authResponseMessage);// Accept the successful authenticationServerAccept(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 arrivespublic 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}");// 验证失败,同时在所有客户端执行StopHostNetworkManager.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.mzph.cn/web/65268.shtml

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

相关文章

知识问答系统

文章目录 早期的问答系统基于信息检索的问答系统基于知识库的问答系统CommunityQA/FAQ-QA:基于问答对匹配的问答系统Hybrid QA Framework混合问答系统框架早期的问答系统 20世纪六七十年代,早期的NLIDB(Natural Language Interface toData bBase)伴随着人工智能的研发逐步兴起…

第3章:Go语言复合数据类型

第3章&#xff1a;Go语言复合数据类型 1. 数组 1.1 数组声明和初始化 // 方式1&#xff1a;声明固定长度数组 var numbers [5]int // 声明一个包含5个整数的数组&#xff0c;默认零值// 方式2&#xff1a;初始化数组 arr1 : [5]int{1, 2, 3, 4, 5} // 完全初始化// 方式3&…

uniapp-vue3 实现, 一款带有丝滑动画效果的单选框组件,支持微信小程序、H5等多端

采用 uniapp-vue3 实现, 是一款带有丝滑动画效果的单选框组件&#xff0c;提供点状、条状的动画过渡效果&#xff0c;支持多项自定义配置&#xff0c;适配 web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&…

深度学习GPU服务器推荐:打造高效运算平台

文章来源于百家号&#xff1a;GPU服务器厂家 在深度学习和人工智能领域&#xff0c;一个高性能的GPU服务器是研究和开发工作的关键。今天&#xff0c;我们将为大家推荐一款基于详细硬件配置表的深度学习GPU服务器&#xff0c;它专为高效运算和数据处理而设计。 一、机箱设计 …

2025第1周 | JavaScript中的正则表达式

目录 1. 正则表达式是个什么东东&#xff1f;1.1 怎么定义正则1.2 对象字面量方式1.3 类创建方式 2. 怎么使用2.1 实例方法2.1.1 exec方法2.1.2 test方法 2.2 字符串中的方法2.2.1 match/matchAll2.2.2 replace/replaceAll2.2.3 split2.2.4 search 3. 规则3.1 修饰符3.2 字符类…

大模型LLM-Prompt-OPTIMAL

1 OPTIMAL OPTIMAL 具体每项内容解释如下&#xff1a; Objective Clarity&#xff08;目标清晰&#xff09;&#xff1a;明确定义任务的最终目标和预期成果。 Purpose Definition&#xff08;目的定义&#xff09;&#xff1a;阐述任务的目的和它的重要性。 Information Gat…

78、使用爱芯派2_AX630C开发板 3.2T高有效算力 低功耗 支持AI-ISP真黑光实验

基本思想:使用爱心元智最新的版本开发板进行实验 AX630C、AX620Q 都是 620E 这一代 一、参考这个官方教程,先把代码在本地交叉编译完成 https://github.com/AXERA-TECH/ax620e_bsp_sdk 然后在拷贝到620c设备上 root@ax630c:~/ax620e_bsp_sdk/msp/out/arm64_glibc/bin# ./…

C语言 扫雷程序设计

目录 1.main函数 2.菜单打印menu函数 3.游戏game函数 4.宏定义 5.界面初始化 6.打印界面 7.设置雷 8.统计排查坐标周围雷的个数 9.排查雷 10.总代码 test.c代码 game.h代码 game.c代码 结语&#xff1a; 一个简单的扫雷游戏&#xff0c;通过宏定义可以修改行列的…

《高速公路警察模拟器》

一个引人入胜的警察故事在等着你&#xff0c;你可以选择扮演男警官或女警官。公路警察模拟器》拥有休闲和模拟两种游戏模式&#xff0c;将两个世界的精华结合在一起&#xff1a;在身临其境的虚拟环境中自由驾驶和行走&#xff0c;在故事驱动的游戏中解决各种令人兴奋的案件。探…

EasyGBS小知识:如何确保摄像机的网络连接稳定?

在当今数字化时代&#xff0c;视频监控系统已成为保障安全和提高效率的重要工具。然而&#xff0c;摄像机的网络连接稳定性直接关系到监控系统的可靠性和有效性。为了确保视频监控系统能够持续稳定地运行&#xff0c;我们需要从硬件、网络设置、软件与监控以及安装与维护等多个…

微服务-Eureka

Eureka的作用 使用RestTemplate完成远程调用需要被调用者的ip和端口&#xff0c;从而能够发起http请求&#xff0c;但是如果有很多个实例也更加不能有效的处理&#xff0c;而且我们又该如何知道这些实例是否健康呢。所以就有了很多的注册中心比如Eureka、Nacos等等。 服务注…

LabVIEW软件侵权分析与应对

问&#xff1a;如果涉及到LabVIEW软件的仿制或模仿&#xff0c;特别是在功能、界面等方面&#xff0c;如何判断是否构成侵权&#xff1f;该如何应对&#xff1f; 答&#xff1a;LabVIEW软件的侵权问题&#xff0c;尤其是在涉及到仿制或模仿其功能、界面、设计等方面&#xff0…

MATLAB仿真:基于GS算法的经大气湍流畸变涡旋光束波前校正仿真

GS算法流程 GS&#xff08;Gerchberg-Saxton&#xff09;相位恢复算法是一种基于傅里叶变换的最速下降算法&#xff0c;可以通过输出平面和输入平面上光束的光强分布计算出光束的相位分布。图1是基于GS算法的涡旋光束畸变波前校正系统框图&#xff0c;在该框图中&#xff0c;已…

数树数(中等难度)

题目&#xff1a; 解题代码&#xff1a; n,qmap(int,input().split())#分别输入层数和路径数量 for i in range(q):sinput()#输入“L”或“R”x1for j in s:if j "L":xx*2-1 #&#xff01;&#xff01;&#xff01;规律else:xx*2print(x)

高效内存管理与调试技巧:深入解析 AddressSanitizer

在现代 C开发中&#xff0c;内存管理是一个至关重要但也容易出错的领域。即使使用了智能指针和其他高效工具&#xff0c;复杂的项目仍可能出现内存泄漏、非法访问等问题。为了解决这些问题&#xff0c;Google 开发了一个强大的工具——AddressSanitizer (ASan)。本文将详细介绍…

Vue3 内置组件之Teleport

文章目录 Vue3 内置组件之Teleport概述用法 Vue3 内置组件之Teleport 概述 Teleport 中文翻译为“瞬间移动”&#xff0c;顾名思义&#xff0c;在Vue3 中 <Teleport> 组件可以将组件中内容移动到指定的目标元素上。 用法 <script setup> import {ref} from &qu…

【我的 PWN 学习手札】IO_FILE 之 FSOP

FSOP&#xff1a;File Stream Oriented Programming 通过劫持 _IO_list_all 指向伪造的 _IO_FILE_plus&#xff0c;进而调用fake IO_FILE 结构体对象中被伪造的vtable指向的恶意函数。 目录 前言 一、glibc-exit函数浅析 二、FSOP 三、Largebin attack FSOP &#xff08;…

函数指针的用法

函數指標一些相關的用法和注意事項。以下將詳細說明&#xff1a; 1. 基本寫法: 這是最常見且明確的寫法&#xff0c;尤其在處理重載函數時非常有用。 void (GirlFriend::*girl2)(QString) &GirlFriend::hungry;void: 指標所指向的函數的回傳型別。(GirlFriend::*): 表示…

DDcGAN_多分辨率图像融合的双鉴别条件生成对抗网络_y译文马佳义

摘要&#xff1a; 在本文中&#xff0c;我们提出了一种新的端到端模型&#xff0c;称为双鉴别条件生成对抗网络&#xff08;DDcGAN&#xff09;&#xff0c;用于融合不同分辨率的红外和可见光图像。我们的方法建立了一个生成器和两个鉴别器之间的对抗博弈。生成器的目的是基于特…

springboot配置线程池

直接上代码 配置 定义一个配置类 创建一个springboot能扫描到的地方创建一个线程池配置类 配置信息 package com.example.demonew.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import or…