这是英雄实验室的UnityEngine Monorepository,其中包含用于访问两个不同后端服务Nakama和Satori的库。
客户端建立在带有Unity Engine的扩展名的.NET客户端上。他们需要在编辑器中设置.NET 4.6脚本运行时版本。
Nakama是一款旨在为现代游戏和应用程序供电的开源服务器。功能包括用户帐户,聊天,社交,媒人,实时多人游戏等等。
完整文档在线-https://heroiclabs.com/docs/unity-client-guide
在与客户端连接之前,您需要设置服务器和数据库。最简单的方法是使用Docker,但请查看其他选项的服务器文档。
安装并运行服务器。遵循以下说明。
安装Unity SDK。您有三个选择。
要使用官方版本,您可以从发行页面上下载.unitypackage或.tar并将其导入您的项目。如果选择.tar选项,则可以从Unity软件包管理器窗口中的下拉列表中导入它。
另外,如果您想查看GitHub的特定版本或提交特定的版本,并且使用Unity 2019.4.1或更高版本,则可以将以下内容添加到项目Packages文件夹中的manifest.json文件: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,Game Center和Facebook,Facebook,Facebook,Facebook,Facebook,Facebook,Facebook,Facebook,Facebook,。
var deviceId = SystemInfo . deviceUniqueIdentifier ;
var session = await client . AuthenticateDeviceAsync ( deviceId ) ;
Debug . Log ( session ) ;经过身份验证后,服务器会用验证令牌(JWT)响应,该验证令(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.建议从会话中存储验证令牌,并在启动时检查是否过期。如果令牌已过期,则必须重新验证。令牌的到期时间可以作为服务器中的设置更改。
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的主线程外执行执行,请传递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 ) ;
}您可以避免在需要抓住并使用Task.ContinueWith(...)情况下使用await 。
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服务器。使用satori Unity客户端从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-threows-threads-threads-are-not-enabled-for-this-platform-error-当programs-built-using-using-debug-c-c-c-plus-plus-plus-plus-plus-plus-plus-plus-plus-plus-compiler-configuration
开发路线图作为GitHub问题进行管理,并欢迎拉动请求。如果您有兴趣增强代码,请打开一个问题,讨论更改或在社区论坛中进行讨论。
该项目可以团结开放,以创建“ .unitypackage”。
该项目是根据Apache-2许可证获得许可的。