(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


Steamを経由せずゲームアプリ(exeやapp)を直接起動された時に、Steamを起動して開き直す方法【Unity】【Steam】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2022.3.21f1


はじめに

今回はSteamで配信したゲームアプリ(exeやapp)が、

Steamを経由せずに直接起動された場合に、Steamから起動し直す方法の紹介です!


ユーザーが意図して直接起動する事はあんまりないと思いますが、ファイルは簡単に確認出来ますし、


「最近起動したファイル」みたいな感じで実行ファイル自体が表示されて

そこから間違って直接起動しちゃうみたいなのは全然あり得ると思います。


特にSteamが起動してない時にゲームを直接起動すると、Steam周りの初期化が失敗するので、

一応は対策をしといた方が良さそうです。


Steamを経由せずに直接起動された時に、Steamを起動して開き直す方法

さっそくですが、Steamから起動されたかの確認と、Steamを起動して開き直すには

SteamAPIのRestartAppIfNecessaryというメソッドを使います。

SteamAPI_RestartAppIfNecessaryは、実行可能ファイルがSteam経由で起動されたかどうかを確認し、当てはまらない場合にはSteam経由で再起動します。

これはオプションですが、ユーザーが実行ファイルを直接起動すると、アプリケーションに関連付けられているSteamコンテキスト(App ID含む)が設定されないことから、強く推奨しています。 推奨オプションを使用せずに直接起動した場合、SteamAPI_Initは失敗し、Steamworks APIは使用できなくなります。
このオプションを使用することを選択する場合は、SteamAPI_Initの直前に、最初に実行するSteamworks関数として呼び出してください。

trueを返す場合、必要に応じてSteamクライアントが起動され、Steamを介してゲームを再起動します。できるだけ早く既存のプロセスを終了する必要があります。 これは実質的にはsteam://run/を実行するため、この関数を呼び出した実行可能ファイルそのものを再起動しない場合があります (例:デバッガーから実行している場合など)。 これは常に、Steamライブラリフォルダーにインストールされているバージョンから再起動します。

それ以外はfalseを返し、ゲームはSteamクライアントによって起動されたことを意味し、他に必要なアクションはありません。 唯一の例外はsteam_appid.txtファイルが存在する場合で、この場合はどんな状態でもfalseを返します。 これによって、ゲームをSteamクライアントを介さずに起動して開発やテストを行えます。 Steamデポにゲームをアップロードするときにはsteam_appid.txtファイルを必ず取り除いてください。

注: プライマリ実行可能ファイルにSteam DRMラッパーを使用する場合、DRMラッパーがこれを内部で実行するため、このチェックは不要です。


具体的には以下のような感じで、ゲームのIDを指定して使います。

using Steamworks; //SteamAPIを使うのに必要
//Steamから起動されているかチェック(ゲームのディレクトリにsteam_appid.txtファイルが存在するか)
//Steamから起動されてない場合は自動でSteamを起動して、開き直してくれる
if (SteamAPI.RestartAppIfNecessary(new AppId_t(2476640))) {
  Debug.LogError($"Steamから起動されてないので再起動");
  Application.Quit();//直接起動されたアプリを終了
  return;
}
else {
  Debug.Log($"Steamから起動されている");
}


なお、ゲームのIDはsteam_appid.txtに書くやつで、


ストアのURLにも含まれる数字です。


https://store.steampowered.com/app/2476640/


ちなみに上記のドキュメントにも書いてある通り、

steam_appid.txtがアプリと同じディレクトリにあるとSteamから起動したと見なされてしまうので、

アップロードする時はsteam_appid.txtファイルを削除する必要があるようです。