Это MonorePository UnityEngine в Heroic Labs, который содержит библиотеки для доступа к двум различным сервисам бэкэнд, Накама и Сатори.
Клиенты построены на клиенте .NET с расширениями для Unity Engine. Они требуют, чтобы версия выполнения сценария .NET 4.6, установленная в редакторе.
Накама-это сервер с открытым исходным кодом, предназначенный для питания современных игр и приложений. Функции включают учетные записи пользователей, чат, социальные, сваха, многопользовательский период в реальном времени и многое другое.
Полная документация-онлайн-https://heroiclabs.com/docs/unity-client-guide
Вам нужно будет настроить сервер и базу данных, прежде чем вы сможете подключиться к клиенту. Самый простой способ - использовать Docker, но посмотреть на документацию сервера для других вариантов.
Установите и запустите серверы. Следуйте этим инструкциям.
Установите Unity SDK. У вас есть три варианта для этого.
Чтобы использовать официальный релиз, вы можете загрузить либо .unityPackage, либо .tar со страницы релизов и импортировать его в свой проект. Если вы выбрали опцию .TAR, вы можете импортировать его из раскрывающегося списка в окне менеджера Unity Package.
В качестве альтернативы, если вы хотите проверить конкретный релиз или коммит от Github и использовать Unity 2019.4.1 или более поздней Packages , вы можете добавить следующее в файл manifest.json в папке вашего проекта:
"com.heroiclabs.nakama-unity" : " https://github.com/heroiclabs/nakama-unity.git?path=/Packages/Nakama#<commit | tag> "Ваш окончательный вариант - загрузить предварительно построенные двоичные файлы из магазина активов.
Используйте учетные данные Connection для создания клиентского объекта.
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 Games, Facebook, Game Center и т. Д.
var deviceId = SystemInfo . deviceUniqueIdentifier ;
var session = await client . AuthenticateDeviceAsync ( deviceId ) ;
Debug . Log ( session ) ; При аутентификации сервер отвечает с помощью токена Auth (JWT), который содержит полезные свойства и детериализируется в объект 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.Рекомендуется сохранить токен Auth из сеанса и проверить за стартапом, если он истек. Если токен истек, вы должны повторно нанести. Время истечения токена может быть изменено как настройка на сервере.
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 ) ; Если вы хотите, чтобы обработчики сокетов выполнили основной поток Outs Unity, пропустите useMainThread: false Argiry:
var socket = client . NewSocket ( useMainThread : false ) ; Вы можете захватить ошибки, когда используете леса await леса с задачами в C#.
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(...) в качестве стиля обратного вызова со стандартным C#, если вы предпочитаете.
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 - это сервер LiveOps для игр, который питает действенную аналитику, A/B -тестирование и удаленную конфигурацию. Используйте клиент Satori Unity для участия в Satori из вашей игры Unity.
Полная документация - онлайн - https://heroiclabs.com/docs/satori/client-libraries/unity
Создайте клиент -объект, который принимает API, который вам дали в качестве клиента 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 ) ;Затем аутентифицируйтесь с сервером для получения вашего сеанса.
// 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 ) ) ;Это всего лишь подмножество API клиента Satori, поэтому, пожалуйста, смотрите ссылку на документацию, указанную ранее для полного API.
Как для сборки Nakama, так и для Satori Webgls вы должны убедиться, что IHttpAdapter передвигается в клиенту, является UnityWebRequestAdapter .
var client = new Client ( "defaultkey" , UnityWebRequestAdapter . Instance ) ; Для Накамы используйте метод расширения 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 ) ;При тестировании нашей примера сцены WebGL до 2021.1, обязательно перейдите в настройки сборки и установите конфигурацию компилятора C ++ для выпуска вместо отладки из -за выдающейся проблемы в Unity WebGls: https://issuetracker.unity3d.com/issues/webgl-build-trows-threads-are-not-edabled-for-this-platform-error-wen-programs-built-use-debug-c-plus-plus-compeler-configuration
Дорожная карта разработки управляется как выпуски Github, а запросы на привлечение приветствуются. Если вы заинтересованы в улучшении кода, пожалуйста, откройте проблему, чтобы обсудить изменения или запустить и обсудить его на форуме сообщества.
Этот проект может быть открыт в Unity, чтобы создать «.unityPackage».
Этот проект лицензирован по лицензии Apache-2.