UDN
Search public documentation:

OnlineSubsystemSteamworksJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 ホーム > レプリケーション(複製) > Online Subsystem Steamworks

Online Subsystem Steamworks


概要


Online Subsystem に関する全般的な情報および高度な情報については、 Online Subsystem 技術ガイド のページを参照してください。

成績 (Achievements) や順位表 (Leaderboards)、クライアント / サーバー統計など、「Steamworks」に依存する機能を実装するには、作成するゲームに Steam AppID (Application ID) が必要となります。また、Steamworks partner (パートナー) ウェブサイトにアクセスできるようにする必要があります。

ALERT! 注意 : _2011年11月リリースのエンジンには、OnlineSubsystemSteamworks に関して重要な変更が含まれます。( ペンディング事項 )。このページには、それらの変更に基づく内容が含まれています。

インテグレーションの状態


OnlineSubsystemSteamworks には、定期的に変更が加えられています。2011年12月時点における重要な機能リストは、以下の通りです。

  • 成績
  • プレイヤーの統計
  • プレイヤーの順位表
  • サーバーブラウザの広告
  • サーバーブラウザのクエリ
  • ボイスオーバー IP
  • ロビーの管理 / 広告 / クエリ
  • 「Steam」ソケット (「Steam」を介したネットワーク、接続自動 NAT トラバース)
  • マルチプレイヤーの認証
    • クライアントの認証
    • サーバーの認証
  • 「Steam」クライアントをともなわないホストサーバー

以下は、上記の機能に関する注意点です。

  • 順位表は、順表のエントリーとともに任意のデータを保存することがまだできません。
  • サーバーブラウザのフィルタリングは、サーバータグフィールドを利用するための最適化がまだ行われていません。(サーバークエリがフィルタリングを実行する必要があります)。
  • サーバーブラウザは、NAT トラバーサルをサポートしていません。必要な場合は、「Steam」のロビーを代わりに使用しなければなりません。
  • 成績 / 統計 / 成績表は、 *Engine.ini によって設定されます。これは、プレイヤーによる .ini の変更に対してセキュアではありません。

以下は、これらの最新の変更を統合する際の一般的な注意事項です。

  • 最新の「Steam」の変更にともなって、「Unreal Engine 3」におけるネットの互換性が失われました。
  • ゲームにおける OnlineSubsystemSteamworks の以前の実装は、再テスト、および、(場合によっては) リファクタリングが必要となります。

以下は、今後実装されるべき機能です。

  • PS3/Mac のサポート。

以下の機能には、バグが含まれている可能性があります。

  • Friend join (友人参加) (「Steam」から起動しなければならない場合に、ゲームが正しく機能しません。「Steam」ソケットサーバーに問題があります)。
  • Friend invite (友人招待) (上記同様です)。
  • Lobby invite (ロビー招待) (上記同様です)。

「Steam Integration」を「UnrealEngine3」で使用及び実装する方法


「Steam」クライアントの使用

初期ゲームの取得(コンテンツ サーバー設置後)

  • 最新版の「Steam」SDKを入手して、sdk/client/Steam.exeとsdk/client/Steam.cfgをローカルフォルダーにコピーしてください。
    • ライセンシーのみなさんは、'//depot/UnrealEngine3/Development/External/Steamworks/sdk/client/...'からコピーできます。
    • UDKユーザーのみなさんは、https://partner.steamgames.com/home から登録とダウンロードが出来ます。
  • 「steam.cfg」ファイルを書き込み可能にして、ローカルコンテンツサーバーを実行しているIPアドレスに’SdkContentServerAdrs’を設定してください。
  • 「Steam.exe」ファイルを実行
  • ゲームの[My games]タブ(我々のケースでは[Unreal Development kit])を右クリックしてインストールしてください。
  • インストールが完了したら、右クリックをして[Launch game]を選択してください。

更新状況の確認(コンテンツサーバー設定後)

  • 更新状況は「Steam」クライアントを実行している限り自動的に取り込まれます。
    • ポーリング間隔が長いと感じる場合は、「Steam」クライアントを再起動してください。

注意

  • 更新状況を取得しても、ローカルコンテンツサーバーに最初に完了したビルド(対話的で無いもの)がある場合、クライアント側に混乱が生じます。これを解決するには、「steam.exe」と「Steam.cfg」ファイルを除いた全てのファイルをローカルフォルダから削除し、最初からやり直してください。
    • 初期の開発段階では、この状況が頻繁に起こる傾向がありました。

「Steam」コンテンツツールの使用

「Steam」コンテンツツールの使用は、GUI及び「Steam」スクリプトを使用する二通りがあります。

ソリューションファイルとプロジェクトファイルを用意してGUIスクリプトを使用した最初のビルドを作成 

  • 発行したいビルドをローカルドライブ(例 「C:\Builds\UnrealEngine3」)にコピー
  • コンテンツツールの「sdk/tools/ContentTool.exe'」(「Steam」SDKの一部)を実行
  • [New Solution](新規ソリューション)ボタンをクリック
  • [Next](次へ)をクリック
  • ソリューションセクション:[Solution name](「UTGame」と入力)と場所は「C:\SteamGame」を入力 *[Next](次へ)をクリック
  • アプリケーションセクション:[Application Name](GUIに表示)に「Unreal Development Kit」を入力。そして[File Delivery]に「Loose Files」を入力し、[Application ID]に「13260」を入力
  • [Next](次へ)をクリック'
  • Depot(デポ)セクション:[Name]は「UTGame」、[Type]は「Content」、[Project Location] は 「C:\SteamGame」、[Depot Location]は「C:\SteamGame\Depot」、[Depot ID]は「13261」を入力 
  • [Next](次へ)をクリック
  • 右側のリストボックスをクリックして、「C:\Builds\UnrealEngine3」を入力
  • 「Finish」をクリック(プロジェクトに追加されるべきファイルのリストが表示。デポを同期させるためOKをクリック)
  • GUIの左上付近にある[Solution Properties]ボタンをクリック。[Solution Explorer]の下です。
  • [Launch Options]のツリービューを展開 -> Label = Default -> Command line = Unreal Development Kit
  • 右クリックしてコマンドラインを「Binaries\Win32\UDKGame.exe」へ変更'
  • ウィンドウを閉じてプロンプト画面が出たら保存.
  • ツールバーボタンの[Build]をクリック(少々時間がかかります)
  • 「C:\SteamGame\Depot」フォルダに「13261_0.dat」、「13261_0.blob」、そして 「UTGame.depot」が保存されている(これは「appid_version.dat」と「appid_version.blob」です)
  • [Publish]メニューから[Publish to Local Testing Server]を選択。「13261_0.dat」、「13261_0.blob」そして「ContentDescriptionDB.xml」がローカルサーバーに保存される
  • コンテンツサーバーを実行

「Steam」スクリプトを使用して新規バージョンを作成

  • DOSボックスをスポーンする *「//depot/UnrealEngine3/Development/External/Steamworks/sdk/tools/ContentTool.com' /verbose /console /filename '//depot/UnrealEngine3/UDKGame/Build/Steam/SteamMakeVersion.smd」を実行
  • 新規ファイルを「C:\SteamGame\Depot」から「C:\Steam\DepotRoot」へコピー
  • 「C:\SteamGame\ContentDescriptionDB.xml」を「C:\Steam\DepotRoot」へコピー
  • 更新を検出させるため、コンテンツサーバーを一度停止してから起動

注意

  • 更新プロセスはビルドシステムで自動化されています。詳細は「//depot/UnrealEngine3/Development/Builder/Scripts/Build/SteamVersion.build」を参照してください
  • 「.sts」や「.spj」ファイルを編集する際は十分注意してください。何気ない変更が問題に発展しがちです。同様に相対パスは絶対に変更しないでください。

「Steam」コンテンツサーバーの実行

コンテンツサーバーは、コマンドプロンプトもしくはサービスとして実行できます。

コマンドプロンプトからの実行

  • DOSボックスをスポーンする *「//depot/UnrealEngine3/Development/External/Steamworks/sdk/tools/contentserver/contentserver.exe' /verbose /DepotPath 'C:\SteamGame\LocalTestServer」を実行
  • 多くのデバッグ情報が出力されますが、最後の「13261_0」に注目してください
  • これで「Steam」クライアントが接続され、ビルドのダウンロードが出来ます

サービスとしての実行

  • 「ContentServerCfg.txt」で「C:\SteamGame\LocalTestServer」を 「C:\Steam\DepotRoot」 へ移動する(サービスのデポのパス設定に「ContentServerCfg.txt」を使用していない場合。下記参照)
  • DOSボックスをスポーンする *「//depot/UnrealEngine3/Development/External/Steamworks/sdk/tools/contentserver/contentserver.exe' /install」を実行する(サービスが自動的に開始します)
  • これで「Steam」クライアントが接続されビルドのダウンロードが出来ます

注意

  • コンテンツサーバーは通常とても効率よく動き、ネットワーク上で見受けられる悩みを問題なく処理します。
  • 顕著な例外が2つあります。
    • コンテンツサーバーは新しいバージョンを検知 しません 。新バージョンを検知するには、サーバーを再起動してください。
    • サービスとしてサーバーが実行されているときはデポの位置はコマンドラインで設定できません。サービスとして実行中は「ContentServer.exe」と同じディレクトリにある「ContentServerCfg.txt 」ファイルでの設定のみが可能です。 もしくは「\Steam\DepotRoot」のデフォルト値を使用します(パスはボリュームのルートと相対的です)。このファイルのシンタックスはUE3の「.ini」ファイルと似ています。例えばデポの位置を「\Steam\DepotRoot」 から 「\LocalContentServer」へ変更するには、「ContentServerCfg.txt」ファイルは次の2ラインが必要です。 

ContentServerCfg.txt
[ClientContent]
DepotRootPath = "\LocalContentServer"

「Steam」をゲームで使用する

ゲームを起動する際にただ単に「Steam」クライアントを実行しているだけで、 全ての「Steam」機能にアクセスが出来ます。「Steam」クライアントが実行されていないと、ネットワーク層は一般的なオンラインサブシステムにとどまります(通常OnlineSubsystemPCの機能があります)。

認証システムはとてもシンプルです。ゲームを所有していない場合、サーバー上でプレイが出来ません。ゲームのネットワーク接続テストをするには、Valve社にご自身のapp idをお尋ねください。「Unreal Development kit」のapp idはみなさんがお持ちです。

統計


バックエンドのセットアップ

BackendAchievementStats.png

統計をセットアップするには、「Steamworks」のバックエンドで定義する必要があります。これにアクセスするには、Steamworks partner ウェブサイト上にある [Game Admin] パネルを使用します。

統計エントリー API 名は、ViewId_ColumnId の形式 (例 : 2_0) の後に続ける 必要があります 。このとき、ViewId は特定の統計テーブルを識別するために使用される一意の番号を表します。また、ColumnId は、その統計テーブル内にある各エントリーを識別するために使用されます。

Type (型) は、INT/FLOAT のいずれも可能です (AVGRATE は未テスト / 未サポートです)。また、統計エントリーは、クライアントかゲームサーバーのどちらか一方で設定することが可能です ( 両方で設定することはできません )。

ALERT! 注意 : Achievement_# の命名法を使用する場合は、成績の番号の間が飛んではいけません (たとえば、Achievement_1 、Achievement_3 というように)。番号を見つけられない場合に「Unreal」が成績のロードを中止してしまうためです。

ゲームプレイの統合

統計データは、 OnlineStatsRead および OnlineStatsWrite のサブクラスを使用して管理します。これらのクラスは、統計テーブルのレイアウトを定義するとともに、統計データを読み / 書きするためのコンテナとして使用されます。

OnlineStats のセットアップ

OnlineStatsRead サブクラスの統計テーブルをセットアップするには、その ViewId がバックエンド統計テーブルの ViewId に一致するように設定する必要があります。また、そのテーブルのための各統計エントリーの ColumnId が ColumnIds 配列に一致するように設定する必要があります。

OnlineStatsWrite サブクラスについては、統計テーブルの ViewId を ViewIds 配列に追加します。また、 Properties 配列には、各統計エントリーの ColumnId のためにセットアップされた配列要素が必ず必要です。その際、Data はバックエンドの統計値型などと一致させます。以下はその例です。

YourOnlineStatsWrite.uc
class YourOnlineStatsWrite extends OnlineStatsWrite

defaultproperties
{
  Properties.Add((PropertyId=2,Data=(Type=SDT_Int32,Value1=0)))
}

ALERT! 注意 : ViewId および PropertyId の値を読みやすくするためには、すべての値を列挙型またはマクロ (例 : EStatsTable_Player 、 `STATSPROPERTY_SCORE) を使って指定することをお勧めします。

統計の読み取り

統計テーブルの値を取得するには、 AddReadOnlineStatsCompleteDelegate を使用してコールバックをセットアップし、 ReadOnlineStats を呼び出します。その際、読み取る対象の統計をもつプレイヤーの UniqueId (一意の ID) と OnlineStatsRead のサブクラスのインスタンスを渡します。

コールバックによって値が返されると、プレイヤーの統計情報すべてが StatsRead オブジェクトに読み込まれているため、 ClearReadOnlineStatsCompleteDelegate を呼び出し、コールバックをクリアします。

StatsRead オブジェクトから統計エントリーを読み出すには、GetIntStatValueForPlayer などの関数を使用します。詳細については、OnlineStatsRead.uc を参照してください。

ALERT!: 注意 : Steamworks v1.12 (およびそれ以前のバージョン) においては、複数の UniqueId が ReadOnlineStats に渡されると、コールバックの発行が遅くなります。これは、1 回につき 1 つの UniqueId の情報しか取得できないためです。当面、このようにして、「Steamworks」の API のクラッシュを回避しています。(特に、順位表に影響があります)。

統計の書き出し

プレイヤーの統計値を書き出すには、OnlineStatsWrite のサブクラスのインスタンスを作成し、SetIntStat などの関数を使用して、統計値をセットします (OnlineStatsWrite.uc を参照してください)。さらに、 WriteOnlineStats を使用して統計データをキャッシュするとともに、 FlushOnlineStats を使用してそのデータをバックエンドにコミットします。

このコミット処理が終了 (または失敗) したときのコールバックを受け取るには、 AddFlushOnlineStatsCompleteDelegate および ClearFlushOnlineStatsCompleteDelegate を使用して、コールバックをセット / クリアします。

ゲームサーバーの統計

ゲームサーバーの統計は、ゲームサーバーによってのみ書き込まれることができるプレイヤーの統計ですが、 Engine.ini の *GameServerStatsMappings 配列を使用して設定される必要があります。これによって、OnlineStatsWrite ViewId がゲームサーバーの統計にマッピングされます。

これが機能するためには、バックエンドにおいて、統計値の Set By フィールドを GS に設定する必要があります。

デバッグ / 開発

統計をリセットするには、 ResetStats 関数を使用します。

Achievement (成績)


バックエンドのセットアップ

BackendAchievements.png

成績をセットアップするには、まず、「Steamworks」のバックエンドに成績を入れる必要があります。これにアクセスするには、Steamworks partner ウェブサイト上にある [Game Admin] パネルを使用します。

少なくとも成績にはアイコンが設定されている 必要があります 。また、クライアントによって設定されなければなりません。さらに、一意な API 名を付ける必要があります。あるいは、連続した Achievement_# という名前を付けることができます (# は、0 から始まる数です)。

注意 : Achievement_# の命名法を使用する場合は、成績の番号の間が飛んではいけません (たとえば、Achievement_1 、Achievement_3 というように)。番号を見つけられない場合に「Unreal」が成績のロードを中止してしまうためです。

成績の統計

成績の進捗 (progress) を追跡するには、成績のための統計エントリーを作成するべきです。これらの統計値は、Online Subsystem を通じて更新されます。

統計値は INT 型でなければなりません。また、統計値の API 名が、ViewId_ColumnId 命名規則に準拠していることが 必要 です ( 上記の「統計」のセクションを参照してください )。なお、ColumnId は AchievementId に直接マッピングします (下記 _ Online Subsystem_ で解説します)。

これらの統計エントリーは、バックエンドの成績 (achievements) ページにある成績にリンクできます。成績のロック解除に必要な進捗 (progress) の最小値と最大値を設定します。

ALERT! 注意 : _バックエンドの統計および「UDK」のための成績については、ページに付属した画像がありますので、参考にしてください。_   

Online Subsystem のセットアップ

成績は、OnlineSubsytemSteamworks.uc の AchievementMappings 配列を通じて Steam のバックエンドにリンクします。配列は、DefaultEngine.ini または DefaultEngineUDK.ini ファイルから設定します。

重要 : 成績のセキュリティを向上させたい場合は、AchievementMappings から config を削除するとともに、OnlineSubsystemSteamworks.uc 内にある defaultproperties の値を指定します。さらにセキュリティを高めるには、C++ で achievement mappings を静的 TArray として保存することもできます。

この配列をセットアップしない場合は、成績は、Achievements_# の命名規則に従うことになります。

AchievementMappings 配列を使用する場合は、AchievementName を使用して、一意の AchievementId 値 (0 から始まる連続した値であることが望ましい) を、バックエンドの成績 API の名前にマッピングする必要があります。これは、どの成績についても実行する 必要があります

注記 : 成績が統計にリンクしている場合は、AchievementId が ColumnId に対応します。

ゲームプレイの統合

成績を処理するには 2 つの方法があります。1 つは、Online Subsystem の関数を使用して手動で処理します。もう 1 つは、成績統計の更新を通じて関数を自動的に機能させます。(推奨される方法です。 「自動的な進捗 / ロック解除」および「進捗の追跡」のセクションを参照してください )。

注意 : 「UDK」によって成績を実装したコーディングの例としては、UTAchievementsBase.uc 、UTAchievements.uc 、DefaultEngineUDK.ini を参照してください。

手動の進捗 / ロック解除

成績をロック解除するには、UnlockAchievement 関数を使用します。AchievementId は、AchievementMappings 配列の中でその ID のために指定された成績 API 名にマッピングされます。 AchievementMappings 配列がセットアップされていない場合は、UnlockAchievement 関数によって、API 名が Achievement_# であると見なされます。# は、AchievementId に置き換わる部分です。

成績のロック解除に関する成功 / 失敗の通知を受け取るには、 AddUnlockAchievementCompleteDelegate を使用して、UnlockAchievement を呼び出す に、通知コールバックをセットアップし、 ClearUnlockAchievementCompleteDelegate を使用してそのコールバックをクリアします。 これは、自動的に成績のロック解除を行う場合にも有効なはずですが、まだテストされていません。

成績の進捗を表示するには、 DisplayAchievementProgress() を呼び出します。AchievementId パラメータは、UnlockAchievement() と同じルールに従います。

自動的な進捗 / ロック解除

Online Subsystem に自動で成績をロック解除させるには (あるいは、自動で成績の進捗を表示させるには)、統計とバックエンドの成績をリンクさせるとともに、AchievementMappings 配列の中に ViewId と MaxProgress の値を設定する 必要があります

AchievementMappings 配列の中では、ViewId が、バックエンドにある成績統計の ViewId と一致している必要があります。また、MaxProgress は、成績がロック解除されるべき時を示し、ProgressCount は、進捗の更新を表示するまでに必要となる進捗の量を決定し、bAutoUnlock は、自動的なロック解除を制御します。

進捗の追跡

Steam のバックエンド側の統計と成績をリンクさせ終わると、統計システムに成績の進捗を追跡させることができるようになります。また、オプションで、自動的にロック解除して成績の進捗を表示させることもできるようになります。 統計システムのセットアップ方法と使用方法については、上記の「統計」セクションを参照してください。ColumnId が、成績統計のための AchievementId と一致している必要があります。

自動的な成績の進捗 / ロック解除が有効になっている場合は、入力された成績統計データが使用されて、FlushOnlineStats によってトリガーされます。

デバッグ / 開発

成績をリセットするには、 ResetStats 関数を使用して、TRUE を渡します。ただし、 これによって統計と成績の両方がリセットされることになります

Leaderboards (順位表)


バックエンドのセットアップ

順位表 (Leaderboards) は、Steamworks partner ウェブサイト上の [Game Admin] パネルからセットアップすることができます。あるいは、 CreateLeaderboard 関数を使用してセットアップすることができます。(この関数は、リリース用のコードでは使用されていません。開発目的専用です)。

指定された順位表の名前は、人間が読める順位表の名前として Steam の順位表のページに表示されます。また、現在は Valve 社によってハードコード化されていて、ローカライズはされていません。

注意 : 2011年12月以降、成績表がバックエンドで統計とリンクしなくなりました。したがって、以下の文は、12月以前のコードにのみ適用されます。

少なくとも 1 つの統計エントリーを設定する 必要があります 。その際、API 名は ViewId_ColumnId の命名規則に従います。 順位表の統計エントリーは、INT 型でなければなりません。また、クライアントによって設定される必要があります。同じテーブル / ビューにある他の統計エントリーは、INT 型でなくてもかまいません。

Online Subsystem のセットアップ

成績表は、 LeaderboardNameMappings 配列によってバックエンドにリンクします。LeaderboardName (順位表名) は、順位表を識別するものです。バックエンド上における、人間に判読可能な順位表名と一致している必要があります。ViewId は、順位表を特定の統計テーブルにマッピングします。

ALERT! 重要 : 成績のセキュリティを向上させたい場合は、AchievementMappings から config を削除するとともに、OnlineSubsystemSteamworks.uc 内にある defaultproperties の値を指定します。さらにセキュリティを高めるには、C++ で achievement mappings を静的 TArray として保存することもできます。   

この配列を設定しない場合は、成績はAchievements_#の命名法が適用されます。 

ゲームプレイの統合

統計システムのセットアップ方法と使用方法については、上記の「統計」セクションを参照してください。

順位表は統計システムを使用して読み書きします。書き込みはクライアントのみ可能です。OnlineStatsRead と OnlineStatsWrite のサブクラスは、通常どおりセットアップします。ただし、順位表のスコアがカラムに含まれるようにする必要があります。

OnlineStatsWrite のサブクラスでは、 RatingId によって、順位表のスコアのために使用する ColumnId を識別します。 OnlineStatsRead のサブクラスでは、特別に設定しなければならないことは何もありません。

ALERT! 注意 : 「UDK」によって成績を実装したコーディングの例としては、UTAchievementsBase.uc 、UTAchievements.uc 、DefaultEngineUDK.ini を参照してください。

読み取り

順位表のデータを読み込むには、ReadOnlineStats ではなく、 ReadOnlineStatsByRankReadOnlineStatsByRankAroundPlayer を使用します。プレイヤーのランク / 名前 / UniqueId はそれぞれ、OnlineStatsRead オブジェクトの Rows 配列から取得することができます。また、順位表のカラムにはプレイヤーのスコアが含まれます。

書き込み

順位表のデータを書き込むには、通常どおり、WriteOnlineStats/FlushOnlineStats を使用します。これによって、選択された順位表のカラムに基づき、順位表のスコアが更新されます。

特別な機能

順位表の情報

順位表に関する特別な情報 (SortType (ソートタイプ)、DisplayFormat (表示形式)、LeaderboardSize (順位表のサイズ) など) を得るには、 LeaderboardList 配列にアクセスします。ただし、少なくとも 1 回は読み / 書き した後になります。 LeaderboardSize は、順位表が読み / 書きされるたびに更新されます。

強制的な更新

デフォルトでは、順位表のスコアが書き込まれる場合、最も良い値が保たれます。たとえば、現在の順位表のスコアが 10 の場合、スコアを 5 に設定しようとすると失敗します。

順位表のスコア更新を強制的に実行するには、LeaderboardList にある順位表について、UpdateType を LUT_Force にセットします。 LeaderboardList に順位表がない場合は、エントリーを追加してかまいません。その際、LeaderboardName と UpdateType (更新タイプ) のみを指定します。

サーバーの広告 / クエリ


ゲームサーバーを Valve のマスターサーバー上で広告するには、Valve に連絡を取り、ご自分のゲーム appid のための広告を有効化してもらわなければなりません。連絡を取ると、Valve からあなたのゲーム専用の ProductName (製品名) キーが送られてきます。

ProductName

ProductName の値は、あなたのゲームのゲームサーバーを広告するために「Steam」内部で使用されるものです。ソースにアクセスできるライセンシーである場合は、ProductName を OnlineSubsystemSteamworks.h 内の STEAM_PRODUCT_NAME define に置きます。

UDK のみを使用するライセンシー (一意の appid をもっています) である場合は、次のように、 [OnlineSubsystemSteamworks.OnlineSubsystemSteamworks] 内の DefaultEngineUDK.ini に置きます。

ProductName=unrealdk

GameDir

ゲームのために設定しなければならないもう一つの重要な値は、 Engine.ini 内の *GameDir 値です。この値は、ゲーム固有の値でなければなりません 。このことは重要です。この値が、Valve のマスターサーバーでゲームをフィルタリングするために使用されるからです。

もし、ゲーム固有の GameDir 値が指定されていなければ、サーバーブラウザのクエリは、Valve のマスターサーバーにおいて あらゆるゲーム のための全サーバーを検索することになります。

UDK を使用する広告

固有の appid をもたない UDK デベロッパは、UDK そのものを使ってサーバーを広告することができます。この時重要となるのは、プロジェクト固有の GameDir 値を設定することです。それによって、サーバーブラウザのクエリにおいて、他の UDK 限定プロジェクトのサーバーが返されなくなります。

UDK そのものを使う広告は、非営利的な UDK デベロッパに限られます。営利的なデベロッパについては、Valve と連絡をとることによって、固有の appid と ProductName を取得しなければなりません。

「Steam」のロビー


ロビーシステムは、デフォルトで無効になっています。OnlineSubsystemSteamworks\Globals.uci で有効化することができます。(有効化するには、UnrealScript と C++ を再コンパイルする必要があります)。 OnlineLobbyInterfaceSteamworks.uc\UOnlineLobbyInterfaceSteamworks.cpp を参照してください。

注意 : 現時点では、Steamworks 専用のインターフェイスとなっており、他のオンライン サブシステムとの互換性がある汎用のインターフェイスとはなっていません。そのため、将来、汎用化する必要があり、かなりの変更が加えられるとともに、バイナリの互換性が失われる可能性があります。

マルチプレイヤーの認証


「Steam」ではマルチプレイヤー認証がサポートされています。これによって、次のような検証が行われます。すなわち、クライアントとサーバー SteamId の検証、クライアントがゲームを所有していることの検証、クライアントが VAC バン (禁止) を受けていないことの検証、クライアントが他のサーバー上でまだ認証されていないことの検証。

これは、汎用のオンラインサブシステムのインターフェイスである OnlineAuthInterface を使って制御されます。これの一般的な認証ロジックは、 AccessControl (認証を制御し、クライアントがサーバーにアクセスすることを許可する) および、 LocalPlayer (クライアントサイドで認証を処理する) で実装されています。

これはエクスポーズされるため、次の設定項目を使用して、[Engine.AccessControl] 内の *Game.ini で設定することができます。

  • bAuthenticateClients : 参加しようとするクライアントをゲームサーバーが認証すべきか否かを設定します。(認証が完了するまでクライアントは PreLogin で参加するのを阻止されます。認証に失敗した場合は、キックされます)。
  • bAuthenticateServer : クライアントがゲームサーバーを認証すべきか否かを設定します。(クライアントの認証後に行います)。
  • bAuthenticateListenHost : リッスンサーバーをホストしているプレイヤーが、自己のサーバーで認証されるべきか否かを設定します。
  • MaxAuthRetryCount : プレイヤーのための、認証をリトライできる最大回数を設定します。
  • AuthRetryDelay : 認証のリトライを試みる際に待機する遅延時間を設定します。

認証と統計

統計エントリーは、バックエンドにおいて GS (すなわち GameServer) にセットされますが (ゲームサーバーだけがプレイヤーのための統計を書きだすことができます)、プレイヤーがサーバーで認証されることが不可欠です。そうでなければ、GS 統計をそのプレイヤーのために書き出すことはできません。

「Steam」のソケット


「Steamworks」では、ネットワークインターフェイスが備わっているため、自動で NAT トラバーサルが処理されます。これによって、SteamId に基づくサーバーに接続することができるようになります。

これは、OnlineSubsystemSteamworks によって実装されています。(カスタムのネットドライバーという形態で)。これを有効にするには、DefaultEngine.ini を開き、 [Engine.Engine] の中で、次の行を、そのさらに下の行のように変更します。

NetworkDevice=IpDrv.TcpNetDriver
変更後:
NetworkDevice=OnlineSubsystemSteamworks.IpNetDriverSteamworks

注意 : この処置は、クライアントとサーバー両方で行われなければなりません。

サーバーの起動

「Steam」ソケット ネットドライバーが設定されている場合に、サーバーを起動するには、まず、 ?steamsockets をコマンドラインに入れる必要があります。これによって「Steam」ソケットが有効になります。これがコマンドラインに入っていない場合には、通常の IP 接続が使用されます。

サーバーが「Steam」ソケットを使用して起動するたびに、新たな SteamId が生成されます。これは、サーバーログファイルにログが取られ、 OnlineAuthInterface.GetServerUniqueId を通じて UnrealScript でリトリーブすることができます。

この SteamId は、サーバーに接続するために使用しなければならない UID です。ただし、通常の IP でサーバーに接続しようとするクライアントは、自動的にサーバーの SteamID のアドレスにリダイレクトされます。

サーバーが「Steam」ソケットを使用して起動すると、サーバーブラウザにおいて SteamServerId キーが使われて、サーバー SteamId の広告も行われます。

UScript でこれにアクセスするには、OnlineGameSettings サブクラスに、同じ名前をもつデータバインディング変数が与えられなければなりません。この例としては、UTGameSettingsCommon を参照してください。

ALERT! 注意 : コードによってサーバーの SteamId を取得するには、OnlineAuthInterface で GetServerUniqueId を利用します。

サーバーへの接続

「Steam」ソケットを使用してサーバーに接続するために、クライアントは、接続 URL 内にサーバーの SteamId を指定する必要があります。SteamId の URL は、 Steam.# という形式で指定します。 # の部分が SteamId です。(例 : Steam.90083795756409860)。

サーバーに接続するためのコンソールコマンドであれば、次のようになります。 open steam.90083795756409860

クライアントがサーバーの通常の IP に接続しようとする場合は、サーバーによって、サーバーの SteamId アドレスにリダイレクトされます。(ただし、通常 IP に関して NAT の問題がない場合)。

「Steam」の自動起動


ゲームを起動する際に「Steam」クライアントが確実に稼動しているようにするには、ゲームを設定することによって、「Steam」が稼働していない場合に察知して、自動的に「Steam」クライアントを起動するようにします。(その過程でゲームが閉じられ、後に「Steam」によって再起動されます)。

この設定を行うには、 *Engine.ini を編集し、[OnlineSubsystemSteamworks.OnlineSubsystemSteamworks] 内で、 bRelaunchInSteam を true にセットするとともに、 RelaunchAppId をゲームの appid にセットします。さらに、Binaries 内の Win32/Win64 フォルダから steam_appid.txt を削除しなければなりません。

また、ゲームを Steam フォルダ内にインストールすることが非常に重要となります。(通常は、Steam\SteamApps\common\YourGame\)。そうしなければ、稼動しなくなります。

「Steam」の外部でゲームを起動した場合は、ゲームが閉じられて、「Steam」によって再起動されます。(必要な場合は、「Steam」 クライアントを自動起動します)。

デバッグ


「Steam」サブシステムに問題が生じた場合、必ず最初にやるべきことは、[Core.System] の下にある *Engine.ini ファイル内で Suppress=DevOnline を削除することです。これによって、オンライン サブシステムに関するログ情報の出力量が著しく増えます。(あるいは、コンソールで unsuppress devonline をタイプします)。

Steamworks API 自体の内部で生じる問題については、ゲームのコマンドラインに -debug_steamapi を追加します。これによって、「Steam SDK」からログファイルにエラー情報が出力されます。 Steam client コマンドラインに -console を追加することも有益です。これによって、「Steam」に Console タブが追加され、デバッグ出力が得られます。

よくある問題


「Steam」サブシステムで生じる可能性がある問題。

統計が更新されない

統計の書き込みエラーが起きる一般的な原因

ゲームサーバーの統計

プレイヤーのためのゲームサーバー統計を書く場合は、クライアントが正しくサーバーで認証されるようにする必要があります。デフォルトでは、AccessControl.uc で制御されているため、プレイヤーが認証に失敗すると、エンジンによってプレイヤーがサーバーに加わることができなくなります。

どの統計をゲームサーバー統計として書き込むべきかをゲームが認識するためには、(統計のセクションで説明したように) GameServerStatsMappings を適切に設定することも必要です。

また、必ず、サーバーによってオンラインのセッションが正しく設定されるようにしなければなりません。(これは、マスターサーバー上でリストされているか否かを調べることによって判断することができます)。

サーバーがマスターサーバー上に現れない


サーバーがサーバーブラウザ上に現れない一般的な原因

ProductName と GameDir

サーバーがマスターサーバー上に現れ、クエリ可能な状態になるようにするには、上記のサーバー広告 / クエリのセクションで説明しているように、ゲームのために有効な ProductName および GameDir の値をセットする必要があります。

ポートフォワーディングと NAT トラバーサルの欠如

「Steam」は、サーバーブラウザのために NAT トラバーサルをサポートしていません。そのため、サーバーをホストする場合は、ゲーム / クエリおよび、「Steam」自身のためにポートを必ず開く必要があります。詳細について : https://support.steampowered.com/kb_article.php?ref=8571-GLVN-8711

「Steam」クライアントをともなわない専用サーバー

「Steam」クライアントを起動せずに専用サーバーを稼働させる場合は、Binaries\Win32 フォルダの中に、steamclient.dll 、tier0_.dll 、vstdlib_s.dll 、steam.dll の各ファイルが必ず存在するようにします。

同一 IP からのホスティングとクエリ

サーバーブラウザの [Internet] タブで、ローカルにホストされているサーバーをクエリすることはできません。[LAN] タブからのみクエリ可能です。

コンテンツサーバー


ゲームとコンテンツをパブリッシュ / デプロイする方法が書かれた 「Steam」 のページをご覧ください。

変更リスト


以下は、OnlineSubsystemSteamworks の大きな変更をリストしたものです。

2011年12月12日

変更リスト番号 : 1101160

変更リスト :

OnlineSubsystemSteamworks:
-------------------------
- 成績表が、成績表内に統計データを格納するようになりました。(バックエンドの統計システムの中ではなく)。
- ゲームサーバーの統計 ViewId が、[OnlineSubsystemSteamworks.OnlineSubsystemSteamworks] の下にある GameServerStatsMappings を介して、*Engine.ini において明示的に指定されなければならなくなりました。
   - ゲームサーバーの統計が ViewId に基づいて決定されるため、クライアントおよびゲームサーバーの統計は、別々に読まれる / 書かれる必要があります。
- 成績表のエラーログが誤検出する問題を修正しました。
- 統計デバッグログをいくらか追加しました。
- 既存の統計デバッグログを改善しました。
- コマンドライン内に -nosteam があるか、あるいは、bEnableSteam=false であるにもかかわらず、「Steam」ゲームサーバーが初期化しようとする問題を修正しました。
- OnlineSubsystemSteamworks から bIncrementStatValues を削除しました。
- 「Steam」が稼働していない状態でサーバーが稼働する場合に、ゲームサーバーの統計に関して生じるクラッシュを修正しました。
- ゲームが一時停止している場合に、認証タイマーに関して生じる問題を修正しました。
- OnlineAuthInterfaceImpl にとってマッチしないネイティブクラスのサイズに関する問題を修正しました。(原因は、二重のデリゲートにあります)。
- コードがいくつかの認証セッションのエンディングをスキップする問題を修正しました。
- ReadOnlineStats を使用して、(ViewId および LeaderboardNameMappings で定められている) プレイヤーのリストのための成績表エントリを読み込めるようになりました。 

2011年12月8日

変更リスト番号 : 1097618

ビルドノート

 最近の「Unreal Engine 3」「Steam」について注目すべき事項 :
---------------------------------------------
- 基本となる「Unreal Engine 3」ネットコードが多数追加 / 改変されたため、ネット互換性が完全に失われました。
   - ネットチャンネル ハンドシェイク コードが、基本ネットコードに追加されました。
   - 「Steam」の認証が完全に再コード化されました。
   - ログインプロセスが、部分的に変更されました。
   - 多数の基本コントロール チャンネル メッセージが変更されました。(また、ほぼすべての番号が割り当て直されました)。

- OnlineSubsystemSteamworks がかなり変更され、成績 / 統計 / 成績表 / 認証の各機能が変更になりました。
   (特に以下の事項のような変更があります)
   - OnlineSubsystemSteamworks コードのこれまでのあらゆる使用について、再テスト、および、(場合によっては) リファクタリングが必要となります。
   - 詳細については、 https://udn.epicgames.com/Three/OnlineSubsystemSteamworks のページを参照してください。

- 汎用的なマルチプレイヤー認証システムが実装されました。(現在のところ、OnlineSubsystemSteamworks によってのみ実装されています)。これによって、AccessControl 、GameInfo 、LocalPlayer の各クラスが影響を受けます。

- OnlineSubsystemSteamworks における成績 / 統計 / 成績表が、*Engine.ini を通じて設定されます。(主に、UDK のデベロッパーが、設定変更にアクセスしやすくなります)。これらのリストは、プレイヤーによる .ini の改変に対してセキュアではありません。したがって、デベロッパーがセキュリティの向上を必要とする場合は、これらのリストを (できれば) C++ または UnrealScript でハードコードすべきです。

- サーバーブラウザが、NAT トラバーサルをサポートしません。サーバーブラウザ / 広告のために NAT トラバーサルが必要な場合は、OnlineLobbyInterface の中で「Steam」のロビーを通じて実装する必要があります。

- 現在のところ、サーバーブラウザのクエリが (多数のサーバーをともない)、非常に低速となっています。クライアントが個々のサーバーすべてをクエリしなければならないためです。個々のクエリの必要性を低減させる「サーバータグ」を使用するためのコードの最適化がまだ行われていません。

- PS3 / Mac のためのサポートがまだ実装されていません。


「Unreal Engine 3」「Steam」の機能 / 変更の概要 :
-------------------------------------
- 統計 / 成績表 / 成績のためのサポートが拡張されました。
   - 成績のセットアップが変更されたため、「Steam」バックエンドでセットアップすることが容易になります。
   - ゲームサーバーの統計がサポートされ、完全に機能するようになりました。
   - 成績表のサポートが統合されました。

- サーバーブラウザの広告 / クエリが修正 / 改善されました。
- ボイスオーバー IP が修正されました。
- 「Steam」のロビーのための基本的なサポートが、OnlineLobbyInterface を通じて追加されました。
- ゲーム接続 NAT トラバースが、「Steam」のソケット (すなわち、「Steam」のピアツーピアネットワーキング) を通じて追加されました。
   - 注意: これは、ゲーム接続専用です。サーバーブラウザをともなうサーバーの広告 / クエリに NAT は不向きです。
- マルチプレイヤー認証が修正および拡張されました。
- 「Steam」が同時に稼働せずにゲームサーバーが稼働できるようになりました。
- 他多数のバグ修正と調整 

変更リスト :

「Steam」のソケット
-------------
- IP ではなく SteamId によってサーバーと接続するために、SteamId ベースのネットワーキングを追加しました。自動的に NAT トラバーサルを扱います。
- 「Steam」のソケットを有効にするには、*Engine.ini  を編集し、[Engine.Engine] の下で NetworkDevice=OnlineSubsystemSteamworks.IpNetDriverSteamworks となるようにセットします。
- 「Steam」のソケットを使用するサーバーに接続するには、open Steam.# を使用します。(# の部分は、サーバーの SteamId です)。
- サーバー上で「Steam」のソケットを使用するには、URLにおいてサーバーが ?steamsockets から始まるようにします。
- 「Steam」のソケットを使用するサーバーは、自動的に、IP 接続を「Steam」ソケット接続にリダイレクトします。
- 注意 : コードによってサーバーの SteamId を取得するには、OnlineAuthInterface で GetServerUniqueId を利用します。

「Steam」マスターサーバーとサーバーブラウザのサポート :
----------------------------------------------
- UDK デベロッパーは、Valve マスターサーバー上で自分のゲームサーバーを広告するとともに、UDK サーバーブラウザでサーバーを表示することができるようになりました。
- 非営利的な UDK デベロッパーは、制限なしで UDK を通じてそのままサーバーを広告できます。
- デベロッパーが、UDK から独立して mod を表示するためには、DefaultEngineUDK.ini 内にある GameDir を、mod を識別する一意な値に変更します。
- 営利的な UDK デベロッパーは、サーバーを広告およびリスト表示するには、Valve に連絡して一意な appid / product-name (製品名) を取得しなければなりません。(UDK の製品名を使用しないでください)。
- ProductName は、非営利の場合、DefaultEngineUDK.ini で設定することができます。営利の場合は、OnlineSubsystemSteamworks.h で設定することができます。

認証インターフェイス :
--------------
- マルチプレイヤー認証に対処するために、新たなオンライン サブシステム インターフェイスである OnlineAuthInterface を追加しました。
- OnlineSubsystemSteamworks のために認証サブシステムを完全に書き直し、すべての内部エンジンコードを OnlineAuthInterfaceSteamworks に移動しました。
- AccessControl における基本となるマルチプレイヤー認証ロジック (サーバーサイドのコード)、および、LocalPlayer における基本となるマルチプレイヤー認証ロジック (クライアントサイドのコード) を実装しました。
- マルチプレイヤー認証は、*Game.ini 内の [Engine.AccessControl] において、以下のオプションを使用して有効化 / 無効化することができます。
   - bAuthenticateClients: サーバーに接続する際のクライアントの認証
   - bAuthenticateServer: クライアントに関する、サーバーの認証
   - MaxAuthRetryCount: 認証をリトライできる最大回数
   - AuthRetryDelay: 認証のリトライを試みる際に待機する遅延時間

「Steam」のロビーシステム :
------------------
- ライセンシーのために「Steamworks」ロビーを実装しました。  OnlineLobbyInterfaceSteamworks.uc\UOnlineLobbyInterfaceSteamworks.cpp を参照してください。
- ロビーシステムは、デフォルトで無効になっています。OnlineSubsystemSteamworks\Globals.uci で有効にすることができます。(有効化するには、UnrealScript と C++ を再コンパイルする必要があります)。
- 現在のところ、「Steamworks」専用のインターフェイスとなっています。他のオンラインサブシステムと互換性のある汎用インターフェイスではありません。そのため、将来、汎用化する必要があり、かなりの変更が加えられるとともに、バイナリの互換性が失われる可能性があります。


OnlineSubsystemSteamworks :
-------------------------
- サーバーを広告 / クエリする際に一意の「Steam」製品名 (product name) を管理するためのコードを追加しました。(Valve のマスターサーバーとインタラクトするために必要です)。
- サーバーをクエリする際に、一意な GameDir 値によって正しくフィルタリングするためにコードを修正しました。(他ゲームによる 20,000 以上のサーバーをブラウザがリストしようとするのを中止します)。
- ゲームサーバーのクエリのためにクライアントサイドのフィルターを追加しました。これが必要なのは、「Steamworks」が非常に限定的でハードコードされたマスターサーバー フィルターをサポートしているためです。
- 適合しないビルド番号をもつサーバーをフィルタリングするために、bFilterEngineBuild の config 値を DefaultEngine.ini/DefaultEngineUDK.ini に追加しました。
- あらゆるゲームタイプのサーバーをリストするために、All Gametypes フィルターをサーバーブラウザに追加しました。
- Unlisted Gametypes (リストされていないゲームタイプ) フィルターをサーバーブラウザに追加しました。ストック UDK ゲームタイプを実行していないサーバーをリストします。(GFxUDKFrontEnd_JoinGame::OnGameTypeChanged をご覧ください)。
- ブラウザフィルターメニューに関する問題を修正しました。
- OnlineGameSearch フィルターを、ハードコードされたマスターサーバーフィルターにマッピングするために、config FilterKeyToSteamKeyMap 配列を OnlineGameInterfaceSteamworks に追加しました。
- あるプレイヤーが接続しているときに、それと一致する IP と SeamId をもつ他のプレイヤーをキックします。(プレイヤーを参加できなくさせる稀な認証問題の修正)。
- Steam Community のプロファイルページによって、外部の IP ではなく、サーバー (例 : 127.0.0.1) に接続するために使用される IP が表示される問題を修正しました。
- サーバーが最新のクエリデータを送信するものの、マスターサーバーに関しては更新しない問題を修正しました。
- LAN サーバーをクエリする問題を修正しました。
- ゲームから出る際にオンラインゲームセッションをクリーンアップするためのコードを追加しました。(シャットダウン後にサーバーがマスターサーバー上で停滞する問題を修正)。
- サーバーブラウザの文字列フィルターに関する問題を修正しました。
- UID を Int64 文字列に (または Int64 文字列から) 変換するための、UniqueNetIdToInt64 関数と Int64ToUniqueNetId 関数を追加しました。「Steam」のソケットとともに使用するには、明示的に open Steam.# コマンドを使用します。
- 「Steam」のソケットが非「Steam」の URL のために作成される問題を修正しました。
- サーバーを同一の UID に接続しようとする場合に送信 / 受信の無限ループをトリガーしてしまう、「Steam」のソケットに関する問題を修正しました。
- 「Steam」のソケットが正しくクローズしない問題を修正しました。
- 冗長な「Steam」のソケット用コードを削除するとともに、停滞するソケットに関する問題を修正しました。
- Dayle @ Tripwire からの VOIP クラッシュの修正を統合しました。
- 「Steamworks SDK v1.15」に移行しました。
- join friend (友人に加わる) のリクエストによってゲームが起動される場合に、サーバーの URL / UID を取得できるようにするために、GetCommandlineJoinURL を追加しました。
- 友人が現在プレイしているゲームの URL / UID を取得できるようにするために、GetFriendJoinURL を追加しました。
- SendGameInviteToFriend 関数と SendGameInviteToFriends 関数を実装しました。(「Steam」の UI からではなく直接招待を送ります)。
- クライアントのゲームサーバーの統計を読み取れない問題を修正しました。
- 「Steam」のソケットのための、重要で (かつリストされていない) 広範囲に渡る複数の変更とバグフィクス
- 稀に発生するリッスンサーバーのクラッシュを修正しました。
- 「Steam」ソケットを使用するサーバーが、参加 UID を広告するようになりました。これによって、GameSettings サブクラスにおいてアクセスし、データバインディング文字列プロパティの SteamServerId を追加します。
- P2P ネットワークをともなったリレーサーバーを無効にするためのコードを追加しました。(レイテンシーが高すぎます)。
- SDK の多数のクラッシュが修正され、いくつかの Steamworks コールバックが、OnlineSubsystemSteamworks 内で (「Steam」SDK 内ではなく) ポーリングされるようになりました。
- ShowProfileUI 関数を追加しました。これは、成績表 / 統計などのためのオプションのサブ URL を使用して、プレイヤーの Steam Community のページを開くためのものです。
- OnlineSubsystemSteamworks を調整することによって、「Steam」を起動せずに「Steam」のゲームサーバーをホストできるようにしました。(注意 : 64 ビットバイナリでは使用できません)。
- *Engine.ini に bRelaunchInSteam 設定項目を追加しました。TRUE の場合で、かつ、ゲームが「Steam」の外で起動している場合は、ゲームが終了して、「Steam」の中で起動します。
   - 注意 : これが機能するためには、Binaries フォルダに steam_appid.txt が存在してはいけません。
      RelaunchAppId 設定項目が、*Engine.ini にあるゲームの appid にセットされる必要があります。
   - 注意 : これが機能するためには、ゲームが「Steam」フォルダ内に正しくインストールされる必要があります。(他の場所からは機能しません)。

サーバーブラウザ :
--------------
- ストック UDK ゲームタイプが、ゲームクラスおよびゲームタイプの int 型によってフィルターされるようになりました。(mod ゲームタイプを Deathmatch 等の下に表示するのを止めました)。
- ゲームタイプの選択を極めて素早く変更する場合に、ブラウザが不正なフィルタリング設定値を使用する問題を修正しました。

ネットワーキング :
----------
- 基本となるハンドシェイクを制御チャンネルのコードに追加するとともに、ハンドシェイクが完了するまで、制御チャンネルのコマンドをブロックするようにしました。
- PlayerController における切断コマンドの NotifyDisconnect のためのスクリプトフックを追加しました。これは、オンラインゲームセッションをクリーンアップするためのものです。
- 欠落していた制御チャンネルの実装マクロをいくつか追加しました。
- 制御チャンネルのマクロを修正しました。これは、実装マクロ欠落時にリンカの警告を出すためのものです。
- 接続セッション単位の UID を追加しました。これは、各パケットとともに送信されるものです。(「Steam」のソケットを使用時のみ)。コネクションレスの「Steam」ソケットによって、異なるゲームセッション間でデータが衝突するのを防ぐために必要です。
   - 注意 : たいていのパケット スプーフィングも防ぎます。


Ryan Gordon からの、統合された OnlineSubsystemSteamworks の変更 :
-------------------------------------------------------------
- Steamworks: AvatarImageLoaded_t コールバックを扱うため、アバターのダウンロードをより高速で処理できる場合があります。
- Steamworks: 小型、中型、大型のアバターへのアクセスを可能にします。
- Steamworks: プレイヤーのクラン情報をスクリプトにエクスポーズします。(「Steamworks」固有の機能)。
- Steamworks: デフォルでは、P2P ソケットを使用しません。これを有効にしたいライセンシーもいますが、全員ではありません。
- Steamworks: 「Steamworks」SDK の新たな認証 API に移行します。(注意 : さらなる実装が必要であるため、無効になっています)。
- Steamworks: 基本的で汎用的な、UnrealScript の呼び出しが可能なインターフェイスを「Steam」のクラウドに追加しました。非同期ではないなどの理由により、高レベルの OnlineSubsystem インターフェイスとするには、よりフォーマルにする必要があります。ただし、専ら「Steam」をターゲットにしているライセンシーにとっては、有用であるかもしれません。
- Steamworks: ゲームデータのために、生の WinSock ではなく、SDK の P2P ソケットの使用を可能にします。これによって、NAT トラバーサルが可能になります。これが有効になると、分離された制限的な NAT の背後にあるクライアントとサーバーが通信できるようになります。「Steam」は、必要に応じて、公共のリレーサーバーからデータをバウンスさせます。
- Steamworks: Binaries/Win32 における SDK ライブラリを更新します。
- Steamworks: サーバーサイドの統計は常に使用可能になりました。プリプロセッサによるチェックを削除します。(以前は、古い「Steamworks」SDK がサポートしていないためブロックアウトされていました)。
- Steamworks: UOnlineSubsystemSteamworks::GetNATType() を実装しました。
- Steamworks: Win64 のサポートを実際に有効にします。
- Steamworks: Win64 のサポートをビルドスクリプトに追加します。
- Steamworks: SDK のヘッダにおいて行端をノーマライズすることによって、「Visual Studio」の要件を満たします。
- Steamworks: 古い SDK のリリースのための条件文を削除します。

OnlineSubsystemSteamworks VOIP の修正 :
------------------------------------
- VOIP の復元結果が歪んでしまう問題を修正しました。
- VOIP AudioComponents が GC をペンディングすることに起因するクラッシュに対するチェックを追加しました。
- VOIP サウンドノードの削除を遅延させるためにカウンターを追加しました。VOIP のスキップを削減します。
- XAudio2 によって無音状態がプロシージャル (VOIP) ストリームの中に挿入される問題を修正しました。
- VOIP のバッファリングを調整して、再生をスムーズにしました。
- 送信ボタンをリリースする際に VOIP データの後半の半秒が削除される問題を修正しました。
- 「Steam」が使用可能な音声データを圧縮していたにもかかわらず、使用可能な生のデータがない場合 (あるいは、その逆の場合) に、VOIP の読み込みによってティックが中止されない問題を修正しました。
- 古い VOIP セッションが終わる前に新たな VOIP セッションが始まり、「Steam」が「レコーディング」状態に置かれるものの、データが返されないという「Steam」のバグを回避しました。
- 無効な AudioComponent の参照に起因する VOIP のクラッシュに対する付加的な修正を加えました。
- レベル変更時に AudioComponents が OnAudioFinished への呼び出しを受け取らない問題を修正しました。
- 「Steam」のバグに起因する VOIP のレコーディング破損について修正しました。
- [OnlineSubsystemSteamworks.OnlineSubsystemSteamworks] の下に config 値の VOIPVolumeMultiplier を追加しました。これは、基本となる VOIP 再生ボリュームを調整するためのものです。
- 「Steamworks」VOIP ボリュームを増強させました。
- VOIP の再生によって無音状態がスキップされる問題を修正しました。
- VOIP の再生タイミングに関する複数の問題を修正しました。
- シームレスな移動時に VOIP の再生が稀にクラッシュする問題を修正しました。
- 移動時に生じる別の稀な VOIP のクラッシュを修正しました。

XAudio2:
-------
- オーディオ完了通知に関する問題を修正しました。
- 最大ボリュームのクランプ (「Steam」の VOIP に必要) を調整しました。

AccessControl:
-------------
- ゲーム / admin のパスワードチェックがケースインセンシティブ (大文字・小文字の区別なし) である点を修正しました。

2012年1月10日

変更リスト番号 : 1124321

ビルドノート:

「Steam」に必要なスクリプトコンパイラの変更 :
---------------
- インターフェイスにおけるデリゲートに関する問題を修正しました。この問題とは、デリゲートのプロパティが依然としてデリゲートのために作成されるという問題でした。
- インターフェイスの参照を介してデリゲートを呼びだそうとした場合のコンパイラエラーを追加しました。これはサポートされていません。クラッシュの原因となる可能性があります。

2012年1月18日

変更リスト番号 : 1132393

ビルドノート:

OnlineSubsystemSteamworks:
-------------------------
- 新たな認証システムのうち重要な部分に関して、整理およびリファクタリングを行いました。
- デフォルトの VOIP ボリュームをより適切なレベルに調整しました。
- IP-to-SteamId リダイレクトコードに関する問題を修正しました。この問題とは、複数のプレイヤーがあまりにも早く接続されると、プレイヤーの一部しかリダイレクトされないという問題でした。