用 C# 编写的 Nakama 服务器的 .NET 客户端。
Nakama 是一款开源服务器,旨在为现代游戏和应用程序提供支持。功能包括用户帐户、聊天、社交、媒人、实时多人游戏等等。
该客户端通过服务器实现完整的 API 和套接字选项。它是用 C# 编写的,具有最少的依赖性,可支持 Unity、Xamarin、Godot、XNA 以及其他引擎和框架。
完整文档在线 - https://heroiclabs.com/docs
您需要先设置服务器和数据库,然后才能连接客户端。最简单的方法是使用 Docker,但请查看服务器文档以了解其他选项。
安装并运行服务器。请遵循这些说明。
从发布页面下载客户端并将其导入到您的项目中。您还可以从源代码构建。
使用连接凭据构建客户端对象。
// using Nakama;
const string scheme = "http" ;
const string host = "127.0.0.1" ;
const int port = 7350 ;
const string serverKey = "defaultkey" ;
var client = new Client ( scheme , host , port , serverKey ) ;
客户端对象有许多方法来执行服务器中的各种功能或打开与服务器的实时套接字连接。
有多种方法可以对服务器进行身份验证。如果用户尚不存在且具有这些凭据,则身份验证可以创建用户。使用来自 Google Play Games、Facebook、Game Center 等的社交资料进行身份验证也很容易。
var email = "[email protected]" ;
var password = "batsignal" ;
var session = await client . AuthenticateEmailAsync ( email , password ) ;
System . Console . WriteLine ( session ) ;
经过身份验证后,服务器会使用身份验证令牌 (JWT) 进行响应,其中包含有用的属性并反序列化为Session
对象。
System . Console . WriteLine ( session . AuthToken ) ; // raw JWT token
System . Console . WriteLine ( session . RefreshToken ) ; // raw JWT token.
System . Console . WriteLine ( session . UserId ) ;
System . Console . WriteLine ( session . Username ) ;
System . Console . WriteLine ( "Session has expired: {0}" , session . IsExpired ) ;
System . Console . WriteLine ( "Session expires at: {0}" , session . ExpireTime ) ;
建议存储会话中的身份验证令牌,并在启动时检查它是否已过期。如果令牌已过期,您必须重新进行身份验证。令牌的到期时间可以作为服务器中的设置进行更改。
var authToken = "restored from somewhere" ;
var refreshToken = "restored from somewhere" ;
var session = Session . Restore ( authToken , refreshToken ) ;
// Check whether a session is close to expiry.
if ( session . HasExpired ( DateTime . UtcNow . AddDays ( 1 ) ) )
{
try
{
session = await client . SessionRefreshAsync ( session ) ;
}
catch ( ApiResponseException e )
{
System . Console . WriteLine ( "Session can no longer be refreshed. Must reauthenticate!" ) ;
}
}
客户端包含许多用于游戏服务器各种功能的内置 API。可以使用异步方法访问这些。它还可以调用服务器上 RPC 函数中的自定义逻辑。这些也可以使用套接字对象来执行。
所有请求都通过授权客户端的会话对象发送。
var account = await client . GetAccountAsync ( session ) ;
System . Console . WriteLine ( account . User . Id ) ;
System . Console . WriteLine ( account . User . Username ) ;
System . Console . WriteLine ( account . Wallet ) ;
在出现暂时性网络或服务器错误的情况下,可以为请求提供重试配置。
单个配置可用于控制所有请求重试行为:
var retryConfiguration = new RetryConfiguration ( baseDelayMs : 1000 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;
或者,可以根据每个请求提供配置:
var retryConfiguration = new RetryConfiguration ( baseDelayMs : 1000 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration ) ;
每个请求的重试配置会覆盖全局重试配置。
如果您需要在飞行中取消请求,还可以为请求提供取消令牌:
var canceller = new CancellationTokenSource ( ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration : null , canceller ) ;
await Task . Delay ( 25 ) ;
canceller . Cancel ( ) ; // will raise a TaskCanceledException
客户端可以与服务器创建一个或多个套接字。每个套接字都可以注册自己的事件侦听器,以接收从服务器接收的响应。
var socket = Socket . From ( client ) ;
socket . Connected += ( ) =>
{
System . Console . WriteLine ( "Socket connected." ) ;
} ;
socket . Closed += ( ) =>
{
System . Console . WriteLine ( "Socket closed." ) ;
} ;
socket . ReceivedError += e => System . Console . WriteLine ( e ) ;
await socket . ConnectAsync ( session ) ;
Satori 是一款游戏 liveops 服务器,支持可操作的分析、A/B 测试和远程配置。使用 Satori .NET 客户端在 .NET 游戏中与 Satori 进行通信。
完整文档在线 - https://heroiclabs.com/docs/satori/client-libraries/unity/index.html
创建一个客户端对象,该对象接受您作为 Satori 客户提供的 API。
using Satori ;
const string scheme = "https" ;
const string host = "127.0.0.1" ; // add your host here
const int port = 443 ;
const string apiKey = "apiKey" ; // add the api key that was given to you as a Satori customer.
var client = new Client ( scheme , host , port , apiKey ) ;
然后向服务器进行身份验证以获取您的会话。
// Authenticate with the Satori server.
try
{
session = await client . AuthenticateAsync ( id ) ;
Debug . Log ( "Authenticated successfully." ) ;
}
catch ( ApiResponseException ex )
{
Debug . LogFormat ( "Error authenticating: {0}" , ex . Message ) ;
}
使用客户端,您可以获得用户所属的任何实验或功能标志。
var experiments = await client . GetExperimentsAsync ( session ) ;
var flag = await client . GetFlagAsync ( session , "FlagName" ) ;
您还可以向服务器发送任意事件:
await client . EventAsync ( session , new Event ( "gameLaunched" , DateTime . UtcNow ) ) ;
这只是 Satori 客户端 API 的一个子集,因此请参阅前面列出的完整 API 的文档链接。
开发路线图通过 GitHub 问题进行管理,并且欢迎拉取请求。如果您有兴趣改进代码,请打开一个问题来讨论更改或在社区论坛中进行讨论。
可以使用 Dotnet CLI 构建代码库。所有依赖项均在构建时使用 Nuget 下载。
dotnet build Nakama/Nakama.csproj
dotnet build Satori/Satori.csproj
对于发布版本,请参阅我们的说明:
要运行测试,您需要运行服务器和数据库。大多数测试都是作为针对服务器执行的集成测试编写的。我们在测试工作流程中使用的一种快速方法是使用文档中描述的 Docker compose 文件。
docker-compose -f ./docker-compose-postgres.yml up
dotnet test Nakama.Tests/Nakama.Tests.csproj
要运行特定测试,请将方法的完全限定名称传递给dotnet test --filter
:
dotnet test --filter " Nakama.Tests.Api.GroupTest.ShouldPromoteAndDemoteUsers "
如果要将 Visual Studio 调试器附加到测试,请在 shell 环境中将VSTEST_HOST_DEBUG
设置为true
并运行dotnet test
。将调试器附加到控制台识别的进程。
为了通过 Satori 测试,Satori 控制台必须填充可通过其 GUI 中的按钮获得的示例数据。然后您可以使用dotnet test Satori.Tests/Satori.Tests.csproj
测试 SDK。
nakama-dotnet API 文档使用 Doxygen 生成并部署到 GitHub 页面。
更改 API 注释时,重新运行 Doxygen 并在docs/*
中提交更改。
运行 Doxygen:
brew install doxygen
cd docs/
doxygen
该项目根据 Apache-2 许可证获得许可。
感谢 Alex Parker (@zanders3) 提供的优秀 json 库和 David Haig (@ninjasource) 提供的 Ninja.WebSockets。