이것은 Nakama와 Satori의 두 가지 다른 백엔드 서비스에 액세스하기위한 라이브러리를 포함하는 Heroic Labs의 UnityEngine Monorepository입니다.
클라이언트는 Unity 엔진을위한 확장 기능을 갖춘 .NET 클라이언트를 기반으로합니다. .NET 4.6 스크립팅 런타임 버전을 편집기에 설정해야합니다.
Nakama는 현대적인 게임 및 앱에 전원을 공급하도록 설계된 오픈 소스 서버입니다. 기능에는 사용자 계정, 채팅, 소셜, 매치 메이커, 실시간 멀티 플레이어 등이 있습니다.
전체 문서는 온라인으로 -https://heroiclabs.com/docs/unity-client-guide입니다
클라이언트와 연결하기 전에 서버 및 데이터베이스를 설정해야합니다. 가장 간단한 방법은 Docker를 사용하는 것이지만 다른 옵션에 대한 서버 문서를 살펴 보는 것입니다.
서버를 설치하고 실행하십시오. 다음 지침을 따르십시오.
Unity SDK를 설치하십시오. 이를위한 세 가지 옵션이 있습니다.
공식 릴리스를 사용하려면 릴리스 페이지에서 .unitypackage 또는 .tar를 다운로드하여 프로젝트로 가져올 수 있습니다. .tar 옵션을 선택한 경우 Unity 패키지 관리자 창의 드롭 다운에서 가져올 수 있습니다.
또는 GitHub에서 특정 릴리스를 확인하거나 Commit을 확인하고 Unity 2019.4.1 이상을 사용하려면 Project의 Packages 폴더의 manifest.json 파일에 다음을 추가 할 수 있습니다.
"com.heroiclabs.nakama-unity" : " https://github.com/heroiclabs/nakama-unity.git?path=/Packages/Nakama#<commit | tag> "최종 옵션은 자산 스토어에서 사전 빌드 바이너리를 다운로드하는 것입니다.
연결 자격 증명을 사용하여 클라이언트 객체를 작성하십시오.
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 ) ; 클라이언트 객체에는 서버에서 다양한 기능을 실행하거나 서버와의 실시간 소켓 연결을 열 수있는 많은 방법이 있습니다.
서버로 인증하는 다양한 방법이 있습니다. 인증은 해당 자격 증명으로 아직 존재하지 않으면 사용자를 생성 할 수 있습니다. 또한 Google Play 게임, Facebook, 게임 센터 등의 소셜 프로필로 인증하기 쉽습니다.
var deviceId = SystemInfo . deviceUniqueIdentifier ;
var session = await client . AuthenticateDeviceAsync ( deviceId ) ;
Debug . Log ( session ) ; 인증이 발생하면 서버는 유용한 속성을 포함하고 Session 객체로 사형화되는 Auth Token (JWT)으로 응답합니다.
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.세션에서 인증 토큰을 저장하고 만료 된 경우 시작시 확인하는 것이 좋습니다. 토큰이 만료되면 다시 인증해야합니다. 토큰의 만료 시간은 서버의 설정으로 변경 될 수 있습니다.
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 ) ;클라이언트에는 게임 서버의 다양한 기능을위한 많은 내장 API가 포함되어 있습니다. 이들은 비동기 방법으로 액세스 할 수 있습니다. 서버에서 RPC 기능으로 사용자 정의 로직을 호출 할 수도 있습니다. 소켓 객체로도 실행할 수도 있습니다.
모든 요청에는 클라이언트를 승인하는 세션 객체와 함께 전송됩니다.
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 ) ;과도 네트워크 또는 서버 오류의 경우 요청에는 재시도 구성이 제공 될 수 있습니다.
단일 구성을 사용하여 모든 요청 재 시도 동작을 제어 할 수 있습니다.
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;또는 구성은 요청별로 제공 할 수 있습니다.
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , 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 = client . NewSocket ( ) ;
socket . Connected += ( ) => Debug . Log ( "Socket connected." ) ;
socket . Closed += ( ) => Debug . Log ( "Socket closed." ) ;
await socket . ConnectAsync ( session ) ; 소켓 핸들러가 Unity Main Thread 외부에서 실행하려면 useMainThread: false 인수를 전달하려면 :
var socket = client . NewSocket ( useMainThread : false ) ; C#의 작업과 함께 스캐 폴딩을 await 때 오류를 캡처 할 수 있습니다.
try
{
var account = await client . GetAccountAsync ( session ) ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
}
catch ( ApiResponseException e )
{
Debug . LogFormat ( "{0}" , e ) ;
} 예외가 잡히고 await 을 사용해야하는 곳을 사용하지 않고 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는 실행 가능한 분석, A/B 테스트 및 원격 구성을위한 게임용 LiveOps 서버입니다. Unity 게임 내에서 Satori Unity 클라이언트를 사용하여 Satori와 연마하십시오.
전체 문서는 온라인으로 - https://heroiclabs.com/docs/satori/client -libraries/unity입니다
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에 대해 앞서 나열된 문서 링크를 참조하십시오.
Nakama와 Satori WebGL 빌드의 경우 IHttpAdapter 클라이언트로 전달 된 UnityWebRequestAdapter 인지 확인해야합니다.
var client = new Client ( "defaultkey" , UnityWebRequestAdapter . Instance ) ; Nakama의 경우 NewSocket() 확장 메소드를 사용하여 소켓을 생성하거나 플랫폼 당 오른쪽 ISocketAdapter 수동으로 설정하십시오.
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 ) ;2021.1 이전에 예제 WebGL 장면을 테스트 할 때 빌드 설정으로 이동하여 C ++ 컴파일러 구성을 Unity WebGL 빌드의 뛰어난 문제로 인해 디버그 대신 릴리스하도록 설정하십시오. https://issuetracker.unity3d.com/issues/webgl-build-throws-throws-are-not-enable-for-when-programs-buil-debug-c-plus-compiler-configuration
개발 로드맵은 GitHub 문제로 관리되며 풀 요청을 환영합니다. 코드 향상에 관심이 있으시면 변경 사항을 논의하거나 Community Forum에서 논의하고 논의하는 문제를 열어주십시오.
이 프로젝트는 ".unitypackage"를 만들기 위해 Unity로 열 수 있습니다.
이 프로젝트는 Apache-2 라이센스에 따라 라이센스가 부여됩니다.