【Unity】UnityEditorでは動いて、Exeでは動かない場合のログ確認による解決方法

スポンサーリンク
Unity Unity
スポンサーリンク

前書き

Unityでゲーム開発をしていると、「Unity Editorでは問題なく動くのに、ビルドしたExeでは動かない」という事象に遭遇することがあります。特にSteamworksのような外部ライブラリやサービスを利用している場合、Editorとビルド環境の差異によってエラーが発生することは珍しくありません。

今回私が実際に遭遇したのは、ステージクリアフラグの更新処理がEditor上では正しく動作するのに、Exeとしてビルドした後は全く反映されないという問題でした。
原因を追っていくと「steam_appid.txt が存在しない」ことがトリガーになっており、Exeでもログをしっかり確認することで原因を特定することが出来ました。

本記事では、この事象の詳細と原因、そして再発防止のための対応策を解説していきます。

参考にUnityでSteamの実績を実装する方法については以下になります。

発生した事象

まず、今回実際に起きた事象について整理します。

  • Unity Editor
    • ゲームプレイ中に GameManager.Instance.SetStageClearFlag(ClearStageCount) を呼び出すと、正しくフラグが更新される。
    • ステージクリア処理も問題なし。
    • そのため、ステージクリアするとちゃんと次のステージが表示される。

以下の動画のように正常ではステージクリア時に第2ステージが表示されます。

  • ビルドしたExe(実行ファイル)
    • 同じシーンをプレイしても、フラグが更新されない。
    • Debug.Log で確認しても処理が呼ばれていないように見える。
    • 最終的に、ステージクリアが反映されず、ゲーム進行に支障が出る。

以下の動画のようにステージクリアしたのに第2ステージが表示されませんでした。

「Editorでは動くのにExeでは動かない」ため、初見では非常にわかりにくい状況でした。

問題箇所のコード

問題があった処理の一部は以下のようになっています。

public void SetStageClearFlag()
{
    Debug.Log("SetStageClearFlag");

    if (SteamUserStats.RequestCurrentStats())
    {
        if (!GameManager.Instance.StageClearFlag[ClearStageCount])
        {
            switch (ClearStageCount)
            {
                case 1:
                    Debug.Log("Stage Clear 1");
                    SteamUserStats.SetAchievement("StageClear1");
                    SteamUserStats.StoreStats();
                    break;
                // ... 略 ...
            }
        }
    }

    GameManager.Instance.SetStageClearFlag(ClearStageCount);
    Debug.Log("ClearStageCount = " + ClearStageCount);
}

Editor上では正常に動作していましたが、Exeでは SteamUserStats.RequestCurrentStats() の部分で問題が発生していました。

どうやってExeでの問題を突き止めたのか

解決の糸口になったのは、Exe実行時でもログを確認できるという点です。

Unityでは、ビルドしたExeを実行した際のログがPlayer.logとして保存されます。
場所は以下の通りです。

  • Windowsの場合
    C:\Users\<ユーザー名>\AppData\LocalLow\<会社名>\<プロジェクト名>\Player.log

ここに Debug.Log() の出力やエラー内容が記録されるため、Editor上では再現しない問題も追跡できます。

実際に確認したところ、以下のようなエラーメッセージが出ていました。

InvalidOperationException: Steamworks is not initialized.
  at Steamworks.InteropHelp.TestIfAvailableClient () [0x0001d] in <ef7430fd42df4bb5ba43cb7648cc0a86>:0 
  at Steamworks.SteamUserStats.RequestCurrentStats () [0x00000] in <ef7430fd42df4bb5ba43cb7648cc0a86>:0 
  at StageClearFlagControl.SetStageClearFlag () [0x00000] in <f2ab3f55148d456aa1abedda7027a2f1>:0 

InvalidOperationException: Steamworks is not initialized.」というエラーメッセージが出ており、steam_appid.txt の欠如が直接の原因であることが判明しました。

原因:steam_appid.txt が存在しない

原因はシンプルで、ビルドしたExeと同じディレクトリにsteam_appid.txtが存在しなかったことです。

Steamworksを利用する場合、開発中は steam_appid.txt をExeと同じフォルダに置いておく必要があります。これがないとSteam APIが初期化されず、関連する処理(実績解除やステータス更新など)は全て失敗してしまいます。

なぜEditorでは動いたのか?

「Editorでは問題なく動いたのに、Exeでは失敗した」という差異の原因は、Unity Editor上のフォルダ内にsteam_appid.txtが存在していたからでした。

そのため、Editor上では GameManager.Instance.SetStageClearFlag() が正常に呼ばれてフラグ更新ができていたのに、Exe環境では SteamUserStats.RequestCurrentStats() が失敗して後続処理が止まり、フラグが更新されませんでした。

この「EditorとExeの挙動差」が、原因の特定を非常に難しくしていました。

解決方法

最終的な対応はシンプルです。

  • Exeの実行ファイルと同じ場所にsteam_appid.txtを配置する

これにより、Steamworks APIの初期化が成功し、RequestCurrentStats() も正常に通るようになりました。結果として、フラグ更新処理が正しく走り、Exeでもゲームが想定通り進行するようになりました。

今回の学びと再発防止

今回の事例から得られたポイントを整理すると以下の通りです。

  • EditorとExeでは挙動が異なることを前提に考える
  • Exe環境で再現したら必ず Player.log を確認する
  • 外部サービス(Steamworksなど)を使う場合は初期化要件を満たしているかチェックする
  • 開発中は steam_appid.txt を忘れずにExeフォルダへ配置する

特に「Exeでもログが見られる」という点は、今後のトラブル解決においても重要かなと思います。

まとめ

  • Unity Editorでは動作しても、Exeでは動かないケースは頻繁に起きる
  • 今回は steam_appid.txt がなく、Steamworks APIの初期化に失敗していた
  • 解決にはExeフォルダに steam_appid.txt を配置する必要がある
  • Exeでも Player.log を確認することで原因を特定できた

Unity開発では「Editorでは動くのにExeで動かない」問題は頻出します。
特に外部ライブラリやサービスを利用する場合は、ログを確認する習慣を付けておくことが重要です。

小さなチェックの積み重ねが、開発効率と品質の両方に大きな差を生みます。
ぜひ皆さんも Exe環境でのログ確認を習慣化し、問題解決のスピードアップにつなげてください。

コメント

タイトルとURLをコピーしました