LUA 5.1로 작성된 Nakama 서버의 LUA 클라이언트.
Nakama는 현대적인 게임 및 앱에 전원을 공급하도록 설계된 오픈 소스 서버입니다. 기능에는 사용자 계정, 채팅, 소셜, 매치 메이커, 실시간 멀티 플레이어 등이 있습니다.
이 클라이언트는 서버와 함께 전체 API 및 소켓 옵션을 구현합니다. LUA 기반 게임 엔진과 호환되도록 LUA 5.1로 작성되었습니다.
전체 문서는 여기에서 확인할 수 있습니다.
클라이언트와 연결하기 전에 서버 및 데이터베이스를 설정해야합니다. 가장 간단한 방법은 Docker를 사용하는 것이지만 다른 옵션에 대한 서버 문서를 살펴 보는 것입니다.
서버를 설치하고 실행하십시오. 다음 지침을 따르십시오.
프로젝트에 클라이언트를 추가하십시오.
game.project 에 라이브러리 종속성으로 추가해야합니다. 클라이언트는 이제 프로젝트의 nakama 폴더에 나타납니다.프로젝트에 종속성을 추가하십시오. DEFOLD 프로젝트에서는 Game.Project에 다음 의존성 중 하나를 추가해야합니다.
연결 자격 증명을 사용하여 Nakama 클라이언트를 초기화하십시오.
local defold = require " nakama.engine.defold "
local nakama = require " nakama.nakama "
local config = {
host = " 127.0.0.1 " ,
port = 7350 ,
use_ssl = false ,
username = " defaultkey " ,
password = " " ,
engine = defold ,
timeout = 10 , -- connection timeout in seconds
}
local client = nakama . create_client ( config )(선택 사항) Nakama는 세션 토큰과 매치 데이터의 인코딩 및 디코딩을 위해 세션을 위해 Base64 디코딩을 사용합니다. 기본 Base64 인코더 및 디코더는 LUA로 작성됩니다. Base64 인코딩 및 디코딩 단계의 성능을 높이려면 C로 작성된 Base64 인코더를 사용할 수 있습니다. Defold 프로젝트에서는 Game.Project에 다음 종속성을 추가해야합니다.
클라이언트는 서버에서 다양한 기능을 실행하거나 서버와의 실시간 소켓 연결을 열 수있는 많은 방법이 있습니다.
서버로 인증하는 다양한 방법이 있습니다. 인증은 해당 자격 증명으로 아직 존재하지 않으면 사용자를 생성 할 수 있습니다. 또한 Google Play 게임, Facebook, 게임 센터 등의 소셜 프로필로 인증하기 쉽습니다.
local client = nakama . create_client ( config )
local email = " [email protected] "
local password = " batsignal "
local session = client . authenticate_email ( email , password )
pprint ( session )참고 :이 스 니펫을 실행하려면 아래의 요청 섹션을 참조하십시오 (a) 동기식으로.
인증되면 서버는 API 요청을 인증하는 데 사용할 수있는 AUT 토큰 (JWT)으로 응답합니다. 토큰에는 유용한 특성이 포함되어 있으며 session 테이블로 사막화됩니다.
local client = nakama . create_client ( config )
local session = client . authenticate_email ( email , password )
print ( session . created )
print ( session . token ) -- raw JWT token
print ( session . expires )
print ( session . user_id )
print ( session . username )
print ( session . refresh_token ) -- raw JWT token for use when refreshing the session
print ( session . refresh_token_expires )
print ( session . refresh_token_user_id )
print ( session . refresh_token_username )
-- Use the token to authenticate future API requests
nakama . set_bearer_token ( client , session . token )
-- Use the refresh token to refresh the authentication token
nakama . session_refresh ( client , session . refresh_token ) 세션에서 인증 토큰을 저장하고 만료 된 경우 시작시 확인하는 것이 좋습니다. 토큰이 만료되면 다시 인증해야합니다. 토큰이 만료 되려면 새로 고침해야합니다. 토큰의 만료 시간은 서버의 설정으로 변경 될 수 있습니다. session.store(session) 를 사용하여 세션을 저장하고 나중에 session.restore() 사용하여 복원 할 수 있습니다.
local nakama_session = require " nakama.session "
local client = nakama . create_client ( config )
-- restore a session
local session = nakama_session . restore ()
if session and nakama_session . is_token_expired_soon ( session ) and not nakama . is_refresh_token_expired ( session ) then
print ( " Session has expired or is about to expire. Refreshing. " )
session = nakama . session_refresh ( client , session . refresh_token )
nakama_session . store ( session )
elseif not session or nakama_session . is_refresh_token_expired ( session ) then
print ( " Session does not exist or it has expired. Must reauthenticate. " )
session = client . authenticate_email ( " [email protected] " , " foobar123 " , nil , true , " britzl " )
nakama_session . store ( session )
end
client . set_bearer_token ( session . token )클라이언트에는 게임 서버의 다양한 기능을위한 많은 내장 API가 포함되어 있습니다. 이들은 콜백 함수를 사용하여 결과를 반환하거나 결과가 수신 될 때까지 수율 (예 : 동기식 및 Lua Coroutine 내에서 실행해야 함)으로 액세스 할 수 있습니다.
local client = nakama . create_client ( config )
-- using a callback
client . get_account ( function ( account )
print ( account . user . id );
print ( account . user . username );
print ( account . wallet );
end )
-- if run from within a coroutine
local account = client . get_account ()
print ( account . user . id );
print ( account . user . username );
print ( account . wallet );Nakama 클라이언트는 여러 요청을 동기식으로 실행하기 위해 코 루틴을 작성하고 시작하는 편의 기능을 제공합니다.
nakama . sync ( function ()
local account = client . get_account ()
local result = client . update_account ( request )
end )Nakama는 실패한 API 호출이 어떻게 재조정되는지 제어하기 위해 전 세계 및 요청 별 재시도 구성을 가지고 있습니다.
local retries = require " nakama.util.retries "
-- use a global retry policy with 5 attempts with 1 second intervals
local config = {
host = " 127.0.0.1 " ,
port = 7350 ,
username = " defaultkey " ,
password = " " ,
retry_policy = retries . fixed ( 5 , 1 ),
engine = defold ,
}
local client = nakama . create_client ( config )
-- use a retry policy specifically for this request
-- 5 retries at intervals increasing by 1 second between attempts (eg 1s, 2s, 3s, 4s, 5s)
nakama . list_friends ( client , 10 , 0 , " " , retries . incremental ( 5 , 1 ))취소 토큰을 작성하고 요청이 완료되기 전에 요청을 취소하라는 요청으로 전달하십시오.
-- use a global retry policy with 5 attempts with 1 second intervals
local config = {
host = " 127.0.0.1 " ,
port = 7350 ,
username = " defaultkey " ,
password = " " ,
retry_policy = retries . fixed ( 5 , 1 ),
engine = defold ,
}
local client = nakama . create_client ( config )
-- create a cancellation token
local token = nakama . cancellation_token ()
-- start a request and proivide the cancellation token
nakama . list_friends ( client , 10 , 0 , " " , nil , callback , token )
-- immediately cancel the request without waiting for the request callback to be invoked
nakama . cancel ( token )실시간 WebSocket 연결을 통해 서버에 연결하여 채팅 메시지를 보내고 수신하고 알림을 받고 멀티 플레이어 일치에 매치 할 수 있습니다.
먼저 서버에 실시간 소켓을 만들어야합니다.
local client = nakama . create_client ( config )
-- create socket
local socket = client . create_socket ()
nakama . sync ( function ()
-- connect
local ok , err = socket . connect ()
end )그런 다음 채팅 채널에 가입하여 메시지를 보냅니다.
-- send channel join message
local channel_id = " pineapple-pizza-lovers-room "
local result = socket . channel_join ( socket , 1 , channel_id , false , false )
-- send channel messages
local result = socket . channel_message_send ( channel_id , " Pineapple doesn't belong on a pizza! " )클라이언트 소켓에는 서버에서받은 다양한 이벤트에서 호출되는 이벤트 리스너가 있습니다. 예:
socket . on_disconnect ( function ( message )
print ( " Disconnected! " )
end )사용 가능한 청취자 :
on_disconnect 클라이언트가 서버에서 분리 될 때 이벤트를 처리합니다.on_channel_presence_eventon_match_presence_eventon_match_dataon_matchon_matchmaker_matchedon_notificationson_party_presence_eventon_partyon_party_dataon_party_join_requeston_status_presence_eventon_statuson_stream_dataon_erroron_channel_messageon_channel_message Nakama는 일치 메시지의 data 속성에서 이진 내용을 지원합니다. 데이터 유형에 관계없이 서버는 Base64에 인코딩 된 데이터 만 허용하므로 일반 텍스트 데이터 또는 JSON, 또는 Nakama 서버가 데이터를 잘못 변성하고 클라이언트를 분리하지 않도록하십시오 (이러한 이벤트를 감지하기 위해 서버 로깅을 debug 위해 서버 로깅을 설정).
nakama.create_match_data_message() 사용하여 메시지가 생성 된 경우 Nakama는 자동으로 매치 데이터를 인코딩합니다. Nakama는 또한 on_matchdata 리스너를 호출하기 전에 수신 된 일치 데이터를 자동으로 Base64로 사용합니다.
local json = require " nakama.util.json "
local match_id = " ... "
local op_code = 1
local data = json . encode ({
dest_x = 1.0 ,
dest_y = 0.1 ,
})
-- send a match data message. The data will be automatically base64 encoded.
socket . match_data ( match_id , op_code , data ) 릴레이 된 멀티 플레이어에서는 다른 클라이언트의 메시지를 받게됩니다. 클라이언트는 이미 메시지 데이터를 on_matchdata 리스너로 전송하기 전에 메시지 데이터를 디코딩했습니다. 위의 예에서와 같이 데이터가 인코딩 된 경우 직접 해독해야합니다.
socket . on_matchdata ( function ( message )
local match_data = message . match_data
local data = json . decode ( match_data . data )
pprint ( data ) -- gameplay coordinates from the example above
end )권위있는 일치에서 서버가 시작한 메시지는 기본적으로 유효한 JSON으로 제공됩니다.
LUA 5.1로 작성된 Satori의 LUA 클라이언트.
Satori는 실행 가능한 분석, A/B 테스트 및 원격 구성을위한 게임용 LiveOps 서버입니다. Satori Defold Client를 사용하여 Defold 게임 내에서 Satori와 의사 소통하십시오.
Satori 대시 보드에서 API 키를 사용하여 Satori 클라이언트를 만듭니다.
local config = {
host = " myhost.com " ,
api_key = " my-api-key " ,
use_ssl = true ,
port = 443 ,
retry_policy = retries . incremental ( 5 , 1 ),
engine = defold ,
}
local client = satori . create_client ( config )그런 다음 세션을 얻으려면 인증 :
satori . sync ( function ()
local uuid = defold . uuid ()
local result = client . authenticate ( nil , nil , uuid )
if not result . token then
error ( " Unable to login " )
return
end
client . set_bearer_token ( result . token )
end )클라이언트를 사용하면 실험이나 기능 플래그를 얻을 수 있으며 사용자는 속합니다.
satori . sync ( function ()
local experiments = satori . get_experiments ( client )
pprint ( experiments )
local flags = satori . get_flags ( client )
pprint ( flags )
end )개발 로드맵은 GitHub 문제로 관리되며 풀 요청을 환영합니다. 코드 향상에 관심이 있으시면 변경 사항을 논의하거나 Community Forum에서 논의하고 논의하는 문제를 열어주십시오.
단위 테스트는 tests 폴더에서 찾을 수 있습니다. 망원경 (LUA 5.3+를지지하는 포크)을 사용하여 실행하십시오.
./tsc -f test/test_nakama.lua test/test_satori.lua test/test_socket.lua test/test_session.lua
API 문서는 LDOC로 생성되어 GitHub 페이지에 배포됩니다.
API 주석을 변경할 때 LDOC를 다시 실행하고 docs/* 의 변경 사항을 커밋하십시오.
참고 : nakama/nakama.lua 에 대한 의견은 codegen/main.go 에서 작성해야합니다.
LDOC를 실행하려면 :
# in the project root, generate nakama.lua
# requires go and https://github.com/heroiclabs/nakama to be checked out
go run codegen/main.go -output nakama/nakama.lua ../nakama/apigrpc/apigrpc.swagger.json
# install ldoc (mac)
brew install luarocks
luarocks install ldoc
# run ldoc
doc . -d docs
CodeGen 폴더의 지침을 참조하십시오.
Nakama와 Satori를 다른 LUA 기반 엔진에 데려 오는 나카마와 Satori의 적응은 Nakama 클라이언트를 구성 할 때 다른 엔진 모듈을 제공하는 것만 큼 쉬워야합니다.
-- nakama
local myengine = require " nakama.engine.myengine "
local nakama = require " nakama.nakama "
local nakama_config = {
engine = myengine ,
}
local nakama_client = nakama . create_client ( nakama_config )
-- satori
local myengine = require " nakama.engine.myengine "
local satori = require " satori.satori "
local satori_config = {
engine = myengine ,
}
local satori_client = satori . create_client ( satori_config )엔진 모듈은 다음 기능을 제공해야합니다.
http(config, url_path, query_params, method, post_data, cancellation_token, callback) - http 요청.
config - 구성 테이블이 nakama.create() 또는 satori.create() 로 전달됩니다.url_path 기본 URI에 추가되는 경로query_params URL 쿼리 매개 변수로 사용할 키 - 값 쌍method - "get", "post"post_data 게시 할 데이터cancellation_token cancellation_token.cancelled 인지 확인하십시오callback - 결과와 함께 호출 할 함수 (응답) socket_create(config, on_message) - 소켓 생성. 소켓 인스턴스를 반환해야합니다 (엔진 특정 소켓 상태가있는 테이블).
config nakama.create() 또는`satori.create ()로 전달 된 구성 테이블on_message 서버에서 메시지가 전송 될 때 호출 할 함수 socket_connect(socket, callback) - 연결 소켓을 연결합니다.
socket -Socket Incase가 socket_create() 에서 반환되었습니다.callback - 결과와 함께 호출 할 함수 (OK, err) socket_send(socket, message) - 소켓에서 메시지를 보냅니다.
socket -Socket Incase가 socket_create() 에서 반환되었습니다.message - 보내는 메시지 uuid() - UUID를 만듭니다
이 프로젝트는 Apache-2 라이센스에 따라 라이센스가 부여됩니다.