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.pswp.cn/web/65268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65268.shtml
英文地址,請注明出處:http://en.pswp.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…