寄稿者:Valve
Online Subsystem Steam API を使用すると、Unreal Engine (UE) アプリケーションを Valve の Steam プラットフォーム に配信することができます。 Steam モジュールの主な目的は、一連の機能 (マッチ メイキングやリーダーボードなど) をサポートするアプリケーションを、Steam ユーザーに配布可能にすることです。 さらに Steam モジュールは、Online Subsystem が公開するさまざまなインターフェースを実装しており、Steamworks ソフトウェア開発キット (SDK) が提供するほとんどをサポートします。
利用可能な Steam のインターフェースをいくつか以下に示します。
- Matchmaking (マッチメイキング) (Lobbies と GameServer の API)
- リーダーボード
- 実績
- ボイス
- UserCloud
- SharedCloud
- External UI (外部 UI)
現在利用できる Steam インターフェースのより完全なリストは 「Online Subsystem Steam API リファレンス」 を参照してください。
Valve 社の要件を満たす
Steam サブシステムには Valve Steamworks で追加の設定が必要です。 UE で Steam を使用する前に、Valve に連絡し、「Steamworks SDK ドキュメント」を参照して、アプリケーションが Valve の要件を満たしていることを確認してください。
Steamworks をダウンロードする
アプリケーションが Valve 社の要件を満たしている場合は、次に進み、最新バージョンの Steamworks SDK をダウンロードしてください。
ご希望の SDK バージョンをダウンロードしたら、SDK を解凍し、../Engine/Source/ThirdParty/Steamworks/Steam<VERSION>/sdk
にコピーします。<VERSION>
は、SDK バージョン番号です。たとえば、Steamworks Version 1.53 を使用している場合は <VERSION>
は、v153
です。
プロジェクトの Steamworks SDK を更新する場合は、プロジェクト ディレクトリにある Steamworks.build.cs
ファイルの SteamVersionNumber
を更新してください。この値を更新すると、Steamworks SDK のパスも更新されるため、Unreal Engine は正しい SDK バージョンを使用します。
画像をクリックすると拡大表示されます。
Steamworks SDK を設定する
Steam をエンジンのプリコンパイル バージョンに対して使用するには、ダイナミック リンク ライブラリのいくつかを Valve 社の SDK から適切なフォルダにコピーするだけです。また、ソースに対してエンジンを再コンパイルする場合は、SDK を適切な場所に配置する必要があります。次に、関連する再配布可能なファイルを、SDK の「/redistributable_bin/
」ディレクトリから次の場所にコピーします:
64 ビット ライブラリの一部は Steam クライアント ディレクトリにあります (この記事の執筆時点で、Valve 社 はすべてのライブラリを SDK に含めていません)。
/YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[Current Version]/Win64
steam_api64.dll
steamclient64.dll
tier0_s64.dll
vstdlib_s64.dll
/YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[Current Version]/Win32
steam_api.dll
steamclient.dll
tier0_s.dll
vstdlib_s.dll
「tier0_s.dll
」と「vstdlib_s.dll
」の両方のファイルは、専用サーバー ビルドの「-force_steamclient_link」フラグを使用して明示的にリンクする場合にのみ必要です。クライアント ビルドにこれらのファイルは必要ありません。
UE バージョン 4.22 以前の場合:
/YourUnrealEnginePath/EngineOrGameFolder/Binaries/Mac/YourGame.app/Contents/MacOS
libsteam_api.dylib
(/redistributable_bin/osx32
- ダイナミック ライブラリ (.dylib) は 32 ビットと 64 ビットの両方をサポートしています)
UE バージョン 4.23 から、Mac ユーザーも以下のコマンドを実行する必要があります:
/YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[Current Version]/Mac/
* libsteam_api.dylib
、以下のコマンドを実行することで生成されます:
install_name_tool -id @rpath/libsteam_api.dylib /redistributable_bin/osx32/libsteam_api.dylib
Linux ユーザーは、実行可能ファイルと一緒に次のファイルをリンクして提供する必要があります。
/YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[現バージョン]/i686-unknown-linux-gnu/libsteam_api.so
* redistibutable_bin/linux32/libsteam_api.so
/YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[現バージョン]/x86_64-unknown-linux-gnu/libsteam_api.so
* redistibutable_bin/linux64/libsteam_api.so
Steam App ID
Steam Online Subsystem を使用するすべてのゲームには、有効なアプリケーション ID が必要です。これはアプリケーションの Steam App ID が不明な場合に Steamworks API が初期化されないためです。
UE は Steam を初期化する前に「steam_appid.txt
」を生成します (エンジンの正常なシャットダウン中に UE はこのファイルを削除します)。
Steam は現在の作業ディレクトリからテキスト ファイルを探すため、「steam_appid.txt
」はアプリケーションの実行可能ファイルと同じディレクトリに配置する必要があることに注意が必要です。
また、このファイルを Steam 画像に含めることはできません。
「steam_appid.txt
」を開くと SteamDevAppId エントリが表示されます。これは Steam にアプリケーション ID を示すフィールドです。
これで Steam クライアントでゲームを起動する必要がなくなります (実行されている必要はあります)。
アプリケーションをテストする場合は 480
の SteamDevAppId を使用できます。これはデベロッパー全員が共有するテスト用のアプリ ID です。
前述したテスト用のアプリ ID でほとんどの Steam インターフェースをテストできますが、アプリケーションをシッピングするには Steam App ID が必要です。
シッピング ビルド
シッピング ビルドでは、エンジンはログイン ユーザーがゲームに適切にサブスクライブしているかを確認し、エンジンのテストで「False」が返ってきた場合はシャットダウンします (これはゲームを保護する方法の 1 つです)。 さらに、Steam DRM (『Steamworks SDK』を参照) を使用するとゲームを改ざんからさらに保護することができます。
アプリケーション設定を構成する
Unreal プロジェクト ブラウザ を使用して新規プロジェクトを作成する場合、オンライン サブシステム の設定は DefaultEngine.ini
に存在しません。ただし、サンプル プロジェクトのいずれかを修正する場合は、オンライン サブシステム の設定がすでに存在している可能性があります。
Steam App ID とともにアプリケーションの Steamworks SDK を設定したので、Online Subsystem Steam を使用するようにアプリケーション設定を構成する準備が整いました。
ステップ
-
プロジェクトの「
DefaultEngine.ini
」ファイルを開き、次の設定を追加します。[/Script/Engine.GameEngine] +NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
NetDriverDefinitions は UE で使用できるネット ドライバを表し、次のプロパティを定義します。
- DefName は、このネット ドライバの定義を表す一意の名前です。
- DriverClassName はプライマリ ネット ドライバのクラス名です。
- DriverClassNameFallBack は、プライマリ ネット ドライバ クラスの初期化に失敗した場合のフォールバック ネット ドライバのクラス名です。
-
UE で Online Subsystem Steam を使用するには次の設定を追加します。
[OnlineSubsystem] DefaultPlatformService=Steam
-
アプリケーションで Steam Online Subsystem を使用するように UE を設定しました。次に、以下の設定を追加して OnlineSubsystemSteam モジュールを構成する必要があります。
[OnlineSubsystemSteam] bEnabled=true SteamDevAppId=480
-
アプリケーションを接続するネット ドライバに Steam クラスを指定します。
[/Script/OnlineSubsystemSteam.SteamNetDriver] NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
この後、セッション を使うか ロビー を使うかによって、次のステップが異なります。
セッションを使う場合
ゲームでセッションを使用する場合は、OnlineSubsystemSteam
に以下を追加してください:
bInitServerOnClient=true
ロビーを使用する場合は、この値を設定する必要はありません。
ユーザーがセッションを作成および参加できるようにするには、bInitServerOnClient
設定を有効にする必要があります。この設定を有効にしないと、Steam オンライン サブシステムは正しく初期化されません。Create Session Blueprint ノードと同等の C++ 関数は機能せず、セッションに参加できません。
最終結果
この短いガイドの最後では、アプリケーションの「DefaultEngine.ini
」ファイルは以下の設定ブロックのようになるはずです。他のプロジェクトが Online Subsystem をセットアップして使用する方法を確認する場合は、サンプル プロジェクトのライブラリを参照してください。
完了済みの設定
DefaultEngine.ini
[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
[OnlineSubsystem]
DefaultPlatformService=Steam
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
; If using Sessions
; bInitServerOnClient=true
[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
サーバーとロビー
Steam は、ロビーを介して (専用とリッスン サーバー ゲームの両方で) ピアツーピアのマッチメイキングをサポートし、専用サーバーを実行する機能を提供します。ユーザーはロビーを使用してゲーム サーバーに関する情報を知ることができます。これは通常、プレイしているマップやモードなど、リッスン サーバー ゲームに関するゲーム固有の情報の伝達に使用します。また、ユーザーはマッチメイキング システムを介して、参加することなくロビーに接続した他のユーザーの数を確認できます。専用サーバーはロビーとは異なるバイナリであり、ゲームのサーバー側の機能を実行およびホストします。Steam の機能、実装、デベロッパー インターフェースの詳細は、Steam サイトの 「パートナー ドキュメント」 を参照してください。
ロビーの詳細
ロビーは基本的にチャット ルームで、Steam のバックエンド サービスのピアツーピア インスタンスとして存在します。サーバーとは異なり、参加する前にピン時間や現在の参加ユーザー数などのロビーに関する情報を利用できません。通常、これらはリッスン サーバーに使用します。ロビーを設定するには、bUsesPresence
フラグと bUseLobbiesIfAvailable
フラグを true
にセットします。C++コードの IOnlineSession::CreateSession
メソッドに渡される FOnlineSessionSettings
オブジェクト内で設定できます。
サーバーの詳細
サーバー インスタンスを設定するには bUsesPresence
フラグが false
であることを確認します。専用サーバーには次の 3 つのマクロが必要です。この 3 つがすべて、パートナー パネルの Steam 専用サーバー ツール ページの値と一致する必要があります。これらの値が一致しない場合、Steam ネットワークは専用サーバーを表示しません。
UE マクロ | Steam 名 | 説明 |
---|---|---|
UE_PROJECT_STEAMPRODUCTNAME |
STEAMPRODUCTNAME |
Valve 社はこれをビルド ID にすることを推奨しています。しかし通常は、AppID を文字列として使用するか、余分なシンボルのない簡単な製品名を使用します。 |
UE_PROJECT_STEAMGAMEDIR |
STEAMGAMEDIR |
これは通常、ゲームのフォルダ名であり、スペースやシンボルを含めることはできません。スペースやシンボルを含まない名前である限り、これがフォルダ名である必要はまったくありません。 |
UE_PROJECT_STEAMGAMEDESC |
STEAMGAMEDESC |
Valve 社は、これを製品の正式名に設定することを推奨しています。 |
UE_PROJECT_STEAMSHIPPINGID |
利用不可 | UE バージョン 4.22 以降で Steam の外部で起動する場合、このマクロは製品の Steam ID を含む必要があります。 |
UE バージョン 4.22 では、これらの値をゲームの「Target.cs
」ファイルで指定できます。また、 UE_PROJECT_STEAMSHIPPINGID
を定義して Steam ID をビルドに書き込むこともできます。すべてのビルド構成にこれが必要で、ない場合は Steam の外部で起動できません。
4.22 より前のバージョンでは、「OnlineSessionAsyncServerSteam.cpp
」を編集してゲームの値を含めます。
専用サーバー ビルドの配布に関する詳細は 「Steam のパートナードキュメント」 を参照してください。
Steam Online 認証
Steam は、プラットフォームが提供する独自のサーバー関連機能に対し、アクセスを制御する特別な認証システムを備えています。この対象は、広告サーバーとプレイヤー数、パブリッシャーと Valve 社の不正対策停止リストの取得と対応、ライセンス チェックの実行などです。
Unreal Engine は FOnlineAuthSteam
クラスを介してこの機能のインターフェース機能を提供します。
Steam Online Subsystem を使用するようにアプリケーションを設定すると、SteamAuth パケット ハンドラ コンポーネントを有効化してこれらの機能を利用できるようになります。
SteamAuth を有効化する
SteamAuth を有効化するには、以下を「DefaultEngine.ini」に追加するか、Steam Online 認証をサポートしている各プラットフォームの「プラットフォーム固有のエンジン.ini」ファイル (「WindowsEngine.ini」、「LinuxEngine.ini」、「MacEngine.ini」など) に追加します。
[PacketHandlerComponents]
+Components=OnlineSubsystemSteam.SteamAuthComponentModuleInterface
有効化すると、Steam Online Subsystem インターフェース (SteamOSS) 機能である GetAuthInterface
を使用して SteamAuth 機能にアクセスできます。
SteamAuth を有効化すると、アプリケーションは参加している全プレイヤーに (Steam サービスに対する) 認証手順を実行します。SteamAuth はデフォルトでこのチェックに失敗したプレイヤーを追い出しますが、このビヘイビアはオーバーライドできます。
SteamAuth デリゲート
SteamAuth システムにはデベロッパーがオーバーライドできるデリゲートが 2 つあります。それは、OverrideFailureDelegate
と OnAuthenticationResultDelegate
です。
プレーヤーが Steam 認証なしでサーバーに参加を試みた場合、またはセッション中にプレーヤーが Steam 認証を失った場合は、OverrideFailureDelegate
がプレイヤーの FUniqueNetId
とともに呼び出されます。
デフォルトでは、SteamAuth はそのプレイヤーをゲームから追い出します。
ただし、このデリゲートがバインドされている場合、デフォルトのビヘイビアは一時停止されます。そのビヘイビアが依然必要な場合、デベロッパーはプレーヤーを手動で追い出す必要があります。
OnAuthenticationResultDelegate
は Steam の認証サービスからの応答を処理し、プレイヤーの FUniqueNetId
と認証の実行が成功したかを示すブール値を提供します。
追記
IPNetDriver を使用する
デフォルトでは、UE の Steam OSS はデフォルトのソケット サブシステムとして Steam ネットワークを使用します。4.22 では、「OnlineSubsystemSteam.bUseSteamNetworking
」を「false
」に設定してこのビヘイビアを無効化できます。これを行うには、以下を「DefaultEngine.ini」に追加するか、サポートする各プラットフォームで「プラットフォーム固有のエンジン.ini」ファイル (「WindowsEngine.ini」、「LinuxEngine.ini」、「MacEngine.ini」など) に追加します。
[OnlineSubsystemSteam]
bUseSteamNetworking=false
4.22 より前のバージョンでは RegisterSocketSubsystem
関数を呼び出す「SocketSubsystemSteam.cpp
」を変更し、bool
パラメータを「false
」に変更します。また、プロジェクトのコンフィギュレーション ファイルでネットドライバを変更する必要があります。
モジュール設定
Unreal Engine Steam モジュールをプロジェクトの一部として含める必要があります (詳細なヘルプは「UnrealBuildTool ターゲット ファイル」を参照してください)。
具体的には、「mygame.build.cs
」のコンストラクタに次の行を追加すれば、Steam モジュールがゲームとともにビルドされます。
DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");
Mac での Steam Overlay
Mac での Steam Overlay は、Steam クライアントでゲームを起動する必要があります。これを行うには、まず Steam の [Games (ゲーム)] メニューから [Add a Non-Steam Game to My Library (非 Steam ゲームをマイ ライブラリに追加)] オプションを使用してゲームをライブラリに追加する必要があります。