文章目錄
- 前言
- 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原理。
好了,這篇文章就到這里,希望對你有所幫助。