Steamworks ドキュメンテーション
リッチプレゼンスの強化

概要

新しいSteamフレンド&チャットクライアントの最近のリリースでは、リッチプレゼンスシステムの機能が強化され、プレイ中のゲームについて、さらに詳細な表示が可能となりました。 リッチプレゼンスは、プレイヤーのアクティビティにフレンドを参加させる方法だと考えています。 たとえば、自分が所有するゲームならば、フレンドのゲームに参加するタイミングを調べたり、他のプレイヤーと対話したりすることで、ゲームに関与します。未所有のゲームの場合、自分がよく知らないゲームに関する様々なリッチプレゼンスの文字列を目にすることで、ゲームへの興味をそそられるかもしれません。

リッチプレゼンスを複数のコンテキストで表示

このドキュメントでは、ゲームをプレイヤーのフレンドリスト内にどのように表示するかを定義する2つの設定について説明します。
  • リッチプレゼンス文字列-プレイヤーのフレンドが興味を持つような、ゲーム内でのプレイヤーの状態を表示するために使用
  • フレンドのグループ化- ゲーム内で一緒にプレイ中のフレンドをグループ化するために使用

ゲームが制御するリッチプレゼンス文字列


ゲームに関するより詳しい情報がフレンドに一目でわかります。
システムはカスタマイズ可能なので、どの情報がプレイヤーのフレンドにとって最も興味深いかを開発側で決定して表示できます。
ゲームは、強化されたリッチプレゼンスによって、ゲーム特有の情報を用意できるようになります。 始めるにあたり、いくつか考慮すべき点があります:

マルチプレイヤー ゲーム

マルチプレイヤーゲームの種類によって、フレンドが参加するべきタイミングを計るのに役立つ情報は異なります。 一部のゲームは、時間や残りのプレイヤー数によって決定されるラウンド制でプレイされるため、それらの情報を表示することが最適です。 目的を達成すると終了するマルチプレイヤーゲームでは、目的達成への進行度を示すと役立ちます。 プレイヤーのゲームモードやマップを知らせることは、そのフレンドがプレイヤーとの関わり方を決める際に役立ちます。

シングルプレイヤーゲーム

シングルプレイヤーゲームにはフレンドは参加しませんが、表示された情報によって、フレンドがプレイヤーのゲームを観戦したり、戦略やプレイのハイライトについて話したりすることを促し、フレンドとの関わりが発生します。 プレイヤーがいるゾーン、チャプター、レベルやプレイヤーのゲーム内での現在の行動を示す情報は、これらの目標を達成するのに役立ちます。

* Steamフレンドリストやチャットに表示する文字列を定義するには、SetRichPresenceの、steam_displayに、キー/値を設定します。 このドキュメントの最後に、API呼び出しに関する詳細情報と例があります。

表示するデータの例(該当する場合)
  • 残り時間
  • 経過時間
  • プレイヤーの生存状況
  • マップまたはゾーン名
  • プレイヤーのレベル
  • プレイヤーのクラス
  • ゲームスコア
  • 難易度
  • ゲームモードのタイプ
  • サーバー上の空きスポット
  • 実行中のアクション(デッキ構築、登録変更、メインメニュー、その他)
注意: リッチプレゼンス文字列は1行に収まる必要があり、フレンドリスト内のプレイヤー名の下に表示されます。 長過ぎる場合、行末が切り捨てられたり省略(... で表示)されたりします。

フレンドのグループ化


一行の追加情報と共に、新しくなったフレンドリストでは一緒にプレイ中フレンドをグループとして表示できます。 ゲームカテゴリ内では、パーティ、サーバー、またはマッチで一緒のフレンドが線で結ばれて表示されます。 グループ分けは、ゲームにとって表示する意義のある情報によって異なります。 たとえば、Dota 2には最大5人のパーティがありますが、ゲームがマッチメイキングした5人全員のチームではなく、一緒にプレイ中のパーティを表示します。 一方、カウンターストライクでは、2人のフレンドが1つのサーバーで一緒にプレイ中の場合、パーティの一部としてサーバー全体を表示するのではなく、一緒にプレイ中の共通のフレンドだけを同じSteamプレイヤーグループに加えます。

一緒にプレイ中のフレンドをグループ化すれば、他のプレイヤーに参加の余地があるかどうかがわかります

* Steamフレンドリストやチャットでのプレイヤーのグループ化を定義するには、SetRichPresencesteam_player_group、およびsteam_player_group_sizeに、キー/値を設定します。

Steam APIとローカリゼーション



以下はいかに簡単に設定できるかを示したコードサンプルです。

コードスニペット
/*--------------------------- サンプル -------------------*/ const char *pchStatus; if ( bWinning && cWinners > 1 ) { pchStatus = "Tied"; } else if ( bWinning ) { pchStatus = "Winning"; } else { pchStatus = "Losing"; } SteamFriends()->SetRichPresence( "gamestatus", pchStatus ); bool bDisplayScoreInRichPresence = true; if ( bDisplayScoreInRichPresence ) { char rgchBuffer[32]; sprintf_safe( rgchBuffer, "%2u", uMyScore ); SteamFriends()->SetRichPresence( "score", rgchBuffer ); } SteamFriends()->SetRichPresence( "steam_display", bDisplayScoreInRichPresence ? "#StatusWithScore" : "#StatusWithoutScore" ); // 一緒にプレイしている時にフレンドをグループ化するサンプル if ( nPartyMemberCount > 1 && strPartyID ) { // 複数のユーザーのパーティに属しており、有効なPartyIDがある場合 // Steamのリッチプレゼンスシステムに通知する。 steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group", strPartyID ); steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group_size", CNumStr( nPartyMemberCount ) ); } else { // それ以外の場合は、以前の情報を消去する。パーティには属していません。 steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group", nullptr ); steamapicontext->SteamFriends()->SetRichPresence( "steam_player_group_size", nullptr ); }

上記のコードは、以下のような英語のトークンを含むローカリゼーションを使用します:

"lang" { "Language" "english" "Tokens" { "#StatusWithoutScore" "{#Status_%gamestatus%}" "#StatusWithScore" "{#Status_%gamestatus%}: %SCORE%" "#Status_AtMainMenu" "At the main menu" "#Status_WaitingForMatch" "Waiting for match" "#Status_Winning" "Winning" "#Status_Losing" "Losing" "#Status_Tied" "Tied" } }