4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Bevy】VSCodeのデバッグで、アセットを読み込めない(見つけられない)問題を治す方法【Rust】

Last updated at Posted at 2023-06-13

はじめに

Bevyでは、ゲームの画像や音楽ファイル(=アセット)の読み込みのためのAssetServerモジュールが用意されており、これを用いることで相対パスからのアセット読み込みを簡易にしてくれます。

main.rs
// AssetServerを用いた読み込みの例.rs(説明のため一部のみ載せています)

fn spawn_player(
    mut commands: Commands,
    window_query: Query<&Window, With<PrimaryWindow>>,
    asset_server: Res<AssetServer>,
) {
    // Playerを生成するためのシステム

    let window = window_query.get_single().unwrap();
    commands.spawn((
        SpriteBundle {
            
            texture: asset_server.load("sprites/ball.png"),
            
        },
        Player {},
    ));
}

デフォルトでは「assets」フォルダから探して読み込むことになっているので、
上の例では、以下のディレクトリ構造の「assets」フォルダ内のspritesフォルダにあるball.pngという画像をスプライトのテクスチャとして読み込もうとしています。

"ワークスペースのルートディレクトリ"
├─.vscode
│  ├─launch.json
├─assets
│  ├─audio
│    ├─ その他音声ファイル
│  └─sprites
│    ├─ball.png
├─src
│  ├─main.rs

これは、cargo runを直接打って実行すると問題なくball.pngの画像が読み込まれます。

しかし、VSCodeでF5キーを押して実行できる、生成された.vscode/launch.jsonを元にしたデバッグでは画像を見つけることができず、以下のように警告が表示されます。

2023-06-13T02:56:32.059970Z  WARN bevy_asset::asset_server: encountered an error while reading an asset: path not found: ワークスペースのディレクトリ/target/debug/assets/sprites/ball.png

原因

上のリンク先によると、AssetServerがファイルを読み込む場所の指定はROOT/ASSET_FOLDER_NAME/pathという形のファイルパスで設定されています。

先程の例では、

  • ASSET_FOLDER_NAME = 「assets」
  • path = 「sprites/ball.png」
    になることが分かります。

ROOTはデフォルトではアプリケーションの実行場所のディレクトリを指しており

  • BEVY_ASSET_ROOT
  • CARGO_MANIFEST_DIR
    いずれかの環境変数で上書きすることができます。

cargoを用いでコードをコンパイル・実行する際、target/debugフォルダが生成され、そこにバイナリが置かれて実行されます。
cargo run経由の実行では、CARGO_MANIFEST_DIRが設定されるので、この際のROOT/ASSET_FOLDER_NAME/pathワークスペースのルートディレクトリ/assets/sprites/ball.pngとなるのですが、
VSCodeからのCodeLLDBによるデバッグでは、CARGO_MANIFEST_DIRが設定されずにバイナリを直接実行するので、ROOTがアプリケーションの実行場所のディレクトリ、つまりtarget/debugに設定されるので、「ball.png」を見つけることが出来なかったのです。

解決策

前述の通り、ROOT

  • BEVY_ASSET_ROOT
  • CARGO_MANIFEST_DIR

この環境変数で上書きできるので、その通りにすればよいです。
つまり、launch.jsonをデバッグ実行時に上記いずれかの環境変数を設定するように書き加えます。

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug executable 'bevy-ball-game'",
            "cargo": {
                "args": [
                    "build",
                    "--bin=bevy-ball-game",
                    "--package=bevy-ball-game"
                ],
                "filter": {
                    "name": "bevy-ball-game",
                    "kind": "bin"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}",
            "env": {"BEVY_ASSET_ROOT": "${workspaceFolder}"} //  新しく書き加えた部分
        },
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug unit tests in executable 'bevy-ball-game'",
            "cargo": {
                "args": [
                    "test",
                    "--no-run",
                    "--bin=bevy-ball-game",
                    "--package=bevy-ball-game"
                ],
                "filter": {
                    "name": "bevy-ball-game",
                    "kind": "bin"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}",
            "env": {"BEVY_ASSET_ROOT": "${workspaceFolder}/assets"} //  新しく書き加えた部分
        }
    ]
}
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?