文章目录
- 前言
- 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原理。
好了,这篇文章就到这里,希望对你有所帮助。