這是英雄實驗室的UnityEngine Monorepository,其中包含用於訪問兩個不同後端服務Nakama和Satori的庫。
客戶端建立在帶有Unity Engine的擴展名的.NET客戶端上。他們需要在編輯器中設置.NET 4.6腳本運行時版本。
Nakama是一款旨在為現代遊戲和應用程序供電的開源服務器。功能包括用戶帳戶,聊天,社交,媒人,實時多人遊戲等等。
完整文檔在線-https://heroiclabs.com/docs/unity-client-guide
在與客戶端連接之前,您需要設置服務器和數據庫。最簡單的方法是使用Docker,但請查看其他選項的服務器文檔。
安裝並運行服務器。遵循以下說明。
安裝Unity SDK。您有三個選擇。
要使用官方版本,您可以從發行頁面上下載.unitypackage或.tar並將其導入您的項目。如果選擇.tar選項,則可以從Unity軟件包管理器窗口中的下拉列表中導入它。
另外,如果您想查看GitHub的特定版本或提交特定的版本,並且使用Unity 2019.4.1或更高版本,則可以將以下內容添加到項目Packages文件夾中的manifest.json文件:JSON文件:
"com.heroiclabs.nakama-unity" : " https://github.com/heroiclabs/nakama-unity.git?path=/Packages/Nakama#<commit | tag> "您的最終選擇是從資產店下載預製的二進製文件。
使用連接憑據構建客戶端對象。
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 , UnityWebRequestAdapter . Instance ) ; 客戶端對像有許多方法可以在服務器中執行各種功能或與服務器打開實時套接字連接。
有多種使用服務器身份驗證的方法。如果這些憑據不存在,則可以創建身份驗證。通過Google Play遊戲,Facebook,Game Center和Facebook,Facebook,Facebook,Facebook,Facebook,Facebook,Facebook,Facebook,Facebook,。
var deviceId = SystemInfo . deviceUniqueIdentifier ;
var session = await client . AuthenticateDeviceAsync ( deviceId ) ;
Debug . Log ( session ) ;經過身份驗證後,服務器會用驗證令牌(JWT)響應,該驗證令(JWT)包含有用的屬性,並將其供應到Session對像中。
Debug . Log ( session . AuthToken ) ; // raw JWT token
Debug . LogFormat ( "Session user id: '{0}'" , session . UserId ) ;
Debug . LogFormat ( "Session user username: '{0}'" , session . Username ) ;
Debug . LogFormat ( "Session has expired: {0}" , session . IsExpired ) ;
Debug . LogFormat ( "Session expires at: {0}" , session . ExpireTime ) ; // in seconds.建議從會話中存儲驗證令牌,並在啟動時檢查是否過期。如果令牌已過期,則必須重新驗證。令牌的到期時間可以作為服務器中的設置更改。
const string prefKeyName = "nakama.session" ;
ISession session ;
var authToken = PlayerPrefs . GetString ( prefKeyName ) ;
if ( string . IsNullOrEmpty ( authToken ) || ( session = Session . Restore ( authToken ) ) . IsExpired )
{
Debug . Log ( "Session has expired. Must reauthenticate!" ) ;
} ;
Debug . Log ( session ) ;客戶端為遊戲服務器的各種功能提供了許多內置API。可以使用異步方法訪問這些方法。它還可以將自定義邏輯稱為服務器上的RPC功能。這些也可以使用套接字對象執行。
所有請求均以授權客戶端的會話對象發送。
var account = await client . GetAccountAsync ( session ) ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
Debug . LogFormat ( "User username: '{0}'" , account . User . Username ) ;
Debug . LogFormat ( "Account virtual wallet: '{0}'" , account . Wallet ) ;在瞬態網絡或服務器錯誤的情況下,請求可以提供重試配置。
單個配置可用於控制所有請求重試行為:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;或者,可以以每次要求提供配置:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , 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 = client . NewSocket ( ) ;
socket . Connected += ( ) => Debug . Log ( "Socket connected." ) ;
socket . Closed += ( ) => Debug . Log ( "Socket closed." ) ;
await socket . ConnectAsync ( session ) ;如果您希望套接字處理程序在Unity的主線程外執行執行,請傳遞useMainThread: false參數:
var socket = client . NewSocket ( useMainThread : false ) ;當您使用C#中的任務await腳手架時,您可以捕獲錯誤。
try
{
var account = await client . GetAccountAsync ( session ) ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
}
catch ( ApiResponseException e )
{
Debug . LogFormat ( "{0}" , e ) ;
}您可以避免在需要抓住並使用Task.ContinueWith(...)情況下使用await 。
client . GetAccountAsync ( session ) . ContinueWith ( t =>
{
if ( t . IsFaulted || t . IsCanceled )
{
Debug . LogFormat ( "{0}" , t . Exception ) ;
return ;
}
var account = t . Result ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
} ) ;Satori是一種用於為可行分析,A/B測試和遠程配置提供動力的遊戲的LiveOps服務器。使用satori Unity客戶端從Unity遊戲中與Satori一起使用。
完整文檔在線-https://heroiclabs.com/docs/satori/client-libraries/unity
創建一個客戶對象,該對象接受您作為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”之前列出的文檔鏈接。
對於Nakama和Satori WebGL構建,您應該確保將IHttpAdapter傳遞到客戶端是UnityWebRequestAdapter 。
var client = new Client ( "defaultkey" , UnityWebRequestAdapter . Instance ) ;對於Nakama,使用NewSocket()擴展方法來創建套接字或手動設置每個平台的ISocketAdapter 。
var socket = client . NewSocket ( ) ;
// or
#if UNITY_WEBGL && ! UNITY_EDITOR
ISocketAdapter adapter = new JsWebSocketAdapter ( ) ;
#else
ISocketAdapter adapter = new WebSocketAdapter ( ) ;
#endif
var socket = Socket . From ( client , adapter ) ;在2021.1之前測試我們的示例WebGL場景時,請確保進入構建設置並將C ++編譯器配置設置為發布,而不是由於Unity WebGL構建中的出色問題而不是調試: https://issuetracker.unity3d.com/issues/webgl-build-threows-threads-threads-are-not-enabled-for-this-platform-error-當programs-built-using-using-debug-c-c-c-plus-plus-plus-plus-plus-plus-plus-plus-plus-plus-compiler-configuration
開發路線圖作為GitHub問題進行管理,並歡迎拉動請求。如果您有興趣增強代碼,請打開一個問題,討論更改或在社區論壇中進行討論。
該項目可以團結開放,以創建“ .unitypackage”。
該項目是根據Apache-2許可證獲得許可的。