Este es el monorepository UnityEngine de Heroic Labs que contiene bibliotecas para acceder a dos servicios de backend diferentes, Nakama y Satori.
Los clientes se basan en el cliente .NET con extensiones para Unity Engine. Requieren que la versión de tiempo de ejecución .NET 4.6 de secuencias de comandos se establezca en el editor.
Nakama es un servidor de código abierto diseñado para alimentar juegos y aplicaciones modernas. Las características incluyen cuentas de usuario, chat, social, casamenteros, multijugador en tiempo real y mucho más.
La documentación completa está en línea-https://heroiclabs.com/docs/unity-client-guide
Deberá configurar el servidor y la base de datos antes de poder conectarse con el cliente. La forma más simple es usar Docker, pero echar un vistazo a la documentación del servidor para otras opciones.
Instalar y ejecutar los servidores. Sigue estas instrucciones.
Instale el SDK de Unity. Tienes tres opciones para esto.
Para usar una versión oficial, puede descargar .unitypackage o .tar desde la página de versiones e importarlo a su proyecto. Si elige la opción .tar, puede importarla desde un menú desplegable en la ventana del administrador de paquetes Unity.
Alternativamente, si desea consultar una versión o compromiso específico desde GitHub y está utilizando Unity 2019.4.4 o posterior, puede agregar lo siguiente al archivo manifest.json en la carpeta Packages de su proyecto:
"com.heroiclabs.nakama-unity" : " https://github.com/heroiclabs/nakama-unity.git?path=/Packages/Nakama#<commit | tag> "Su opción final es descargar binarios previos a la construcción de la tienda de activos.
Use las credenciales de conexión para crear un objeto cliente.
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 ) ; El objeto cliente tiene muchos métodos para ejecutar varias características en el servidor o abrir conexiones de socket en tiempo real con el servidor.
Hay una variedad de formas de autenticarse con el servidor. La autenticación puede crear un usuario si aún no existen con esas credenciales. También es fácil de autenticarse con un perfil social de Google Play, Facebook, Centro de juegos, etc.
var deviceId = SystemInfo . deviceUniqueIdentifier ;
var session = await client . AuthenticateDeviceAsync ( deviceId ) ;
Debug . Log ( session ) ; Cuando se autentica, el servidor responde con un token de autenticación (JWT) que contiene propiedades útiles y se deserializa en un objeto 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.Se recomienda almacenar el token de autenticación de la sesión y verificar en el inicio si ha expirado. Si el token ha expirado, debe reautiar. El tiempo de vencimiento del token se puede cambiar como una configuración en el servidor.
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 ) ;El cliente incluye muchas API creadas para varias características del servidor de juegos. Se puede acceder a estos con los métodos Async. También puede llamar a la lógica personalizada como funciones RPC en el servidor. Estos también se pueden ejecutar con un objeto de socket.
Todas las solicitudes se envían con un objeto de sesión que autoriza al cliente.
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 ) ;Las solicitudes se pueden suministrar con configuraciones de reintento en casos de errores transitorios de red o servidor.
Se puede utilizar una configuración única para controlar todo el comportamiento de reintento de solicitud:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;O bien, la configuración se puede suministrar por solicitud:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration ) ;Las configuraciones de reintento por requisito anulan la configuración de reintento global.
Las solicitudes también se pueden suministrar con un token de cancelación si necesita cancelarlas en la mitad del vuelo:
var canceller = new CancellationTokenSource ( ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration : null , canceller ) ;
await Task . Delay ( 25 ) ;
canceller . Cancel ( ) ; // will raise a TaskCanceledExceptionEl cliente puede crear uno o más enchufes con el servidor. Cada socket puede tener sus propios oyentes de eventos registrados para las respuestas recibidas del servidor.
var socket = client . NewSocket ( ) ;
socket . Connected += ( ) => Debug . Log ( "Socket connected." ) ;
socket . Closed += ( ) => Debug . Log ( "Socket closed." ) ;
await socket . ConnectAsync ( session ) ; Si desea que los controladores de socket se ejecuten fuera del hilo principal de Unity, pase el useMainThread: false :
var socket = client . NewSocket ( useMainThread : false ) ; Puede capturar errores cuando usa el andamio await con tareas en C#.
try
{
var account = await client . GetAccountAsync ( session ) ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
}
catch ( ApiResponseException e )
{
Debug . LogFormat ( "{0}" , e ) ;
} Puede evitar el uso de await donde las excepciones deberán atraparse y usar Task.ContinueWith(...) como un estilo de devolución de llamada con C# estándar si lo prefiere.
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 es un servidor de LiveOPS para juegos que impulsa analíticos procesables, pruebas A/B y configuración remota. Use el cliente de Satori Unity para coomunicarse con Satori desde su juego de Unity.
La documentación completa está en línea - https://heroiclabs.com/docs/satori/client-libraries/unity
Cree un objeto cliente que acepte la API que le dieron como cliente de 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 ) ;Luego autentique con el servidor para obtener su sesión.
// 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 ) ;
}Usando el cliente, puede obtener cualquier experimento o indicador de características, el usuario pertenece.
var experiments = await client . GetExperimentsAsync ( session ) ;
var flag = await client . GetFlagAsync ( session , "FlagName" ) ;También puede enviar eventos arbitrarios al servidor:
await client . EventAsync ( session , new Event ( "gameLaunched" , DateTime . UtcNow ) ) ;Este es solo un subconjunto de la API del cliente Satori, así que consulte el enlace de documentación enumerado anteriormente para la API completa.
Tanto para las construcciones de Nakama y Satori WebGL, debe asegurarse de que el IHttpAdapter que pase al cliente sea un UnityWebRequestAdapter .
var client = new Client ( "defaultkey" , UnityWebRequestAdapter . Instance ) ; Para Nakama, use el método de extensión NewSocket() para crear el socket o establecer manualmente el ISocketAdapter correcto por plataforma.
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 ) ;Al probar nuestra escena de ejemplo de WebGL antes de 2021.1, asegúrese de ir a la configuración de compilación y establecer la configuración del compilador C ++ en su lanzamiento en lugar de depurar debido a un problema sobresaliente en Unity WebGL Builds: https://issuetracker.unity3d.com/issues/webgl-build-throws-threads-ear-not-hisable-for-this-platform-error-when-programs-built-using-debug-plus-plus-compiler-configuration
La hoja de ruta de desarrollo se gestiona como problemas de GitHub y las solicitudes de extracción son bienvenidas. Si está interesado en mejorar el código, abra un problema para discutir los cambios o entregarlo y discutirlo en el Foro de la Comunidad.
Este proyecto se puede abrir en Unity para crear un ".unitypackage".
Este proyecto tiene licencia bajo la licencia Apache-2.