【Airsim】查找配置文件 settings json 的路径优先级

参考官方文档

Settings – AirSim

1. 文件格式要求

  1. settings.json 文件采用常规的 JSON 格式。
  2. 在首次启动时,AirSim 会在用户的主文件夹中创建一个没有设置的 settings.json 文件(待测试)。
  3. 为了避免问题,请始终使用 ASCII 格式保存 JSON 文件。

2. 查找优先级

AirSim 按以下顺序查找settings.json文件,第一个匹配的文件将被使用:

  1. 通过 settings 命令行参数指定的(绝对)路径。例如:

    AirSim.exe -settings="C:\path\to\settings.json" # Windows
    ./Blocks.sh -settings="/home/$USER/path/to/settings.json" # Linux
    
  2. 查找 settings 命令行参数传递的 JSON 文档。例如:

    AirSim.exe -settings={"foo":"bar"} # Windows
    ./Blocks.sh -settings={"foo":"bar"} # Linux
    
  3. 在可执行文件所在的文件夹中查找名为 settings.json 的文件。

    注意是存储UE编辑器或二进制文件实际可执行文件的路径(取决于打开UE项目的方式)。例如,对于 Blocks 二进制文件,搜索的位置是

    <path-of-binary>/LinuxNoEditor/Blocks/Binaries/Linux/settings.json
    
  4. 在启动可执行文件的文件夹中查找 settings.json 文件。这是包含启动脚本或可执行文件的顶层目录。例如,

    <path-of-binary>/WindowsNoEditor/settings.json # Windows
    <path-of-binary>/LinuxNoEditor/settings.json # Linux
    

    注意,这个路径会根据调用的位置而变化。在 Linux 中,如果从 LinuxNoEditor 文件夹内执行 Blocks.sh 脚本,如 ./Blocks.sh,则使用前面提到的路径。然而,如果从 LinuxNoEditor 文件夹外部启动,如 ./LinuxNoEditor/Blocks.sh,则使用 <path-of-binary>/settings.json

  5. 在 AirSim 子文件夹中查找名为 settings.json 的文件。AirSim 子文件夹位于 Windows 的 Documents\AirSim 和 Linux 系统的 ~/Documents/AirSim 中(受系统语言影响,中文系统是文档)。

显然方式5省事,方式1靠谱。

3. 对应源码

在文件/AirSim/Unreal/Plugins/AirSim/Source/SimHUD/SimHUD.cpp中可以修改路径。getSettingsText函数会在重写的虚函数ASimHUD::BeginPlay()中被调用,即在每次游戏开始时重新读取 json 文件。

// Attempts to parse the settings text from one of multiple locations.
// First, check the command line for settings provided via "-s" or "--settings" arguments
// Next, check the executable's working directory for the settings file.
// Finally, check the user's documents folder.
// If the settings file cannot be read, throw an exception

bool ASimHUD::getSettingsText(std::string& settingsText)
{
    return (getSettingsTextFromCommandLine(settingsText) ||
            readSettingsTextFromFile(FString(msr::airlib::Settings::getExecutableFullPath("settings.json").c_str()), settingsText) ||
            readSettingsTextFromFile(getLaunchPath("settings.json"), settingsText) ||
            readSettingsTextFromFile(FString(msr::airlib::Settings::Settings::getUserDirectoryFullPath("settings.json").c_str()), settingsText));
}
上一篇
下一篇