これは、2つの異なるバックエンドサービス、NakamaとSatoriにアクセスするためのライブラリを含むHeroic LabsのUnityEngine Monorepositoryです。
クライアントは、Unityエンジン用の拡張機能を備えた.NETクライアントの上に構築されています。 .NET 4.6スクリプトランタイムバージョンをエディターに設定する必要があります。
Nakamaは、モダンなゲームやアプリを強化するために設計されたオープンソースサーバーです。機能には、ユーザーアカウント、チャット、ソーシャル、マッチメーカー、リアルタイムマルチプレイヤーなどが含まれます。
完全なドキュメントはオンラインです-https://heroiclabs.com/docs/unity-client-guideです
クライアントに接続する前に、サーバーとデータベースをセットアップする必要があります。最も簡単な方法は、Dockerを使用することですが、他のオプションのサーバードキュメントをご覧ください。
サーバーをインストールして実行します。これらの指示に従ってください。
Unity SDKをインストールします。これには3つのオプションがあります。
公式リリースを使用するには、リリースページから.unityPackageまたは.tarをダウンロードして、プロジェクトにインポートできます。 .tarオプションを選択した場合、Unity Package Managerウィンドウのドロップダウンからインポートできます。
または、GitHubから特定のリリースまたはコミットをチェックアウトし、Unity 2019.4.1以降を使用している場合は、プロジェクトのPackagesフォルダーのmanifest.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、ゲームセンターなどのソーシャルプロフィールで簡単に認証することもできます。
var deviceId = SystemInfo . deviceUniqueIdentifier ;
var session = await client . AuthenticateDeviceAsync ( deviceId ) ;
Debug . Log ( session ) ;認証されると、サーバーは有用なプロパティを含むAuthトークン(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.AUTHトークンをセッションから保存し、起動時に有効期限が切れている場合はチェックすることをお勧めします。トークンの有効期限が切れている場合は、再認証する必要があります。トークンの有効期限は、サーバーの設定として変更できます。
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クライアントは、サーバーで1つ以上のソケットを作成できます。各ソケットは、サーバーから受信した応答について登録された独自のイベントリスナーを持つことができます。
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 Clientを使用して、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 Client 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シーンのサンプルをテストするときは、ビルド設定に移動し、Unity WebGLビルドでの顕著な問題のためにデバッグの代わりにリリースするC ++コンパイラ構成をリリースするように設定してください。 https://issuetracker.unity3d.com/issues/webgl-build-throws-threads-are-not-enabled-for-this-platform-gragrs-built-c-plus-plus-plus-compiler-configuration
開発ロードマップは、githubの問題として管理されており、プルリクエストを歓迎します。コードを強化することに興味がある場合は、問題を開いて変更について話し合うか、コミュニティフォーラムでドロップインして議論してください。
このプロジェクトは、「.UnityPackage」を作成するためにUnityで開設できます。
このプロジェクトは、Apache-2ライセンスの下でライセンスされています。