Unityでゲームを開発でBuild And Runでは動作するのに、直接exeを叩くと動作しない現象が発生することがあります。これはアプリ自体は起動しているが、スクリプトやオブジェクトの処理が途中で止まっている(エラーが出ている) 可能性が考えられます。

スクリプト内で、CSV、JSON、画像などの外部ファイルを読み込んでいる場合、エディタ上とビルド後(exe)では指している場所が異なり、エラーとなります。

開発用ログ(Development Build)でエラーを確認

exeをダブルクリックして動作しない原因を特定するために、一度「ログ」が見える状態でビルドし直します。

・Unity: Unity 6 (6000.3.2f1)

File > Build Profiles を開き、次のようにDevelopment Build と Script Debugging にチェックを入れてビルドします。

生成されたexeを実行し、作成された次のログファイルを確認します。

ログの場所: %USERPROFILE%\AppData\LocalLow\[会社名]\[製品名]\Player.log

次のように、呼び出そうとした外部ファイルが見つからなかったエラーが発生しています。

PC(Windows)ビルドの場合、ファイルは以下のように配置されます。

・開発時 (Editor) : Assets/StreamingAssets/data.json
・ビルド後 (Windows EXE) : ProjectName_Data/StreamingAssets/data.json

StreamingAssets フォルダを使用した外部ファイルの読み込み

ビルド後も外部ファイルを読み込む場合、StreamingAssetsを使用します。Unityは、StreamingAssetsの内容をそのままの形で、ビルド後のフォルダへコピーします。

  1. フォルダの作成
  2. Unityエディタの Project ウィンドウで、Assets フォルダの直下に StreamingAssets という名前のフォルダを作成します。この中に、読み込みたいファイル(JSON、CSV、画像、動画など)を配置します。

  3. コードでのパス指定
  4. ファイルの場所は、次のようにApplication.streamingAssetsPath を使用します。

    using System.IO;
    using UnityEngine;
    
    public class DataLoader : MonoBehaviour
    {
        void Start()
        {
            // 読み込みたいファイル名を指定
            string fileName = "data.json";
            
            // プラットフォームに応じた適切なパスを自動取得
            string filePath = Path.Combine(Application.streamingAssetsPath, fileName);
    
            if (File.Exists(filePath))
            {
                string jsonText = File.ReadAllText(filePath);
                Debug.Log("読み込んだ内容: " + jsonText);
            }
            else
            {
                Debug.LogError("ファイルが見つかりません: " + filePath);
            }
        }
    }
    
  5. 動作確認
  6. ファイルを StreamingAssets に入れ、一度ビルドして exe を実行し、正しく動作するか確認します。もし動作しない場合は、ビルド後のフォルダの「 ビルドしたフォルダ / ProjectName_Data / StreamingAssets 」内にファイルが存在するかを確認します。

    参考:Windowsビルド後の標準的なフォルダ構成

    ProjectName.exe
    ゲームを起動するための本体
    ProjectName_Data フォルダ
    最重要フォルダです。 ゲームのアセット(モデル、テクスチャ、音など)や、先ほど解説した StreamingAssets もこの中に格納
    MonoBleedingEdge フォルダ
    スクリプト(C#)を実行するためのランタイム環境
    UnityPlayer.dll
    Unityエンジン本体の機能が詰まったライブラリファイル
    UnityCrashHandler64.exe
    ゲームがクラッシュした際にログを送信・記録するためのツール