Klien Godot untuk server Nakama ditulis dalam GDScript.
Nakama adalah server sumber terbuka yang dirancang untuk mendukung game dan aplikasi modern. Fitur-fiturnya termasuk akun pengguna, obrolan, sosial, pencari jodoh, multipemain waktu nyata, dan banyak lagi.
Klien ini mengimplementasikan opsi API dan soket lengkap dengan server. Itu ditulis dalam GDScript untuk mendukung Godot Engine 4.0+
.
Dokumentasi lengkap tersedia online - https://heroiclabs.com/docs
Anda sedang melihat klien Nakama versi Godot 4 untuk Godot.
Jika Anda menggunakan Godot 3, Anda perlu menggunakan cabang 'godot-3' di GitHub.
Anda harus menyiapkan server dan database sebelum dapat terhubung dengan klien. Cara termudah adalah dengan menggunakan Docker tetapi lihat dokumentasi server untuk opsi lainnya.
Instal dan jalankan server. Ikuti petunjuk ini.
Unduh klien dari halaman rilis dan impor ke proyek Anda. Anda juga dapat mendownloadnya dari repositori aset.
Tambahkan singleton Nakama.gd
(di addons/com.heroiclabs.nakama/
) sebagai autoload di Godot.
Gunakan kredensial koneksi untuk membangun objek klien menggunakan singleton.
extends Node
func _ready ():
var scheme = "http"
var host = "127.0.0.1"
var port = 7350
var server_key = "defaultkey"
var client := Nakama . create_client ( server_key , host , port , scheme )
Objek klien memiliki banyak metode untuk menjalankan berbagai fitur di server atau membuka koneksi soket realtime dengan server.
Ada berbagai cara untuk mengautentikasi dengan server. Otentikasi dapat membuat pengguna jika mereka belum ada dengan kredensial tersebut. Mengautentikasinya juga mudah dengan profil sosial dari Google Play Game, Facebook, Game Center, dll.
var email = "[email protected]"
var password = "batsignal"
# Use 'await' to wait for the request to complete.
var session : NakamaSession = await client . authenticate_email_async ( email , password )
print ( session )
Saat diautentikasi, server merespons dengan token autentikasi (JWT) yang berisi properti berguna dan dideserialisasi menjadi objek NakamaSession
.
print ( session . token ) # raw JWT token
print ( session . user_id )
print ( session . username )
print ( "Session has expired: %s " % session . expired )
print ( "Session expires at: %s " % session . expire_time )
Disarankan untuk menyimpan token autentikasi dari sesi dan memeriksa saat startup apakah sudah kedaluwarsa. Jika token telah kedaluwarsa, Anda harus mengautentikasi ulang. Waktu kedaluwarsa token dapat diubah sesuai pengaturan di server.
var authtoken = "restored from somewhere"
var session2 = NakamaClient . restore_session ( authtoken )
if session2 . expired :
print ( "Session has expired. Must reauthenticate!" )
CATATAN: Durasi sesi dapat diubah di server dengan argumen flag perintah --session.token_expiry_sec
.
Klien menyertakan banyak API bawaan untuk berbagai fitur server game. Ini dapat diakses dengan metode async. Itu juga dapat memanggil logika khusus dalam fungsi RPC di server. Ini juga dapat dieksekusi dengan objek soket.
Semua permintaan dikirim dengan objek sesi yang memberi otorisasi kepada klien.
var account = await client . get_account_async ( session )
print ( account . user . id )
print ( account . user . username )
print ( account . wallet )
Karena Godot Engine tidak mendukung pengecualian, setiap kali Anda membuat permintaan asinkron melalui klien atau soket, Anda dapat memeriksa apakah terjadi kesalahan melalui metode is_exception()
.
var an_invalid_session = NakamaSession . new () # An empty session, which will cause and error when we use it.
var account2 = await client . get_account_async ( an_invalid_session )
print ( account2 ) # This will print the exception
if account2 . is_exception ():
print ( "We got an exception" )
Klien dapat membuat satu atau lebih soket dengan server. Setiap soket dapat mendaftarkan pendengar acaranya sendiri untuk respons yang diterima dari server.
var socket = Nakama . create_socket_from ( client )
socket . connected . connect ( self . _on_socket_connected )
socket . closed . connect ( self . _on_socket_closed )
socket . received_error . connect ( self . _on_socket_error )
await socket . connect_async ( session )
print ( "Done" )
func _on_socket_connected ():
print ( "Socket connected." )
func _on_socket_closed ():
print ( "Socket closed." )
func _on_socket_error ( err ):
printerr ( "Socket error %s " % err )
Godot menyediakan API Multipemain Tingkat Tinggi, memungkinkan pengembang membuat RPC, memanggil fungsi yang dijalankan pada rekan lain dalam pertandingan multipemain.
Misalnya:
func _process ( delta ):
if not is_multiplayer_authority ():
return
var input_vector = get_input_vector ()
# Move the player locally.
velocity = input_vector * SPEED
move_and_slide ()
# Then update the player's position on all other connected clients.
update_remote_position . rpc ( position )
@rpc ( any_peer )
func update_remote_position ( new_position ):
position = new_position
Godot menyediakan sejumlah backend bawaan untuk mengirim RPC, termasuk: ENet, WebSockets, dan WebRTC.
Namun, Anda juga dapat menggunakan klien Nakama sebagai backend! Hal ini memungkinkan Anda untuk terus menggunakan API Multipemain Tingkat Tinggi Godot yang familiar, tetapi dengan RPC yang dikirim secara transparan melalui pertandingan Nakama secara realtime.
Untuk melakukannya, Anda perlu menggunakan kelas NakamaMultiplayerBridge
:
var multiplayer_bridge
func _ready ():
# [...]
# You must have a working 'socket', created as described above.
multiplayer_bridge = NakamaMultiplayerBridge . new ( socket )
multiplayer_bridge . match_join_error . connect ( self . _on_match_join_error )
multiplayer_bridge . match_joined . connect ( self . _on_match_joined )
get_tree (). get_multiplayer (). set_multiplayer_peer ( multiplayer_bridge . multiplayer_peer )
func _on_match_join_error ( error ):
print ( "Unable to join match: " , error . message )
func _on_match_join () -> void :
print ( "Joined match with id: " , multiplayer_bridge . match_id )
Anda juga dapat menyambung ke salah satu sinyal biasa di MultiplayerAPI
, misalnya:
get_tree (). get_multiplayer (). peer_connected . connect ( self . _on_peer_connected )
get_tree (). get_multiplayer (). peer_disconnected . connect ( self . _on_peer_disconnected )
func _on_peer_connected ( peer_id ):
print ( "Peer joined match: " , peer_id )
func _on_peer_disconnected ( peer_id ):
print ( "Peer left match: " , peer_id )
Maka Anda perlu bergabung dalam pertandingan, menggunakan salah satu metode berikut:
Buat pertandingan pribadi baru, dengan klien Anda sebagai tuan rumahnya.
multiplayer_bridge . create_match ()
Bergabunglah dengan pertandingan pribadi.
multiplayer_bridge . join_match ( match_id )
Buat atau gabung dalam pertandingan pribadi dengan nama yang diberikan.
multiplayer_bridge . join_named_match ( match_name )
Gunakan pencari jodoh untuk menemukan dan bergabung dalam pertandingan publik.
var ticket = await socket . add_matchmaker_async ()
if ticket . is_exception ():
print ( "Error joining matchmaking pool: " , ticket . get_exception (). message )
return
multiplayer_bridge . start_matchmaking ( ticket )
Setelah sinyal "match_joined" dipancarkan, Anda dapat mulai mengirim RPC seperti biasa dengan fungsi rpc()
, dan memanggil fungsi lain yang terkait dengan API Multipemain Tingkat Tinggi, seperti get_tree().get_multiplayer().get_unique_id()
dan node.set_network_authority(peer_id)
dan node.is_network_authority()
.
Jika Anda menggunakan Godot versi .NET dengan dukungan C#, Anda dapat menggunakan klien Nakama .NET, yang dapat diinstal melalui NuGet:
dotnet add package NakamaClient
Addon ini mencakup beberapa kelas C# untuk digunakan dengan klien .NET, untuk menyediakan integrasi lebih dalam dengan Godot:
GodotLogger
: Pencatat yang mencetak ke konsol Godot.GodotHttpAdapter
: Adaptor HTTP yang menggunakan node HTTPRequest Godot.GodotWebSocketAdapter
: Adaptor soket yang menggunakan WebSocketClient Godot.Berikut ini contoh cara menggunakannya:
var http_adapter = new GodotHttpAdapter ( ) ;
// It's a Node, so it needs to be added to the scene tree.
// Consider putting this in an autoload singleton so it won't go away unexpectedly.
AddChild ( http_adapter ) ;
const string scheme = "http" ;
const string host = "127.0.0.1" ;
const int port = 7350 ;
const string serverKey = "defaultkey" ;
// Pass in the 'http_adapter' as the last argument.
var client = new Client ( scheme , host , port , serverKey , http_adapter ) ;
// To log DEBUG messages to the Godot console.
client . Logger = new GodotLogger ( "Nakama" , GodotLogger . LogLevel . DEBUG ) ;
ISession session ;
try {
session = await client . AuthenticateDeviceAsync ( OS . GetUniqueId ( ) , "TestUser" , true ) ;
}
catch ( ApiResponseException e ) {
GD . PrintErr ( e . ToString ( ) ) ;
return ;
}
var websocket_adapter = new GodotWebSocketAdapter ( ) ;
// Like the HTTP adapter, it's a Node, so it needs to be added to the scene tree.
// Consider putting this in an autoload singleton so it won't go away unexpectedly.
AddChild ( websocket_adapter ) ;
// Pass in the 'websocket_adapter' as the last argument.
var socket = Socket . From ( client , websocket_adapter ) ;
Catatan: Klien Nakama .NET yang siap pakai akan berfungsi baik dengan versi desktop game Anda! Namun, ini tidak akan berfungsi dengan build HTML5, kecuali Anda menggunakan kelas GodotHttpAdapter
dan GodotWebSocketAdapter
.
Satori adalah server liveops untuk game yang mendukung analisis yang dapat ditindaklanjuti, pengujian A/B, dan konfigurasi jarak jauh. Gunakan Klien Satori Godot untuk berkomunikasi dengan Satori dari dalam game Godot Anda.
Satori hanya kompatibel dengan Godot 4.
Dokumentasi lengkap tersedia online - https://heroiclabs.com/docs/satori/client-libraries/godot/index.html
Tambahkan singleton Satori.gd
(di addons/com.heroiclabs.nakama/
) sebagai autoload di Godot.
Buat objek klien yang menerima kunci API yang diberikan kepada Anda sebagai pelanggan Satori.
extends Node
func ready ():
var scheme = "http"
var host = "127.0.0.1"
var port : Int = 7450
var apiKey = "apiKey"
var client := Satori . create_client ( apiKey , host , port , scheme )
Kemudian autentikasi dengan server untuk mendapatkan sesi Anda.
// Authenticate with the Satori server .
var session = await _client . authenticate_async ( "your-id" )
if session . is_exception ():
print ( "Error authenticating: " + session . get_exception (). _message )
else :
print ( "Authenticated successfully." )
Dengan menggunakan klien, Anda bisa mendapatkan eksperimen atau tanda fitur apa pun yang dimiliki pengguna.
var experiments = await _client . get_experiments_async ( session , [ "experiment1" , "Experiment2" ])
var flag = await _client . get_flag_async ( session , "FlagName" )
Anda juga dapat mengirim kejadian sewenang-wenang ke server:
var _event = Event . new ( "gameFinished" , Time . get_unix_time_from_system ())
await _client . event_async ( session , _event )
Peta jalan pengembangan dikelola saat masalah GitHub dan permintaan penarikan diterima. Jika Anda tertarik untuk memperbaiki kode ini, silakan buka masalah untuk mendiskusikan perubahan tersebut atau mampir dan diskusikan di forum komunitas.
Untuk menjalankan tes, Anda perlu menjalankan server dan database. Kebanyakan tes ditulis sebagai tes integrasi yang dijalankan terhadap server. Pendekatan cepat yang kami gunakan dengan alur kerja pengujian kami adalah dengan menggunakan file penulisan Docker yang dijelaskan dalam dokumentasi.
Selain itu, Anda perlu menyalin (atau menghubungkan) folder addons
di dalam folder test_suite
. Anda sekarang dapat menjalankan proyek test_suite
dari Editor Godot.
Untuk menjalankan pengujian pada mesin tanpa kepala (tanpa GPU), Anda dapat mengunduh salinan Godot Headless dan menjalankannya dari baris perintah.
Untuk mengotomatiskan prosedur ini, pindahkan biner tanpa kepala ke test_suite/bin/godot.elf
, dan jalankan pengujian melalui skrip shell test_suite/run_tests.sh
(kode keluar akan melaporkan kegagalan/keberhasilan pengujian).
cd nakama
docker-compose -f ./docker-compose-postgres.yml up
cd ..
cd nakama-godot
sh test_suite/run_tests.sh
Untuk membuat rilis baru siap didistribusikan, cukup zip folder addons secara rekursif (mungkin menambahkan CHANGELOG
, LICENSE
, dan README.md
juga).
Pada sistem unix, Anda dapat menjalankan perintah berikut (mengganti $VERSION
dengan nomor versi yang diinginkan). Ingatlah untuk memperbarui file CHANGELOG
terlebih dahulu.
zip -r nakama- $VERSION .zip addons/ LICENSE CHANGELOG.md README.md
Proyek ini dilisensikan di bawah Lisensi Apache-2.