メインコンテンツまでスキップ

プライベートチャットとチャットルームを管理する

Last updated on February 4, 2026

注釈:本資料はAI技術を用いて翻訳されています。

概要

AccelByte Gaming Services (AGS) チャットを使用すると、ゲーム内でプレイヤー間のプライベートメッセージの送受信や、セッションまたはパーティのチャットルームでのメッセージ送受信を有効にできます。

この記事では、以下の方法について説明します:

  • チャットをサポートするセッションテンプレートを構成する
  • チャットルーム付きの新しいセッションを作成する
  • セッションチャットルームを通じてメッセージを送信する

パーティは AGS Session によって管理されるため、セッションとパーティのプロセスは似ています。

備考

この記事では、「トピック」という用語は「チャットルーム」と互換性があります。どちらもチャットメッセージを送信できるチャネルの表現です。プレイヤーはセッションに参加すると自動的にチャットルームにサブスクライブされ、退出すると削除されます。

前提条件

この記事のすべての手順を完了するには、以下が必要です:

  • AGS LobbySession、および Chat に精通していること。
  • ゲームに適切な SDK がインストールされていること。
  • AGS 管理ポータルで適切なゲーム namespace へのアクセス権があること。

AGS チャットに接続する

プレイヤーがチャットメッセージを送受信できるようになる前に、まず AGS Identity によって認証される必要があります。これにより、ユーザーアカウントでチャットに自動的に接続されます。

AGS OSS プラグインを使用している場合は、DefaultEngine.ini ファイルで以下の設定値を有効にして、ログイン後にユーザーが自動的に AGS チャットに接続できるようにする必要があります。

[OnlineSubsystemAccelByte]
bAutoChatConnectAfterLoginSuccess=true

プライベートメッセージを送信する

プレイヤーは他のユーザーに直接メッセージを送信できます。他のプレイヤーがプライベートメッセージまたはダイレクトメッセージを送信しているときにリッスンするために、適切なデリゲートを登録できます。

// チャット通知デリゲートを設定します。このデリゲートは新しいメッセージがあるときに呼び出されます。
ApiClient->Chat.SetChatNotifDelegate(
Api::Chat::FChatNotif::CreateLambda([](const FAccelByteModelsChatNotif& Result)
{
UE_LOG(LogTemp, Log, TEXT("チャットを受信! From[%s] content: [%s]"),
*Result.From, *Result.Message);
})
);

// 「トピックに追加」通知デリゲートを設定します。これはプレイヤーがトピックに追加されたときに呼び出されます。
ApiClient->Chat.SetAddToTopicNotifDelegate(
Api::Chat::FAddRemoveFromTopicNotif::CreateLambda([](const
FAccelByteModelsChatUpdateUserTopicNotif& Result)
{
UE_LOG(LogTemp, Log, TEXT("トピック [%s] にユーザー [%s] によって追加されました"),
*Result.TopicId, *Result.SenderId);
})
);

// 個人トピックを作成します。
// ターゲットプレイヤーはトピックに追加されたという通知を受け取ります。
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient(TEXT("0"));
ApiClient->Chat.CreatePersonalTopic(TEXT("target_user_id"),
Api::Chat::FChatActionTopicResponse::CreateLambda(
[](const FAccelByteModelsChatActionTopicResponse& Result)
{
UE_LOG(LogTemp, Log, TEXT("個人トピックの作成に成功しました。作成された TopicID:
%s"), *Result.TopicId);
}),
FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("エラーコード: %d\nエラーメッセージ:%s"), ErrorCode,
*ErrorMessage);
})
);

// 個人トピックが作成された後、プレイヤーはトピックにチャットメッセージを送信できます。
// ターゲットプレイヤーはチャット通知デリゲートで通知されます。
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient(TEXT("0"));
ApiClient->Chat.SendChat(TEXT("topic_id"), TEXT("送信するメッセージ"),
Api::Chat::FSendChatResponse::CreateLambda(
[](const FAccelByteModelsChatSendChatResponse& Result)
{
UE_LOG(LogTemp, Log, TEXT("トピックへのメッセージ送信に成功しました。"));
}),
FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("エラーコード: %d\nエラーメッセージ:%s"), ErrorCode,
*ErrorMessage);
})
);

セッションのチャットルームを有効にする

チャットルームはセッションレベルで管理され、セッションテンプレートの一部として有効にできます。チャットが有効なセッションテンプレートを構成するには、以下の手順に従って環境の API ドキュメントを使用する必要があります:

  1. 環境の Swagger ページを開きます。例: AccelByte Demo Environment。

  2. 新しいセッションテンプレートを作成するには POST を選択するか、既存のテンプレートを更新するには PUT を選択します。どちらのオプションでも、リクエストボディに適切な値を設定してください。

  3. ゲームネームスペースをターゲットにし、textChattrue に設定したリクエストボディを追加します。

  4. リクエストを実行し、出力が正常に実行されたことを示していることを確認します。

サンプルリクエストボディ:

{
"name": "default",
"deployment": "default",
"inactiveTimeout": 60,
"inviteTimeout": 60,
"joinability": "OPEN",
"maxPlayers": 5,
"minPlayers": 1,
"type": "NONE",
"textChat": "true"
}

セッションチャットルームを作成する

一般的に、チャットが有効なテンプレートを使用してセッションを作成する場合、セッションのチャットルームを作成するための追加の手順は必要ありません。AGS を使用する場合、チャットルーム付きのセッションを作成する方法は 3 つあります:

  1. matchmaking を通じて: マッチが見つかると、セッションテンプレートに基づいてゲームセッションが作成されます。セッションテンプレートでチャットが有効になっている場合、セッションチャットルームが自動的に作成されます。

  2. セッションテンプレート: テンプレートでチャットが有効になっている限り、セッションチャットルームが自動的に作成されます。

  3. セッションテンプレートなしでセッションを作成する: これには、チャットを true に設定することを含む、必要なセッション設定を渡す必要があります。

テンプレートなしでセッションを作成する必要がある場合は、以下のコードサンプルを使用して、チャットを有効にして CreateSession を呼び出す前にセッション設定を定義する方法を確認できます。

// この例は、チャットルーム/トピック付きのパーティセッションを手動で作成する方法を示しています。
FAccelByteModelsV2PartyCreateRequest CreatePartyRequest;

// セッションのテキストチャットを true に設定します。
CreatePartyRequest.TextChat = true;

// プレイヤーがセッションチャットルーム/トピックに追加されたときにリッスンするために、このデリゲートをバインドします。
ApiClient->Chat.SetAddToTopicNotifDelegate(
Api::Chat::FAddToTopicNotif::CreateLambda([](const FAccelByteModelsChatUpdateUserTopicNotif& Result)
{
UE_LOG(LogTemp, Log, TEXT("トピック [%s] にユーザー [%s] によって追加されました"), *Result.TopicId, *Result.SenderId);
})
);

// チャットルームまたはトピック付きの新しいセッションを作成します。
ApiClient->Session.CreateParty(CreatePartyRequest,
THandler<FAccelByteModelsV2PartySession>::CreateLambda(
[](const FAccelByteModelsV2PartySession& Result)
{
UE_LOG(LogTemp, Log, TEXT("パーティが作成されました"));
}),
FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("エラーコード: %d\nエラーメッセージ:%s"), ErrorCode, *ErrorMessage);
})
);
注記

返される ID (RoomId / TopicId) には、作成されたセッションのタイプに基づいてプレフィックスが付きます:

  • s. は V2 ゲームセッションチャットルーム/トピックに対応します
  • p. は V2 パーティセッションチャットルーム/トピックに対応します

セッションチャットルームに参加する

プレイヤーがセッションに参加すると、追加の作業なしで自動的にそのチャットルームにメンバーとしてサブスクライブされます。

他のプレイヤーがチャットルームに追加されたときにリッスンするために、適切なデリゲートを登録できます。

// プレイヤーがセッションチャットルーム/トピックに追加されたときにリッスンするために、このデリゲートをバインドします。
ApiClient->Chat.SetAddToTopicNotifDelegate(
Api::Chat::FAddRemoveFromTopicNotif::CreateLambda([](const FAccelByteModelsChatUpdateUserTopicNotif& Result)
{
UE_LOG(LogTemp, Log, TEXT("トピック [%s] にユーザー [%s] によって追加されました"), *Result.TopicId, *Result.SenderId);
})
);

セッションチャットルームから退出する

プレイヤーがセッションから退出すると、AGS Session がチャットルームのメンバーとしてプレイヤーを削除する管理を行います。これには、セッションからキックアウトされたプレイヤーも含まれます。

プレイヤーがチャットルームから削除されたときにリッスンするために、適切なデリゲートを登録できます。

// プレイヤーがセッションチャットルーム/トピックから削除されたときにリッスンするために、このデリゲートをバインドします。
ApiClient->Chat.SetRemoveFromTopicNotifDelegate(
Api::Chat::FAddRemoveFromTopicNotif::CreateLambda([](const FAccelByteModelsChatUpdateUserTopicNotif& Result)
{
UE_LOG(LogTemp, Log, TEXT("トピック [%s] からユーザー [%s] によって削除されました"), *Result.TopicId, *Result.SenderId);
})
);

セッションチャットメッセージを送信する

プレイヤーがチャットルームに入ると、他のプレイヤーが受信できるようにルームにメッセージを送信し始めることができます。プレイヤーは複数のチャットルームにサブスクライブできるため、メッセージを送信するリクエストを行うときに、正しいセッションチャットルームに配信されるように、メッセージと共に適切なルーム/トピック ID を提供する必要があります。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient(TEXT("0"));

// チャットインターフェースから SendChat を呼び出してメッセージを送信します。
// プレイヤーがセッションチャットルーム/トピックに参加したときに ID を取得して保存しておく必要があります。
ApiClient->Chat.SendChat(TEXT("topic_id"), TEXT("送信するメッセージ"), Api::Chat::FSendChatResponse::CreateLambda(
[](const FAccelByteModelsChatSendChatResponse& Result)
{
UE_LOG(LogTemp, Log, TEXT("トピックへのメッセージ送信に成功しました。"));
}),
FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("エラーコード: %d\nエラーメッセージ:%s"), ErrorCode, *ErrorMessage);
})
);

セッションチャットメッセージを受信する

他のプレイヤーからのチャットメッセージをリッスンするには、適切なデリゲートを登録します。新しいメッセージが利用可能になると、メッセージが送信された関連するルーム/トピック ID と共に呼び出されます。

// 他のプレイヤーから送信された新しいメッセージをリッスンするために、このデリゲートをバインドします。
ApiClient->Chat.SetChatNotifDelegate(
Api::Chat::FChatNotif::CreateLambda([](const FAccelByteModelsChatNotif& Result)
{
UE_LOG(LogTemp, Log, TEXT("チャットを受信! From[%s] content: [%s]"), *Result.From, *Result.Message);
})
);

チャット履歴を取得する

チャットサービスはチャット履歴にメッセージを保存し、モデレーターがレビューしたり、ユーザーが自分のメッセージを表示したりするためにアクセスできます。チャット履歴は以下のように管理されます:

  • メッセージはトピック ID ごとに整理されており、トピックに基づいて簡単に取得できます。
  • メッセージは毎秒記録され、1 秒の遅延後に取得可能になります。
  • デフォルトでは、チャット履歴は 30 日間保持され、その後自動的に削除されます。
  • ユーザーは、自分がメンバーであるトピックのチャット履歴のみにアクセスできます。

チャット履歴を取得するには、以下のパラメータを使用して queryChat WebSocket コマンドを使用します:

  • topicId: メッセージを取得するトピックの ID。
  • limit: 取得するメッセージの最大数。
  • lastChatCreatedAt: 取得するメッセージの最も古いタイムスタンプ。Unix 時間で指定します。