《太阳能着陆器》开发日志 #008:实现飞船模组制作
《太阳能着陆器》开发日志#008揭秘:完全自定义飞船系统实现!学习使用gmax建模、Json文件定义属性,了解2D/3D矢量图形与碰撞体制作流程。模组制作指南与最新进展一览。
我休息了大约一个月没有进行游戏开发,几周前回归后,基本上完成了实现完全自定义飞船所需的所有工作。以下是当前制作完全自定义飞船的基本流程。
我使用gmax制作2D飞船模型,尽可能贴近原始精灵图来创建精美的2D矢量图形以取代精灵图形。这些2D矢量图形本质上是层层叠加的平面。然后使用max2msh将模型导出为Orbiter网格文件(确保关闭"旋转90度"选项)。
以下是新2D矢量图形的几张截图。

理论上支持3D矢量图形,但我还没有为游戏制作任何3D模型。
对于碰撞体,我以msh文件为参考创建了一个文本文件来定义碰撞体形状。目前没有在建模程序中定义形状的便捷方法,因此必须手动定义。
《太阳能着陆器》无法读取Orbiter网格文件,因为它将有自己的网格格式(和文件扩展名)。所以我必须转换max2msh生成的msh文件。为此我制作了一个转换工具。《太阳能着陆器》模型文件将支持2D和3D网格,以及圆形、矩形和多边形碰撞体。
我制作的工具将接收代表2D模型的msh文件、可选的代表3D模型的msh文件,以及可选的代表碰撞体的文本文件。如果一切正常,它将生成可在游戏中使用的模型文件。这个工具的局限性在于无法为模型创建场景图。我还不确定如何创建一个通用工具来制作场景图。这需要等到开发后期才能实现。
对于2D几何图形,Z坐标用于控制层级。X正方向向右,Y正方向向上。在gmax中,Z坐标较高的对象将显示在Z坐标较低的对象上方。如果在导出网格时不小心开启了"旋转90度"选项,所有三角形将被压缩成无限细的线。
对于3D几何图形,坐标系相同。X正方向向右,Y正方向向上,Z正方向朝向摄像机。请注意,3D几何图形纯粹是视觉上的。物理效果始终是2D的。但会有设置可以在2D和3D图形之间切换。
当然,需要max2msh只是临时解决方案,直到我能制作自己的导出器,只导出与《太阳能着陆器》相关的数据。不过从建模程序导出的内容仍将是纯文本文件,因此可以轻松手动定义模型。但希望到模组更新发布时,这个中间文件不再是Orbiter msh文件。
《太阳能着陆器》不支持模型纹理。所有模型外观都由纯色定义。
最初,我打算用INI文件定义飞船属性。但由于INI文件的局限性,我决定改用Json文件。不仅飞船在Json文件中定义,各种飞行器组件,如推进器和对接端口,也可以有自己的Json文件。飞船文件可以引用这些其他文件,游戏将使用它们组装最终飞船。这些配置文件还可以引用各种效果的音频文件,例如碰撞声。
我实现的功能之一是连接点的分离力。这将在与主体分离时将物理对象彼此推开。我还发现了一个有趣的错误,在世界原点附近会产生扭矩,并修复了它。这也消除了横向平移推进器的扭矩,这个现象我一直无法理解。我还实施了物理更新的修复,但物理更新中这个错误的原因不仅仅是模组更新中的那一行代码。
对于模组更新,用于计算线性力产生扭矩的参考线构建不正确。这就是导致问题的全部原因。物理更新中的参考线也构建不正确。但在物理更新中,飞船与主体分离后,其质心也没有正确更新。因此参考线修复不足以解决横向平移推进器在飞船上产生扭矩的问题。
我还在考虑为火箭添加射线投射,对直接位于火箭排气路径上的任何飞行器施加力。不过我需要测试这方面的性能。如果我决定保留这个功能,我完全期待玩家在竞技多人游戏中将其武器化。
另外,在之前的说明中,我提到将有两个模组:"SolarLander/BuiltIn"和"SolarLander/Base"。后来我改变了主意。仍然会有"SolarLander/BuiltIn"模组,但不会有"SolarLander/Base"模组。相反,将有一个"SolarLander/Example"模组,既作为示例又为游戏添加一些新内容。我还计划制作一个工坊示例模组,既开放工坊又引入一些新内容。
下一步将是定义级间连接和分离设置的文件,并将飞行计算机重新设计得更灵活。飞行计算机需要进行重大重构,以便既能(a)添加更多驾驶辅助功能,又能(b)让用户编写自己的程序。飞行计算机还需要能够同时运行多个程序。从技术上讲,当前系统可以做到这一点,但它并不是真正运行离散的"程序"。
另外,到本次更新发布时,新模组系统的音效可能完全实现,也可能没有完全实现。如果是这种情况,我将继续努力。音频的一个问题是Unity没有任何通用函数在运行时加载音频。Unity拥有的所有资源加载函数都要求它们位于特定文件夹中,这与《太阳能着陆器》的模组系统不兼容。
此外,商店和库页面上的几乎所有徽标都需要更新以反映对游戏所做的更改。目前,它只显示精灵图形。但当模组更新发布时,我希望它显示新的2D矢量图形。




