前言
尝试在flightmare中导入一个自定义场景,不包含添加自定义物体。官方文档的说明不够详细,且存在一定的错误,按照以下步骤进行。
介绍概念
先对于过程中涉及到的部分unity相关概念进行介绍。首先unity hub用于管理不同版本的unity editor,所以需要先下载unity hub,然后通过其下载unity editor。其次project是可供编辑的工程文件,不能直接运行;而linux standalone则是经过编译后,不需要外部依赖,可以直接单独运行的二进制文件,例如之前下载并放在flightrender下的文件。故添加场景的整体过程如下,先下载unity hub,通过其下载合适版本的unity editor,然后打开flightmare的工程文件,在其中加入自己的场景,然后编译为二进制文件。将生成的二进制文件替换之前flightrender下的内容,并修改flightlib中相关配置即可
前置准备
安装unity hub
安装unity hub 2.0 https://forum.unity.com/threads/unity-hub-v2-0-0-release.677485/
注意要运行unity hub,需要首先chmod +x
可能的问题
unity网页登陆后无法弹出unity hub界面。因为下载的AppImage虽然能启动,但是没有注册到系统,故系统没法将链接交给unity hub处理
安装unity editor

下载flightmare项目文件
注意官方文档中给出的链接已经失效,UZH官方修改了项目部分内容(原来的场景有部分开始收费),使用以下新的链接
1 | git clone [email protected]:uzh-rpg/flightmare_unity.git |
修改Unity项目文件
打开项目文件
在unity hub的project页面中打开下载的flightmare_unity项目文件,将左下角Assets -> top_level_scene拖动到左上角中,并删除默认的场景
添加场景
在unity editor中,使用左上角的Assets -> Import Package -> Custom Package导入自定义场景的.unitypackage文件,导入后可以在左下角看到,将其拖动到assets -> environment下,与industrial并列同级
修改配置
使用vscode打开flightmare的unity工程文件,找到sceneSchedule文件,进行以下两项修改
首先是声明自定义场景路径public const string SCENE_xxx = "Environments/xxx";,其次是将其加入场景列表scenes_list.Add(SCENE_CITY);,要注意这里的加入顺序很重要
编译Standalone文件
点击unity editor左上的file -> build settings -> build打开编译界面
将自定义的场景添加到编译设定中,注意这里的场景编号,其中top_level_scene的编号为0,其他场景的序号顺序也很重要
注意输出的文件名称设置为RPG_Flightmare,以便于后续替换之前下载的二进制文件。可以发现编译成功后有三个文件
存在问题
在新的flightmare_unity工程文件中,官方删除了除industrial以外的所有场景文件,可以看到asset -> environment下没有其他文件夹,且编译设置中也可以看到其他场景为deleted。一种方法是手动将其他场景下载并添加回来(在官方文档中存在链接,但是需要花钱购买);另一种方法是忽略其他场景,设置新添加的场景的id为2,并配套修改代码文件。其中最容易遗漏的是在sceneSchedule中的scene_list.Add部分,需要让新的场景作为第二个添加的
修改flightmare配置
首先将之前编译输出的三个文件替换flightrender中原有的文件,其次修改flightlib文件flightlib/include/flightlib/bridges/unity_message_types.hpp中以下部分
将添加的场景的序号设置为1(注意在编译时的场景id为2,这是正常情况,因为编译时还包含top_level_scene),同时修改场景数量
运行测试
将测试文件中的场景名称修改为之前设定的场景名称,然后进行编译,然后尝试启动新场景
中间出现了几秒的industrial场景是正常现象,在载入场景之前可能会先显式默认场景
后续改进
目前场景中的初始位置还是默认的,且场景的选择没有添加到一开始的选项栏中。此外,还没有实现自定义物体的添加以及场景的预览展示。
参考内容
Standalone build — Make the build in Unity — Flightmare documentation