Lobby の使用

Lobby と Cloud Code を一緒に使用して、ゲーム内に一般的なトリガーを定義できます。ゲームロビーですでにマッチを開始する準備ができているソリューションについて考えます。準備ができたゲームロビーに反応して、以下のスクリプトをトリガーできます。この例は、Remote Config とのインテグレーションも備えています。

この例に従う前に、Unity Dashboard を通じて Lobby と Cloud Code の両方を有効にし、必要な SDK をインストールするステップに従います。サービス認証を使用してプロジェクトに ロビーを作成 し、その ID をメモしておきます。これは、Cloud Code を通じて行うことができます (Unity Lobby の例を確認してください)。

以下の例は、スクリプトに 2 つのパラメーター (ロビーの作成に使用されるサービス ID と、ロビー ID) を付与します。ロビーを取得し、そのメタデータにいくつかの変更を加えて更新します。これらの変更は以下のとおりです。

  • ロビーをロックして、それ以上新規のプレイヤーが参加できないようにします。
  • ロビーのプレイヤー ID を使用して、ゲームのランダムな "プレイヤーの順序" を構成します。
  • Remote Config で定義された LOBBY_CURRENT_MAPS 設定を使用して、ゲームのマップをランダムに選択します。スクリプトは、成功または失敗を示す基本的なブーリアンを返します。

JavaScript

const _ = require("lodash-4.17");
const { LobbyApi, DataObjectVisibilityEnum } = require("@unity-services/lobby-1.2");
const { SettingsApi } = require("@unity-services/remote-config-1.1");

module.exports = async ({params,context,logger}) => {
    const { serviceId, lobbyId } = params;
    const { projectId, environmentId, playerId } = context;
    const lobbyApi = new LobbyApi(context);
    const remoteConfig = new SettingsApi(context);

    try {
        const {data: lobby} = await lobbyApi.getLobby(lobbyId, serviceId);
        return setUpGame(remoteConfig, projectId, environmentId, serviceId, lobbyApi, logger, lobby);
    } catch (err) {
       logger.error(`Failed to set up lobby: ${err.response.data.detail}`);
       return false;
    }

};

// Updates a lobby to set up for the start of a game, including reading a value from Remote Config to randomly assign to the lobby.
async function setUpGame(remoteConfig, projectId, environmentId, serviceId, lobbyApi, logger, lobby) {
    let playerIds = [];
    for (let i = 0; i < lobby.players.length; i++) {
        playerIds.push(lobby.players[i].id);
    }

    // Generate a turn order for the game by shuffling the player IDs.
    _.shuffle(playerIds);

    // Load all of the maps that are currently configured as available in Remote Config and pick a random one for this game.
    let maps = getCurrentMapsFromRemoteConfig(remoteConfig, projectId, environmentId)
    if (maps == null) {
      throw "Maps loaded from Remote Config are null.";
    }
    let gameMap = _.sample(maps);

    try {
      const updateResponse = await lobbyApi.updateLobby(
          lobby.id,
          serviceId,
          null,
          {
              isLocked: true, // Lock the lobby so that new players cannot join.
              hostId: playerIds[0], // Transfer host ownership from the service to one of the players.
              data: {
                  "playerOrder": {
                      value: playerIds.toString(),
                      visibility: DataObjectVisibilityEnum.Member // Set the visibility of the player order so that only lobby members can access it.
                  },
                  "map": {
                      value: gameMap,
                      visibility: DataObjectVisibilityEnum.Public // Set the visibility of the game map so that anyone who views the lobby can access it.
                  }
              }
          }
      );

      return true;
    } catch (err) {
      throw err;
    }

    return lobbyUpdateSuccess;
}

// Loads the Remote Config JSON value for LOBBY_CURRENT_MAPS and returns the array of maps inside of it.
// If the JSON is invalid, the return value is null.
async function getCurrentMapsFromRemoteConfig(remoteConfig, projectId, environmentId) {
  const currentMapsId = 'LOBBY_CURRENT_MAPS';
  const remoteConfigResponse = await remoteConfig.assignSettingsGet(
    projectId,
    environmentId,
    'settings',
    [currentMapsId]
  );

  let mapsJSON = remoteConfigResponse?.data?.configs?.settings?.[currentMapsId];
  if (!mapsJSON || !mapsJSON.maps || mapsJSON.maps.length == 0) {
    return null;
  }

  return mapsJSON.maps;
}

ここでの Remote Config JSON は単純な構造を持ちますが、この設定例を拡張して、よりきめ細かくゲームをコントロールできます。同様に、例えば以下のように、ゲームの設定に加えて検討できる、Cloud Code のさまざまなトリガーがあります。

  • メタデータ値を調整し、文字列をサニタイズするためのロビー作成のトリガー。
  • Cloud Save プレイヤーデータを使用した、プレイヤーのクエリ結果のフィルター処理、参加の承認/拒否、およびメタデータの設定。
  • Economy データを使用したプレイヤーまたはロビーのメタデータの設定。