Ini adalah monorepositori UnityEngine Heroic Labs yang berisi perpustakaan untuk mengakses dua layanan backend yang berbeda, Nakama dan Satori.
Klien dibangun di atas klien .NET dengan ekstensi untuk Unity Engine. Mereka membutuhkan versi runtime skrip .net 4.6 untuk diatur dalam editor.
Nakama adalah server open-source yang dirancang untuk menyalakan game dan aplikasi modern. Fitur termasuk akun pengguna, obrolan, sosial, mak comblang, multiplayer realtime, dan banyak lagi.
Dokumentasi lengkap online-https://heroiclabs.com/docs/unity-client-guide
Anda harus mengatur server dan database sebelum Anda dapat terhubung dengan klien. Cara paling sederhana adalah dengan menggunakan Docker tetapi melihat dokumentasi server untuk opsi lain.
Pasang dan jalankan server. Ikuti instruksi ini.
Instal Unity SDK. Anda memiliki tiga opsi untuk ini.
Untuk menggunakan rilis resmi, Anda dapat mengunduh .UnityPackage atau .tar dari halaman rilis dan mengimpornya ke proyek Anda. Jika Anda memilih opsi .tar, Anda dapat mengimpornya dari dropdown di jendela Unity Package Manager.
Atau, jika Anda ingin memeriksa rilis tertentu atau berkomitmen dari GitHub dan menggunakan Unity 2019.4.1 atau lebih baru, Anda dapat menambahkan yang berikut ini ke file manifest.json di folder Packages proyek Anda:
"com.heroiclabs.nakama-unity" : " https://github.com/heroiclabs/nakama-unity.git?path=/Packages/Nakama#<commit | tag> "Opsi terakhir Anda adalah mengunduh binari prebuilt dari toko aset.
Gunakan kredensial koneksi untuk membangun objek klien.
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 ) ; Objek klien memiliki banyak metode untuk menjalankan berbagai fitur di server atau membuka koneksi soket realtime dengan server.
Ada berbagai cara untuk mengotentikasi dengan server. Otentikasi dapat membuat pengguna jika belum ada dengan kredensial tersebut. Juga mudah untuk diotentikasi dengan profil sosial dari Google Play Games, Facebook, Game Center, dll.
var deviceId = SystemInfo . deviceUniqueIdentifier ;
var session = await client . AuthenticateDeviceAsync ( deviceId ) ;
Debug . Log ( session ) ; Ketika diautentikasi server merespons dengan token auth (JWT) yang berisi properti yang bermanfaat dan didesasalized menjadi objek 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.Disarankan untuk menyimpan token auth dari sesi dan memeriksa saat startup jika telah kedaluwarsa. Jika token telah kedaluwarsa, Anda harus reutentikasi. Waktu kedaluwarsa token dapat diubah sebagai pengaturan di server.
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 ) ;Klien mencakup banyak API builtin untuk berbagai fitur server game. Ini dapat diakses dengan metode async. Ini juga dapat memanggil logika khusus sebagai fungsi RPC di server. Ini juga dapat dieksekusi dengan objek soket.
Semua permintaan dikirim dengan objek sesi yang mengesahkan klien.
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 ) ;Permintaan dapat disuplai dengan Ceritry Configurations dalam kasus kesalahan jaringan atau server transien.
Konfigurasi tunggal dapat digunakan untuk mengontrol semua Perilaku Permintaan Permintaan:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;Atau, konfigurasi dapat disediakan secara per permintaan:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration ) ;Konfigurasi coba lagi per-request mengganti konfigurasi coba lagi global.
Permintaan juga dapat disediakan dengan token pembatalan jika Anda perlu membatalkannya di tengah penerbangan:
var canceller = new CancellationTokenSource ( ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration : null , canceller ) ;
await Task . Delay ( 25 ) ;
canceller . Cancel ( ) ; // will raise a TaskCanceledExceptionKlien dapat membuat satu atau lebih soket dengan server. Setiap soket dapat memiliki pendengar acara sendiri yang terdaftar untuk tanggapan yang diterima dari server.
var socket = client . NewSocket ( ) ;
socket . Connected += ( ) => Debug . Log ( "Socket connected." ) ;
socket . Closed += ( ) => Debug . Log ( "Socket closed." ) ;
await socket . ConnectAsync ( session ) ; Jika Anda ingin penangan soket untuk mengeksekusi utas utama Unity luar, lewati useMainThread: false :
var socket = client . NewSocket ( useMainThread : false ) ; Anda dapat menangkap kesalahan saat menggunakan perancah await dengan tugas di C#.
try
{
var account = await client . GetAccountAsync ( session ) ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
}
catch ( ApiResponseException e )
{
Debug . LogFormat ( "{0}" , e ) ;
} Anda dapat menghindari penggunaan await di mana pengecualian perlu ditangkap dan menggunakan Task.ContinueWith(...) .
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 adalah server LIVEOPS untuk game yang mendukung analitik yang dapat ditindaklanjuti, pengujian A/B dan konfigurasi jarak jauh. Gunakan klien Unity Satori untuk coomunicate dengan Satori dari dalam game Unity Anda.
Dokumentasi lengkap online - https://heroiclabs.com/docs/satori/client-libraries/unity
Buat objek klien yang menerima API yang Anda berikan sebagai pelanggan Satori.
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 ) ;Kemudian otentikasi dengan server untuk mendapatkan sesi Anda.
// 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 ) ;
}Menggunakan klien Anda bisa mendapatkan eksperimen atau bendera fitur apa pun, pengguna milik.
var experiments = await client . GetExperimentsAsync ( session ) ;
var flag = await client . GetFlagAsync ( session , "FlagName" ) ;Anda juga dapat mengirim acara sewenang -wenang ke server:
await client . EventAsync ( session , new Event ( "gameLaunched" , DateTime . UtcNow ) ) ;Ini hanya subset dari API klien Satori, jadi silakan lihat tautan dokumentasi yang tercantum sebelumnya untuk API lengkap.
Untuk Nakama dan Satori Webgl build, Anda harus memastikan IHttpAdapter masuk ke klien adalah UnityWebRequestAdapter .
var client = new Client ( "defaultkey" , UnityWebRequestAdapter . Instance ) ; Untuk Nakama, gunakan metode ekstensi NewSocket() untuk membuat soket atau secara manual mengatur ISocketAdapter kanan per platform.
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 ) ;Saat menguji contoh adegan WebGL kami sebelum 2021.1, pastikan untuk masuk ke pengaturan build dan atur konfigurasi kompiler C ++ untuk dirilis alih -alih debug karena masalah yang luar biasa di Unity WebGL Builds: https://issuetracker.unity3d.com/issues/webgl-build-hrows-threads-are-not-abled-for-this-platform-error-when-programs-built-go-debug-c-plus-plus-komprigasi-kompromi
Peta jalan pengembangan dikelola sebagai masalah gitub dan permintaan tarik dipersilakan. Jika Anda tertarik untuk meningkatkan kode, buka masalah untuk membahas perubahan atau mampir dan diskusikan di Forum Komunitas.
Proyek ini dapat dibuka di Unity untuk membuat ".unitypackage".
Proyek ini dilisensikan di bawah lisensi APACHE-2.