用 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。