ゲーム サーバーの PlayFab ゲーム サーバー SDK (GSDK) との統合
概要
PlayFab ゲーム サーバー SDK (GSDK) は C++ 版、C# 版、および Java 版が提供されています。 GSDK はユーザーのゲーム サーバーを、VM にインストールされている PlayFab エージェントに接続します。 このエージェントによって、PlayFab マルチプレイヤー プラットフォームとサーバーとの主な対話が容易になります。
基本的な統合
ユーザーのゲーム サーバーが PlayFab マルチプレイヤー プラットフォームと通信できるように、GSDK と統合する必要があります。 少なくとも Start
と ReadyForPlayers
メソッドをゲーム サーバーに実装する必要があります。
int main()
{
// Call this while your game is initializing; it will start sending a heartbeat to our agent and put the game server in an Initializing state
Microsoft::Azure::Gaming::GSDK::start();
/* Add any other initialization code your game server needs before players can connect */
// Call this when your game is done initializing and players can connect
// Note: This is a blocking call, and will return when this game server is either allocated or terminated
if (Microsoft::Azure::Gaming::GSDK::readyForPlayers())
{
// readyForPlayers returns true when an allocation call has been done, a player is about to connect!
}
else
{
// readyForPlayers returns false when the server is being terminated
}
}
static void Main(string[] args)
{
// Call this while your game is initializing; it will start sending a heartbeat to our agent and put the game server in an Initializing state
GameserverSDK.Start();
/* Add any other initializion code your game server needs before players can connect */
// Call this when your game is done initializing and players can connect
// Note: This is a blocking call, and will return when this game server is either allocated or terminated
if (GameserverSDK.ReadyForPlayers())
{
// readyForPlayers returns true when an allocation call has been done, a player is about to connect!
}
else
{
// readyForPlayers returns false when the server is being terminated
}
}
public static void main(String[] args)
{
// Call this while your game is initializing; it will start sending a heartbeat to our agent and put the game server in an Initializing state
GameserverSDK.start();
/* Add any other initializion code your game server needs before players can connect */
// Call this when your game is done initializing and players can connect
// Note: This is a blocking call, and will return when this game server is either allocated or terminated
if (GameserverSDK.readyForPlayers())
{
// readyForPlayers returns true when an allocation call has been done, a player is about to connect!
}
else
{
// readyForPlayers returns false when the server is being terminated
}
}
GSDK によるログ
ゲーム サーバーが終了すると、PlayFab VM エージェントはすべてのログ ファイルを zip 形式で圧縮して、ユーザーが使用できるようにします。
ゲームからのログ ファイルを追加するには 2 つの方法があります。
- GSDK の
Log
メソッド使用すると、ユーザー独自のログ行が GSDK のログ ファイルに追加されます。 - PlayFab VM エージェントが zip 形式で圧縮してアップロードする適切なログ ディレクトリに、独自のログ ファイルを書き込みます。
// This will add your log line to the GSDK log file, alongside other information logged by the GSDK
Microsoft::Azure::Gaming::GSDK::logMessage("Here is a sample log");
// Alternatively, you can log your own files to the log directory
std::string logFolder = Microsoft::Azure::Gaming::GSDK::getLogsDirectory();
// This will add your log line to the GSDK log file, alongside other information logged by the GSDK
GameserverSDK.LogMessage("Here is a sample log");
// Alternatively, you can log your own files to the log directory
string logFolder = GameserverSDK.GetLogsDirectory();
// This will add your log line to the GSDK log file, alongside other information logged by the GSDK
GameserverSDK.log("Here is a sample log");
// Alternatively, you can log your own files to the log directory
String logFolder = GameserverSDK.getLogsDirectory();
ゲーム サーバーの正常なシャットダウン
ゲーム サーバーの終了には以下の 3 つのシナリオがあります。
ゲーム サーバー アプリケーションが終了する。
利用可能なゲーム サーバーの数が、現在のプレイヤー負荷に必要なサーバーより多いため、PlayFab がゲーム サーバーを終了する。
注意
PlayFab は、現在アクティブではないゲーム サーバーのみを終了します。
- Azure が、ゲーム サーバーをホストしている仮想マシン上で必要なメンテナンスを行う。
上記の (1) の場合: いつを終了するかをユーザーが制御し、アプリケーションを終了する前に、必要なクリーンアップを行うことができます。
上記の (2) と (3) の場合: コールバック メソッドを指定することによって、いつ終了するかをユーザーが把握する方法が GSDK に用意されています。
// This method will be called in case #2, when PlayFab terminates the game server
void onShutdown()
{
printf("GSDK is shutting me down!!!\n");
/* Perform any necessary cleanup and end the program */
std::exit(0);
}
// This method will be called in case #3, when Azure will perform maintenance on the virtual machine
void onMaintenanceScheduled(tm t)
{
#ifdef WINDOWS
time_t local = _mkgmtime(&t);
double delta = difftime(local, time(NULL));
struct tm buf;
char str[26];
gmtime_s(&buf, &local);
asctime_s(str, sizeof str, &buf);
printf("UTC: %s", str);
localtime_s(&buf, &local);
asctime_s(str, sizeof str, &buf);
printf("local: %s", str);
printf("delta: %f", delta);
#else // Linux
time_t local = timegm(&t);
double delta = difftime(local, time(NULL));
printf("UTC: %s\n", asctime(gmtime(&local)));
printf("local: %s\n", asctime(localtime(&local)));
printf("delta: %f\n", delta);
#endif
/* Perform any necessary cleanup, notify your players, etc. */
}
int main()
{
Microsoft::Azure::Gaming::GSDK::start();
Microsoft::Azure::Gaming::GSDK::registerShutdownCallback(&onShutdown);
Microsoft::Azure::Gaming::GSDK::registerMaintenanceCallback(&onMaintenanceScheduled);
// Continue initializing your game
}
// This method will be called in case #2, when PlayFab terminates the game server
static void OnShutdown()
{
GameserverSDK.LogMessage("Shutting down...");
/* Perform any necessary cleanup and end the program */
}
// This method will be called in case #3, when Azure will perform maintenance on the virtual machine
static void OnMaintenanceScheduled(DateTimeOffset time)
{
/* Perform any necessary cleanup, notify your players, etc. */
}
static void Main(string[] args)
{
GameserverSDK.Start();
GameserverSDK.RegisterShutdownCallback(OnShutdown);
GameserverSDK.RegisterMaintenanceCallback(OnMaintenanceScheduled);
// Continue initializing your game
}
// This method will be called in case #2, when PlayFab terminates the game server
private static void onShutdown()
{
System.out.println("Shutting down...");
/* Perform any necessary cleanup and end the program */
}
// This method will be called in case #3, when Azure will perform maintenance on the virtual machine
private static void onMaintenanceScheduled(ZonedDateTime time)
{
/* Perform any necessary cleanup, notify your players, etc. */
}
static void Main(string[] args)
{
GameserverSDK.start();
GameserverSDK.registerShutdownCallback(Main::onShutdown);
GameserverSDK.registerMaintenanceCallback(Main::onMaintenanceScheduled);
// Continue initializing your game
}
ゲーム サーバーに関する PlayFab 情報の提供
現時点では、GSDK を使用した PlayFab との通信によって、ユーザーは以下の 2 つの情報を取得できます。
- ゲーム サーバーの現在の正常性状態。
- ゲーム サーバーに現在接続しているプレイヤーのリスト。
これら 2 つの情報は、次回のハートビートで PlayFab に送信され、現時点では報告するために使用できます。
static std::vector<Microsoft::Azure::Gaming::ConnectedPlayer> players;
void playerConnected()
{
// When a new player connects, you can let PlayFab know by adding it to the vector of players and calling updateConnectedPlayers
players.push_back(Microsoft::Azure::Gaming::ConnectedPlayer("player_tag"));
Microsoft::Azure::Gaming::GSDK::updateConnectedPlayers(players);
}
// This method will be called on every heartbeat to check if your game is healthy, as such, it should return very quickly
bool isHealthy()
{
// Return whether your game server should be considered healthy
return true;
}
int main()
{
Microsoft::Azure::Gaming::GSDK::start();
Microsoft::Azure::Gaming::GSDK::registerHealthCallback(&isHealthy);
// Continue initializing your game
}
static private List<ConnectedPlayer> players = new List<ConnectedPlayer>();
static void OnPlayerConnected()
{
// When a new player connects, you can let PlayFab know by adding it to the vector of players and calling updateConnectedPlayers
players.Add(new ConnectedPlayer("player_tag"));
GameserverSDK.UpdateConnectedPlayers(players);
}
// This method will be called on every heartbeat to check if your game is healthy, as such, it should return very quickly
static bool IsHealthy()
{
// Return whether your game server should be considered healthy
return true;
}
static void Main(string[] args)
{
GameserverSDK.Start();
GameserverSDK.RegisterHealthCallback(IsHealthy);
// Continue initializing your game
}
private static ArrayList<ConnectedPlayer> players = new ArrayList<ConnectedPlayer>();
private static void onPlayerConnected()
{
// When a new player connects, you can let PlayFab know by adding it to the vector of players and calling updateConnectedPlayers
players.add(new ConnectedPlayer("player_tag"));
GameserverSDK.updateConnectedPlayers(players);
}
// This method will be called on every heartbeat to check if your game is healthy, as such, it should return very quickly
private static GameHostHealth getGameHealth()
{
// Return whether your game server should be considered healthy
return GameHostHealth.Healthy;
}
static void Main(string[] args)
{
GameserverSDK.start();
GameserverSDK.registerHealthCallback(Main::getGameHealth);
// Continue initializing your game
}
ゲーム サーバー内の構成設定の取得
ユーザーは GSDK を使用して、ゲーム サーバー関連するいくつかの PlayFab 設定を取得できます。
注意
それらの設定のうちの 2 つは、マルチプレイヤー サーバーを要求するための呼び出しの一部として、ユーザーのクライアントによって実際に PlayFab に渡されます。 したがって、それらの設定が割り当てられるまでは、ゲーム サーバーでは利用できません。
// Get all the configuration values
std::unordered_map<std::string, std::string> config = Microsoft::Azure::Gaming::GSDK::getConfigSettings();
// Retrieve a particular configuration value
auto it = config.find(Microsoft::Azure::Gaming::GSDK::SESSION_COOKIE_KEY);
if (it != config.end())
{
std::string sessionCookie = config[Microsoft::Azure::Gaming::GSDK::SESSION_COOKIE_KEY];
}
// Here some other useful configuration keys (the full list is in gsdk.h)
static constexpr const char* SERVER_ID_KEY; // ID given to your game server upon creation
static constexpr const char* LOG_FOLDER_KEY; // Path to the folder that should contain all log files
static constexpr const char* CERTIFICATE_FOLDER_KEY; // Path to the folder that contains any game certificate files
static constexpr const char* TITLE_ID_KEY; // PlayFab Title ID for this game server
static constexpr const char* BUILD_ID_KEY; // PlayFab Build ID for this game server
static constexpr const char* REGION_KEY; // Azure Region this server is running in
// These two keys are only available after allocation (once readyForPlayers returns true)
static constexpr const char* SESSION_COOKIE_KEY; // The Session Cookie you passed into the allocation call when you requested a server
static constexpr const char* SESSION_ID_KEY; // The Session ID you specified in the allocation call when you requested a server
// Get all the configuration values
IDictionary<string, string> config = GameserverSDK.getConfigSettings();
// Retrieve a particular configuration value
if (config.TryGetValue(GameserverSDK.SessionCookieKey, out string sessionCookie))
{
// sessionCookie contains the value
}
// Here are some other useful configuration keys (the full list is in the GameserverSDK class)
public static string ServerIdKey; // ID given to your game server upon creation
public static string LogFolderKey; // Path to the folder that should contain all log files
public static string CertificateFolderKey; // Path to the folder that contains any game certificate files
public static string TitleIdKey; // PlayFab Title ID for this game server
public static string BuildIdKey; // PlayFab Build ID for this game server
public static string RegionKey; // Azure Region this server is running in
// These two keys are only available after allocation (once readyForPlayers returns true)
public static string SessionCookieKey; // The Session Cookie you passed into the allocation call when you requested a server
public static string SessionIdKey; // The Session ID you specified in the allocation call when you requested a server
// Get all the configuration values
Map<String, String> config = GameserverSDK.getConfigSettings();
// Retrieve a particular configuration value
if (config.containsKey(GameserverSDK.SESSION_COOKIE_KEY))
{
String sessionCookie = config.get(GameserverSDK.SESSION_COOKIE_KEY);
}
// Here are some other useful configuration keys (the full list is in the GameserverSDK class)
public static final String SERVER_ID_KEY; // ID given to your game server upon creation
public static final String LOG_FOLDER_KEY; // Path to the folder that should contain all log files
public static final String CERTIFICATE_FOLDER_KEY; // Path to the folder that contains any game certificate files
public static final String TITLE_ID_KEY; // PlayFab Title ID for this game server
public static final String BUILD_ID_KEY; // PlayFab Build ID for this game server
public static final String REGION_KEY; // Azure Region this server is running in
// These two keys are only available after allocation (once readyForPlayers returns true)
public static final String SESSION_COOKIE_KEY; // The Session Cookie you passed into the allocation call when you requested a server
public static final String SESSION_ID_KEY; // The Session ID you specified in the allocation call when you requested a server