プレイヤーブロックを実装する
注釈:本資料はAI技術を用いて翻訳されています。
概要
AccelByte Gaming Services (AGS) フレンドサービスを使用すると、プレイヤーがゲーム内で他のプレイヤーとのインタラクションを管理できるようになります。これには、プレイヤーが他のプレイヤーとのインタラクションをブロックする機能が含まれます。
この記事では、プレイヤーブロックの概要を説明し、ゲームにプレイヤーブロックを実装する方法を説明します。
プレイヤーブロックの機能
ブロックにより、プレイヤーは他のプレイヤーとのインタラクションを制限できます。あるプレイヤーが別のプレイヤーをブロックすると、両方のプレイヤーは次のことができなくなります。
- お互いをフレンドとして追加する。プレイヤーがすでにフレンドの場合、フレンド関係が解除されます。
- お互いをパーティーセッションに招待する。注意: AGS Sessionバージョン3.13.11以降が必要です。
- マッチで互いに会う。注意: AGS Matchmakingバージョン2.15.3以降が必要です。
- 自動的に同じパーティーに配置される。注意: 別のプレイヤーが両方を招待した場合は、同じパーティーにいることができます。
- お互いをグループに招待する。
- グループメンバーリストで互いのプレイヤープロフィールを見る。
- マッチメイキングを通じて一緒にマッチングされる。注意: これはマッチメイキングルールセットで調整できます。
ロビーブロックは、チャットサービスのブロック動作で使用されるように設定することもできます。設定すると、チャットサービスは独自のブロック機能の代わりにロビーブロックデータを使用します。ブロック機能(ユーザーインタラクション)は、パーソナルチャットとセッションチャットに適用され、次のことを制限します。
- パーソナルチャット: ブロックされたユーザーにメッセージを送信できず、その逆も同様です。
- セッションチャット: ブロックされたプレイヤーは1つのセッションに参加できません。ただし、ユーザーが同じパーティーにいる間に別のユーザーをブロックした場合、影響を受けるユーザーはメッセージを送信できますが、互いのメッセージを見ることはできません。
ロビーブロックをチャットサービスで使用するように設定するには、カスタマーポータルまたはDiscordコミュニティを通じてAccelByteチームにお問い合わせください。
プレイヤーブロックを実装する
AGS Game SDKを使用すると、プレイヤーブロック機能はWebSocketまたはHTTP RESTエンドポイント経由で利用できます。この記事では、両方の方法を使用したサンプル実装を提供します。
プレイヤーをブロックする
次のコードを使用してプレイヤーをブロックします。
- Unreal Engine
- Unity
FOnlineSubsystemAccelByte* OnlineSubsystem = static_cast<FOnlineSubsystemAccelByte*>(Online::GetSubsystem(GetWorld()));
FOnlineIdentityAccelBytePtr IdentityInterface = StaticCastSharedPtr<FOnlineIdentityAccelByte>(OnlineSubsystem->GetIdentityInterface());
FOnlineFriendsAccelBytePtr FriendsInterface = StaticCastSharedPtr<FOnlineFriendsAccelByte>(OnlineSubsystem->GetFriendsInterface());
const int32 BlockerLocalUserNum = 0;
const FUniqueNetIdPtr BlockerUserId = IdentityInterface->GetUniquePlayerId(BlockerLocalUserNum);
const FUniqueNetIdPtr BlockedUserId;
auto OnBlockedPlayerCompleteDelegate = FriendsInterface->AddOnBlockedPlayerCompleteDelegate_Handle(BlockerLocalUserNum, FOnBlockedPlayerCompleteDelegate::CreateLambda([BlockerLocalUserNum](int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UniqueID, const FString& ListName, const FString& ErrorStr)
{
if (LocalUserNum == BlockerLocalUserNum && bWasSuccessful)
{
// Do something
}
}));
FriendsInterface->BlockPlayer(BlockerLocalUserNum, *BlockedUserId);
string userId = "SomeUserId";
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().BlockPlayer(userId, result => {
if (result.IsError) {
// Do something if BlockPlayer fails
Debug.Log($"Error BlockPlayer, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
} else {
// Do something if BlockPlayer succeeds
}
});
プレイヤーブロックイベントをリッスンする
ゲームは、ブロックされたプレイヤー同士をマッチングさせないようにするなどのタスクを回避するために、プレイヤーが他のプレイヤーによってブロックされたかどうかを知る必要があります。ブロックイベントは、以下に示すようにイベントをサブスクライブすることで追跡できます。イベントはブロックされたプレイヤー側で発生し、ブロックしたプレイヤーとブロックされたプレイヤーの両方のユーザーIDを含むデータを渡します。
- Unreal Engine
- Unity
const int32 LocalUserNum = 0;
FApiClientPtr ApiClient = IdentityInterface->GetApiClient(LocalUserNum);
ApiClient->Lobby.SetBlockPlayerNotifDelegate(AccelByte::Api::Lobby::FBlockPlayerNotif::CreateLambda([](const FAccelByteModelsBlockPlayerNotif & Result) {
// Do something if BlockPlayerNotifDelegate succeeds
}));
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().PlayerBlockedNotif += result => {
if (result.IsError) {
// Do something if PlayerBlockedNotif fails
Debug.Log($"Error PlayerBlockedNotif, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
} else {
// Do something if PlayerBlockedNotif succeeds
}
};
プレイヤーのブロックを解除する
次のコードを使用してプレイヤーのブロックを解除します。
- Unreal Engine
- Unity
const int32 UnblockerLocalUserNum = 0;
const FUniqueNetIdPtr UnblockerUserId = IdentityInterface->GetUniquePlayerId(UnblockerLocalUserNum);
const FUniqueNetIdPtr UnblockedUserId;
auto OnUnblockedPlayerCompleteDelegate = FriendsInterface->AddOnUnblockedPlayerCompleteDelegate_Handle(UnblockerLocalUserNum, FOnBlockedPlayerCompleteDelegate::CreateLambda([UnblockerLocalUserNum](int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UniqueID, const FString& ListName, const FString& ErrorStr)
{
if (LocalUserNum == UnblockerLocalUserNum && bWasSuccessful)
{
// Do something
}
}));
FriendsInterface->UnblockPlayer(UnblockerLocalUserNum, *UnblockedUserId);
string userId = "SomeUserId";
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().UnblockPlayer(userid, result => {
if (result.IsError) {
// Do something if UnblockPlayer fails
Debug.Log($"Error UnblockPlayer, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
} else {
// Do something if UnblockPlayer succeeds
}
});
プレイヤーブロック解除イベントをリッスンする
このイベントは、ブロック解除されたプレイヤー側で発生し、アクター(ブロックを解除したプレイヤー)とターゲット(ブロック解除されたプレイヤー)の両方のユーザーIDを含むデータを渡します。
- Unreal Engine
- Unity
const int32 LocalUserNum = 0;
FApiClientPtr ApiClient = IdentityInterface->GetApiClient(LocalUserNum);
ApiClient->Lobby.SetUnblockPlayerNotifDelegate(AccelByte::Api::Lobby::FUnblockPlayerNotif::CreateLambda([](const FAccelByteModelsUnblockPlayerNotif & Result) {
// Do something if UnblockPlayerNotifDelegate succeeds
}));
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().PlayerUnblockedNotif += result => {
if (result.IsError) {
// Do something if PlayerUnblockedNotif fails
Debug.Log($"Error PlayerUnblockedNotif, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
} else {
// Do something if PlayerUnblockedNotif succeeds
}
};
ブロックされたプレイヤーのリストを取得する
次のコードを使用して、現在のユーザー(呼び出し元)のブロックされたプレイヤーのリストを取得します。これには、ブロックされた各プレイヤーのユーザーIDを含むデータの配列を返すコールバックがあります。
- Unreal Engine
- Unity
const int32 UnblockerLocalUserNum = 0;
const FUniqueNetIdPtr BlockerUserId = IdentityInterface->GetUniquePlayerId(BlockerLocalUserNum);
auto OnQueryBlockedPlayersCompleteDelegate = FriendsInterface->AddOnQueryBlockedPlayersCompleteDelegate_Handle(FOnQueryBlockedPlayersCompleteDelegate::CreateLambda([](const FUniqueNetId& UserId, bool bWasSuccessful, const FString& Error)
{
// Do something
}));
FriendsInterface->QueryBlockedPlayers(*BlockerUserId);
TArray<TSharedRef<FOnlineBlockedPlayer>> BlockedPlayers;
FriendsInterface->GetBlockedPlayers(*BlockerUserId, BlockedPlayers);
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().GetListOfBlockedUser(result => {
if (result.IsError) {
// Do something if GetListOfBlockedUser fails
Debug.Log($"Error GetListOfBlockedUser, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
} else {
// Do something if GetListOfBlockedUser succeeds
}
});
ブロッカーのリストを取得する
次のコードを使用して、プレイヤーをブロックしたプレイヤーのリストを取得します。これには、ブロックされたプレイヤーのユーザーIDを含むデータの配列を返すコールバックがあります。
- Unreal Engine
- Unity
const int32 LocalUserNum = 0;
FApiClientPtr ApiClient = IdentityInterface->GetApiClient(LocalUserNum);
ApiClient->Lobby.GetListOfBlockers(THandler < FAccelByteModelsListBlockerResponse > ::CreateLambda([](const FAccelByteModelsListBlockerResponse & Result) {
// Do something if GetListOfBlockers succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode,
const FString & ErrorMessage) {
// Do something if GetListOfBlockers fails
UE_LOG(LogTemp, Log, TEXT("Error GetListOfBlockers, Error Code: %d Error Message: %s"), ErrorCode, * ErrorMessage);
}));
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().GetListOfBlocker(result => {
if (result.IsError) {
// Do something if GetListOfBlocker fails
Debug.Log($"Error GetListOfBlocker, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
} else {
// Do something if GetListOfBlocker succeeds
}
});
マッチメイキング動作を設定する
この機能には、AGS Matchmakingバージョン2.15.3以降が必要です。
デフォルトでは、AGS Matchmakingは、互いにブロックしているプレイヤーをマッチングすることはありません。ただし、マッチルールセットを使用して、マッチメイキング動作を制御できます。以下にサンプルルールセットがあります。
{
"alliance": {
"min_number": 2,
"max_number": 2,
"player_min_number": 5,
"player_max_number": 5
},
"blocked_player_option": "blockedPlayerCannotMatch" // デフォルト値
}
blocked_player_optionを使用して、ブロックされたプレイヤーのマッチメイキング動作を制御できます。
- blockedPlayerCannotMatch: デフォルトのマッチメイキング動作。ブロックされたプレイヤーは、同じゲームまたはセッションにマッチングできません。
- blockedPlayerCanMatchOnDifferentTeam: この値を使用すると、ブロックされたプレイヤーは互いにマッチングして異なるチームに配置されることができます。
- blockedPlayerCanMatch: この値を使用すると、ブロックされたプレイヤーは通常どおり互いにマッチングできます。
ネイティブプラットフォームとブロックリストデータを同期する
この機能には、AGS Lobbyバージョン3.35.1以降が必要です。
AGSは、ネイティブプラットフォーム(現在はPlayStation Networkでのみ利用可能)とのブロックされたプレイヤーの同期をサポートしています。このプロセスは、ネイティブプラットフォームからのブロックリストデータをAGSデータベースに自動的に追加します。一般的な使用例は、ゲームクライアントがログイン後にネイティブプラットフォームとブロックリストデータを同期できるようにすることです。
| パラメータ名 | タイプ | 説明 |
|---|---|---|
PlatformId | FString | フレンドリストを同期するプラットフォームのID。有効な値は:steam, ps5, ps4です。 |
PsnEnv | FString | フレンドを同期する選択されたPlayStation (PSN) 環境。有効な値は:sp-int, prod-qa, npです。 |
次のコードを使用して、ブロックされたプレイヤーの同期を実装します。
const int32 LocalUserNum = 0;
auto OnSyncThirdPartyBlockListCompleteDelegate = FriendsInterface->AddOnSyncThirdPartyBlockListCompleteDelegate_Handle(LocalUserNum, FOnSyncThirdPartyBlockListCompleteDelegate::CreateLambda([](int32 InLocalUserNum, const FOnlineError& ErrorInfo, const TArray<FAccelByteModelsSyncThirdPartyBlockListResponse>& Response)
{
// Do something
}));
FAccelByteModelsSyncThirdPartyBlockListInfo PlatformInfo;
PlatformInfo.PlatformId = FAccelByteUtilities::GetPlatformString(EAccelBytePlatformType::PS4);
PlatformInfo.PsnEnv = "np";
FAccelByteModelsSyncThirdPartyBlockListRequest BlockSyncRequest;
BlockSyncRequest.BlockListSyncDetails.Add(PlatformInfo);
FriendsInterface->SyncThirdPartyPlatformBlockList(LocalUserNum, BlockSyncRequest);
エンドポイントリファレンス
| PSNブロックされたプレイヤーを同期 | https://docs.accelbyte.io/api-explorer/lobby |
|---|