C#으로 작성된 Nakama 서버용 .NET 클라이언트.
Nakama는 최신 게임과 앱을 구동하도록 설계된 오픈 소스 서버입니다. 기능에는 사용자 계정, 채팅, 소셜, 매치메이커, 실시간 멀티플레이어 등이 포함됩니다.
이 클라이언트는 서버와 함께 전체 API 및 소켓 옵션을 구현합니다. Unity, Xamarin, Godot, XNA 및 기타 엔진과 프레임워크를 지원하기 위해 최소한의 종속성을 갖춘 C#으로 작성되었습니다.
전체 문서는 온라인에 있습니다 - https://heroiclabs.com/docs
클라이언트에 연결하기 전에 서버와 데이터베이스를 설정해야 합니다. 가장 간단한 방법은 Docker를 사용하는 것이지만 다른 옵션에 대해서는 서버 설명서를 살펴보세요.
서버를 설치하고 실행합니다. 다음 지침을 따르십시오.
릴리스 페이지에서 클라이언트를 다운로드하여 프로젝트로 가져옵니다. 소스에서 빌드할 수도 있습니다.
연결 자격 증명을 사용하여 클라이언트 개체를 만듭니다.
// 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 ) ;
클라이언트 개체에는 서버의 다양한 기능을 실행하거나 서버와의 실시간 소켓 연결을 여는 많은 메서드가 있습니다.
서버에 인증하는 방법에는 여러 가지가 있습니다. 해당 자격 증명을 가진 사용자가 아직 존재하지 않는 경우 인증을 통해 사용자를 생성할 수 있습니다. Google Play Games, Facebook, Game Center 등의 소셜 프로필로도 쉽게 인증할 수 있습니다.
var email = "[email protected]" ;
var password = "batsignal" ;
var session = await client . AuthenticateEmailAsync ( email , password ) ;
System . Console . WriteLine ( session ) ;
인증되면 서버는 유용한 속성을 포함하고 Session
객체로 역직렬화되는 인증 토큰(JWT)으로 응답합니다.
System . Console . WriteLine ( session . AuthToken ) ; // raw JWT token
System . Console . WriteLine ( session . RefreshToken ) ; // raw JWT token.
System . Console . WriteLine ( session . UserId ) ;
System . Console . WriteLine ( session . Username ) ;
System . Console . WriteLine ( "Session has expired: {0}" , session . IsExpired ) ;
System . Console . WriteLine ( "Session expires at: {0}" , session . ExpireTime ) ;
세션에서 인증 토큰을 저장하고 시작 시 만료되었는지 확인하는 것이 좋습니다. 토큰이 만료된 경우 재인증해야 합니다. 토큰의 만료 시간은 서버 설정으로 변경할 수 있습니다.
var authToken = "restored from somewhere" ;
var refreshToken = "restored from somewhere" ;
var session = Session . Restore ( authToken , refreshToken ) ;
// Check whether a session is close to expiry.
if ( session . HasExpired ( DateTime . UtcNow . AddDays ( 1 ) ) )
{
try
{
session = await client . SessionRefreshAsync ( session ) ;
}
catch ( ApiResponseException e )
{
System . Console . WriteLine ( "Session can no longer be refreshed. Must reauthenticate!" ) ;
}
}
클라이언트에는 게임 서버의 다양한 기능을 위한 많은 내장 API가 포함되어 있습니다. 비동기 메서드를 사용하여 액세스할 수 있습니다. 또한 서버의 RPC 함수에서 사용자 지정 논리를 호출할 수도 있습니다. 소켓 개체를 사용하여 실행할 수도 있습니다.
모든 요청은 클라이언트에 권한을 부여하는 세션 개체와 함께 전송됩니다.
var account = await client . GetAccountAsync ( session ) ;
System . Console . WriteLine ( account . User . Id ) ;
System . Console . WriteLine ( account . User . Username ) ;
System . Console . WriteLine ( account . Wallet ) ;
일시적인 네트워크 또는 서버 오류가 발생할 경우 재시도 구성을 통해 요청을 제공할 수 있습니다.
단일 구성을 사용하여 모든 요청 재시도 동작을 제어할 수 있습니다.
var retryConfiguration = new RetryConfiguration ( baseDelayMs : 1000 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;
또는 요청별로 구성을 제공할 수 있습니다.
var retryConfiguration = new RetryConfiguration ( baseDelayMs : 1000 , 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
클라이언트는 서버를 사용하여 하나 이상의 소켓을 만들 수 있습니다. 각 소켓에는 서버에서 받은 응답에 대해 등록된 자체 이벤트 리스너가 있을 수 있습니다.
var socket = Socket . From ( client ) ;
socket . Connected += ( ) =>
{
System . Console . WriteLine ( "Socket connected." ) ;
} ;
socket . Closed += ( ) =>
{
System . Console . WriteLine ( "Socket closed." ) ;
} ;
socket . ReceivedError += e => System . Console . WriteLine ( e ) ;
await socket . ConnectAsync ( session ) ;
Satori는 실행 가능한 분석, A/B 테스트 및 원격 구성을 지원하는 게임용 실시간 운영 서버입니다. Satori .NET 클라이언트를 사용하여 .NET 게임 내에서 Satori와 통신하세요.
전체 문서는 온라인에 있습니다 - https://heroiclabs.com/docs/satori/client-libraries/unity/index.html
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 클라이언트 API의 하위 집합일 뿐이므로 전체 API에 대해서는 앞서 나열된 설명서 링크를 참조하세요.
개발 로드맵은 GitHub 문제로 관리되며 풀 요청을 환영합니다. 코드 개선에 관심이 있는 경우 이슈를 열어 변경 사항에 대해 논의하거나 커뮤니티 포럼에 들러서 논의하십시오.
코드베이스는 Dotnet CLI를 사용하여 구축할 수 있습니다. 모든 종속성은 Nuget을 사용하여 빌드 시 다운로드됩니다.
dotnet build Nakama/Nakama.csproj
dotnet build Satori/Satori.csproj
릴리스 빌드에 대해서는 다음 지침을 참조하세요.
테스트를 실행하려면 서버와 데이터베이스를 실행해야 합니다. 대부분의 테스트는 서버에 대해 실행되는 통합 테스트로 작성됩니다. 테스트 워크플로에서 사용하는 빠른 접근 방식은 설명서에 설명된 Docker 작성 파일을 사용하는 것입니다.
docker-compose -f ./docker-compose-postgres.yml up
dotnet test Nakama.Tests/Nakama.Tests.csproj
특정 테스트를 실행하려면 메서드의 정규화된 이름을 dotnet test --filter
에 전달하세요.
dotnet test --filter " Nakama.Tests.Api.GroupTest.ShouldPromoteAndDemoteUsers "
Visual Studio 디버거를 테스트에 연결하려면 셸 환경에서 VSTEST_HOST_DEBUG
true
로 설정하고 dotnet test
실행하세요. 콘솔에서 식별된 프로세스에 디버거를 연결합니다.
Satori에 대한 테스트를 통과하려면 Satori 콘솔에 GUI의 버튼을 통해 사용할 수 있는 샘플 데이터가 채워져야 합니다. 그런 다음 dotnet test Satori.Tests/Satori.Tests.csproj
사용하여 SDK를 테스트할 수 있습니다.
nakama-dotnet API 문서는 Doxygen으로 생성되어 GitHub 페이지에 배포됩니다.
API 주석을 변경할 때 Doxygen을 다시 실행하고 docs/*
에서 변경 사항을 커밋합니다.
Doxygen을 실행하려면:
brew install doxygen
cd docs/
doxygen
이 프로젝트는 Apache-2 라이선스에 따라 라이선스가 부여됩니다.
훌륭한 json 라이브러리를 제공한 Alex Parker(@zanders3)와 Ninja.WebSockets를 제공한 David Haig(@ninjasource)에게 감사드립니다.