查看游戏文件有助于深入了解游戏机制,也可以提供更高质量的贴图以在本 wiki上使用。游戏文件可以通过 Steam 找到,只需在库中右键的缺氧,然后点击“属性”、“本地文件”、“浏览...”
存档文件[ | ]
存档文件是玩家接触最多的游戏文件之一。获取存档文件有助于备份游戏进度以及在报告错误时复现问题。以下是不同操作系统下游戏存档文件所在的路径:
- Windows:
C:\Users\%USERNAME%\Documents\Klei\OxygenNotIncluded\save_files
- Mac:
~/Library/Application Support/unity.Klei.Oxygen Not Included/save_files
- Linux:
~/.config/unity3d/Klei/Oxygen Not Included/save_files
代码[ | ]
您需要一个 C# 反编译器来查看游戏代码。常用的反编译器有 dotPeek,ILSpy 和 dnSpy (它们各有优劣,因此有人会结合使用)。它们可以被用来反编译 OxygenNotIncluded_Data/Managed/Assembly-CSharp.dll
。 这个文件中包含大部分的游戏代码。一些与引擎相关的代码在同一文件夹下的 Assembly-CSharp-firstpass.dll
文件中。
请注意,反编译的代码不像普通的源代码那样容易阅读,因此某些部分可能难以理解(例如,局部变量名称是反编译器推断出的,并且所有注释都会丢失)。以下是有关代码结构的一些提示:
STRINGS
是一个很好的起点。您可以先搜索游戏内的一个名称,然后变量名会告诉您代码中该物体的名称。例如,冰息萝卜(Wheezewort)叫做 Coldbreather。TUNING
包含很多平衡信息。但由于编译器优化,有时不能链接到使用它的代码。- 大多数游戏代码都在根命名空间中。
- 大多数实体的代码都有两个对象。一个主要对象,它通常处理它们的状态机信息(状态机控制它们的行为),以及一个
Config
对象,它设置它们的大部分组件并分配数值。主对象有助于理解行为,而Config
有助于理解数值平衡。 - 有时您会遇到以长数字形式发送的消息,它们是哈希值。您可以在
GameHashes
、SimHashes
、SimMessageHashes
等类中查找更多信息。 - 有时 dotPeek 不能很好地反编译某些代码,而将其显示为许多编译器自动生成的字段。dnSpy 通常可以更好地处理这些部分。
如果你想批量提取游戏内的一些数据,可以借助一些github上的项目,比如Oni_Extract。
- 在开始工作前,你需要对你代码中所需要访问的一些关键类的私有函数(
private
),使用dnSpy修改为公共函数(public
),重新编译后复制OxygenNotIncluded_Data/Managed/Assembly-CSharp.dll
和Assembly-CSharp-firstpass.dll
这两个文件到Oni_Extract项目的库目录lib
中进行替换。 - 你需要通过写一些C#代码来导出你想要导出的数据。
IEntityConfig
为实体类的接口,大部分在游戏沙盒中能生成的对象,都继承自这个接口。 - 关注用
Component
和Def
为关键字命名的数据类型,这些与定义游戏对象实体的各类属性有关。
配置文件[ | ]
游戏的大多数配置信息和一些简单的平衡数据可以在 OxygenNotIncluded_Data\StreamingAssets
的子文件夹中找到。这些文件大多数为 YAML 格式。
codex
: 游戏内右上角的数据库dlc
: DLC 专用的模板和地图生成信息elements
: 元素的属性。其中含有每一种元素的localizationID
(对应的中文字符串可以在strings
中找到),比热容,光吸收率等属性。strings
: 游戏内出现的各种文字。在尝试理解代码时很有帮助,因为它可以把 context 对应到文字(比如代码中的STRINGS.BUILDINGS.PREFABS.LADDER.DESC
对应到中文就是 "(那意味着他们能在上面爬。)")。该文件也是本 wiki 所有译名的来源。templates
: 游戏内的结构,有些会在worldgen
中被用到。worldgen
: 世界生成信息。
资产[ | ]
OxygenNotIncluded_Data
文件夹下的一系列 .assets
文件包含有所有的美术资源和部分的平衡数据。这些文件可以使用 Unity Assets Bundle Extractor 或是 AssetStudio 打开。提示:在 Unity Assets Bundle Extractor 中,您可以使用鼠标从右侧开始拖动开框选多个需要批量提取的文件,或者使用 Ctrl
或 Shift
与鼠标左键或方向键搭配。
资产提取器可以将纹理提取为 png 图像,这对于获取 Wiki 上使用的资源很有用。你也许会发现提取出的图片每一张中都包含多个对应物体的组件(比如哈奇对应的图片中有很多不同样子的哈奇的腿)。与 TextAsset 中的 *_anim
和 *_build
结合使用后,这些组件可以用来重建更复杂的纹理并重播动画。通过一个(国人大神开发的)工具[1],每三个对应的文件(png,anim,build)可以生成一个 .scml
项目。这个项目可以在 Spriter 中打开(它的基本版(Essential Edition)可以从 steam 中的 Don't Stave Mod Tools 中免费获得),并可以导出一系列对应的 png 文件。专业版(Pro Edition)的 Spriter 可以直接导出 gif 动图[2]。
*_anim
和 *_build
可能是一种 科雷的专用格式,经检查似乎与他们在饥荒(联机版)中使用的格式相似。在 Assembly-CSharp-firstpass.dll
文件中的KAnim
有可能含有此格式的更多信息。这个为饥荒开发工具可能可以作为起点来开发一个供缺氧使用的工具并用它来解读这些 anim
和 build
文件。
注意,有些纹理的名称可能不那么显而易见。比如 cuprite 代表铜矿(copper ore),CookedEgg 代表煎蛋卷(omelette)。使用配置文件中的 strings
文件可以帮助确定它们的对应关系。另外,大写字母在排序时会排在所有小写字母前面。ID 和资产中的对应名字的大小写有时候不完全相同,比如煎蛋卷的 ID 是 CookedEgg 但是它对应的资产的文件名是 cookedegg 。