Dies ist die UnityEngine Monorepository von Heroic Labs, die Bibliotheken für den Zugriff auf zwei verschiedene Backend -Dienste, Nakama und Satori, enthält.
Die Clients basieren auf dem .NET -Client mit Erweiterungen für Unity Engine. Sie erfordern, dass .NET 4.6 Scripting Runtime -Version im Editor festgelegt wird.
Nakama ist ein Open-Source-Server, der moderne Spiele und Apps mit Strom versorgt. Zu den Funktionen gehören Benutzerkonten, Chat, Social, Matchmaker, Echtzeitmultiplayer und vieles mehr.
Vollständige Dokumentation ist online-https://heroiclabs.com/docs/unity-client-guide
Sie müssen den Server und die Datenbank einrichten, bevor Sie eine Verbindung mit dem Client herstellen können. Am einfachsten ist es, Docker zu verwenden, aber einen Blick auf die Serverdokumentation für andere Optionen.
Installieren und führen Sie die Server aus. Befolgen Sie diese Anweisungen.
Installieren Sie die Einheit SDK. Sie haben drei Optionen dafür.
Um eine offizielle Veröffentlichung zu verwenden, können Sie entweder den .unitypackage oder .tar von der Releases -Seite herunterladen und in Ihr Projekt importieren. Wenn Sie sich für die Option .tar entschieden haben, können Sie sie aus einem Dropdown -Unternehmen im Fenster "Unity Package Manager" importieren.
Wenn Sie eine bestimmte Version oder ein bestimmtes Veröffentlichung von GitHub ansehen und die Unity 2019.4.1 oder höher anwenden möchten, können Sie die Folge der manifest.json -Datei in den Packages -Ordner Ihres Projekts hinzufügen:
"com.heroiclabs.nakama-unity" : " https://github.com/heroiclabs/nakama-unity.git?path=/Packages/Nakama#<commit | tag> "Ihre endgültige Option besteht darin, vorgefertigte Binärdateien aus dem Asset Store herunterzuladen.
Verwenden Sie die Verbindungsanmeldeinformationen, um ein Client -Objekt zu erstellen.
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 ) ; Das Client -Objekt verfügt über viele Methoden, um verschiedene Funktionen auf dem Server auszuführen oder Echtzeit -Socket -Verbindungen mit dem Server zu öffnen.
Es gibt verschiedene Möglichkeiten, sich mit dem Server zu authentifizieren. Die Authentifizierung kann einen Benutzer erstellen, wenn er mit diesen Anmeldeinformationen noch nicht vorhanden ist. Es ist auch einfach, sich mit einem sozialen Profil von Google Play Games, Facebook, Game Center usw. zu authentifizieren.
var deviceId = SystemInfo . deviceUniqueIdentifier ;
var session = await client . AuthenticateDeviceAsync ( deviceId ) ;
Debug . Log ( session ) ; Wenn der Server authentifiziert wurde, antwortet der Server mit einem Auth -Token (JWT), das nützliche Eigenschaften enthält und in ein Session deserialisiert wird.
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.Es wird empfohlen, das Auth -Token aus der Sitzung zu speichern und beim Start zu überprüfen, ob es abgelaufen ist. Wenn das Token abgelaufen ist, müssen Sie erneut automatisch werden. Die Ablaufzeit des Tokens kann als Einstellung im Server geändert werden.
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 ) ;Der Client enthält viele integrierte APIs für verschiedene Funktionen des Spielservers. Diese können mit den asynchronen Methoden zugegriffen werden. Es kann auch benutzerdefinierte Logik als RPC -Funktionen auf dem Server aufrufen. Diese können auch mit einem Socket -Objekt ausgeführt werden.
Alle Anfragen werden mit einem Sitzungsobjekt gesendet, das den Client autorisiert.
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 ) ;Anforderungen können mit einer Wiederholungskonfiguration in Fällen von transienten Netzwerk- oder Serverfehlern versorgt werden.
Eine einzelne Konfiguration kann verwendet werden, um das gesamte Verhalten des Anforderungsverhaltens zu steuern:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;Oder die Konfiguration kann pro-rquest geliefert werden:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration ) ;Die Konfigurationen pro Equest Rety Override die globale Wiederholungskonfiguration.
Anfragen können auch mit einem Stornierungs-Token versorgt werden, wenn Sie sie mit dem Flug stornieren müssen:
var canceller = new CancellationTokenSource ( ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration : null , canceller ) ;
await Task . Delay ( 25 ) ;
canceller . Cancel ( ) ; // will raise a TaskCanceledExceptionDer Client kann mit dem Server eine oder mehrere Sockets erstellen. Jeder Socket kann seine eigenen Ereignishörer für Antworten registrieren lassen, die vom Server empfangen werden.
var socket = client . NewSocket ( ) ;
socket . Connected += ( ) => Debug . Log ( "Socket connected." ) ;
socket . Closed += ( ) => Debug . Log ( "Socket closed." ) ;
await socket . ConnectAsync ( session ) ; Wenn Sie möchten, dass Socket -Handler den Hauptfaden von Outside Unity ausführen, passieren Sie das useMainThread: false Argument:
var socket = client . NewSocket ( useMainThread : false ) ; Sie können Fehler erfassen, wenn Sie await -Gerüst mit Aufgaben in C#verwenden.
try
{
var account = await client . GetAccountAsync ( session ) ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
}
catch ( ApiResponseException e )
{
Debug . LogFormat ( "{0}" , e ) ;
} Sie können die Verwendung von await vermeiden, wenn Ausnahmen gefangen werden müssen und Task.ContinueWith(...) verwenden müssen.
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 ist ein LiveOp -Server für Spiele, die verteilungsfähige Analysen, A/B -Tests und Remote -Konfiguration betreiben. Verwenden Sie den Client der Satori Unity, um sich aus Ihrem Unity -Spiel mit Satori zu koomieren.
Vollständige Dokumentation ist online - https://heroiclabs.com/docs/satori/client-library/unity
Erstellen Sie ein Client -Objekt, das die API akzeptiert, die Sie als Satori -Kunde erhalten haben.
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 ) ;Dann authentifizieren Sie sich mit dem Server, um Ihre Sitzung zu erhalten.
// 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 ) ;
}Mit dem Client können Sie alle Experimente oder Feature -Flags abrufen. Der Benutzer gehört zu.
var experiments = await client . GetExperimentsAsync ( session ) ;
var flag = await client . GetFlagAsync ( session , "FlagName" ) ;Sie können auch beliebige Ereignisse an den Server senden:
await client . EventAsync ( session , new Event ( "gameLaunched" , DateTime . UtcNow ) ) ;Dies ist nur eine Untergruppe der Satori -Client -API. Bitte beachten Sie den zuvor aufgeführten Dokumentationslink für die vollständige API.
Sowohl für Nakama als auch für Satori WebGL -Builds sollten Sie sicherstellen, dass der in den Kunden übergabes IHttpAdapter ein UnityWebRequestAdapter ist.
var client = new Client ( "defaultkey" , UnityWebRequestAdapter . Instance ) ; Verwenden Sie für Nakama die NewSocket() -Erweiterungsmethode, um den Socket zu erstellen, oder stellen Sie den richtigen ISocketAdapter pro Plattform manuell ein.
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 ) ;Wenn Sie unsere Beispiel -WebGL -Szene vor 2021.1 testen, gehen Sie in die Build -Einstellungen ein und setzen Sie die C ++ - Compiler -Konfiguration auf die Veröffentlichung anstelle eines Debugs aufgrund eines herausragenden Problems in Unity WebGL -Builds: https://issuetracker.unity3d.com/issues/webgl-build-throws-reads-are-not-enabled-for-this-platform-error-when-program-built-using-debug-plus-plus-compiler-conefiguration
Die Entwicklungs -Roadmap wird verwaltet, da Github -Probleme und Zuganfragen willkommen sind. Wenn Sie daran interessiert sind, den Code zu verbessern, öffnen Sie bitte ein Problem, um die Änderungen zu besprechen oder ihn im Community -Forum zu besprechen.
Dieses Projekt kann in Einheit geöffnet werden, um ein ".unitypackage" zu erstellen.
Dieses Projekt ist unter der Apache-2-Lizenz lizenziert.