太空工程师指南-武器改装支持-
人族狙击手
2026年01月21日 22:15
收录于文集
共16篇

浏览到最底部。有浏览器截图合并的长截图。

武器改装支持

概述

本指南将解释如何创建和实施你自己的武器设计到游戏中。目前,可以为所有类型的应用(大型船只、小型船只、角色)创建任何类型的火箭或投射武器。你还可以创建你自己的弹药类型。欲了解更多信息,请参阅附带的信息。

重要提示:您的模组必须有唯一的子ID!!!!

请在制作新模组时,在模组名称的末尾添加你的昵称

示例模组:小型船只狙击步枪

我们为您创建了一个模组,这可以作为您设计的起点。它几乎激活了所有功能,未激活的功能将在未来添加。

MOD链接:http://steamcommunity.com/sharedfiles/filedetails/?id=337637515

目前这个模组包括: – 小型船只狙击步枪模型 – 2种弹药:低速高伤害,高速低伤害 – 源文件(fbx, hkt, xml)

目前此模组不包括: – 这不是一个生存模组(缺少建筑组件和正确的组件成本)

武器改装支持 1/3

模组制作者可以通过修改其定义中的值来创建新的枪械(用于角色和船只)或炮塔。首先,我将为每个新的.sbc文件提供简短的描述。其次,我将展示如何定义新枪械、船只枪械和炮塔的示例。我还将解释与武器模组相关的属性和字段。

定义被分为三组(文件): – Weapons.sbc – 每个定义包含与枪械/炮塔相关的属性。你可以将它们视为对枪械/方块原始定义的扩展。每种武器可以使用一个或多个弹药杂志。 – Ammos.sbc – 每个定义包含包含在弹药杂志中的弹药属性。同一种弹药可以用于不同的弹药杂志。目前仅支持投射物和导弹类型的弹药。 – AmmoMagazines.sbc – 每个定义提供了弹药杂志的物理描述。它还指定了杂志的容量以及使用的弹药类型。

通过这种层次结构,模组制作者可以通过修改前面提到的文件中的常量来定义新的武器种类。一个武器定义可以指定一个或多个与之兼容的弹药杂志。一个弹药杂志只使用一种类型的弹药。弹药可以是投射物或导弹类型(不能同时是两者)。该层次结构使得在多个武器定义之间共享不同的弹药杂志成为可能。模组制作者还可以定义相同弹药但容量不同的弹药杂志,或者创建一个既能发射导弹又能发射投射物的武器。 首先,让我们看看两个弹药定义:

<弹药 xsi:type="MyObjectBuilder_ProjectileAmmoDefinition"> <Id> <TypeId>AmmoDefinition</TypeId> <SubtypeId>CoolProjectileAmmo</SubtypeId> </Id> <基础属性> <期望速度>300</期望速度> <速度偏差>0</速度偏差> <最大轨迹>1000</最大轨迹> <后坐力>3.2</后坐力> </基础属性> <弹药属性> <弹药撞击冲量>3.2</弹药撞击冲量> <弹药质量伤害>12</弹药质量伤害> < <弹道特效比例>0.1</弹道特效比例>伤害值>12</伤害值> <弹道特效颜色 x="1.0" y="1.0" z="1.0" /> <弹道特效概率>0.5</弹道特效概率> </弹道特效属性> </弹药>

<Ammo xsi:type="MyObjectBuilder_MissileAmmoDefinition"> <Id> <TypeId>AmmoDefinition</TypeId> <SubtypeId>CoolMissileAmmo</SubtypeId> </Id> <BasicProperties> <DesiredSpeed>700</DesiredSpeed> <SpeedVariance>0</SpeedVariance> <MaxTrajectory>2000</MaxTrajectory> <IsExplosive>true</IsExplosive> <BackkickForce>700</BackkickForce> </BasicProperties> <MissileProperties> <MissileMass>45</MissileMass> <MissileExplosionRadius>4</MissileExplosionRadius> <导弹模型名称>ModelsWeaponsProjectile_Missile.mwm</导弹模型名称> <导弹加速度>600</导弹加速度> <导弹初始速度>100</导弹初始速度> <导弹跳加速度>false</导弹跳加速度> <导弹爆炸伤害>500</导弹爆炸伤害> </导弹属性> </弹药>

弹药可以分为两种类型:弹丸(子弹)和导弹。需要为每种弹药指定类型。您可以在打开的&Amp;gt;Ammo&Amp;lt;标签中通过添加“xsi-type”属性来实现这一点。对于弹丸弹药,它是“MyObjectBuilder_ProjectileAmmoDefinition”,对于导弹弹药,它是“MyObjectBuilder_MissileAmmoDefinition”。 弹药定义的第一个字段是<Id>,它指定了弹药定义的唯一标识符。下一个字段<BasicProperties>在弹丸和导弹弹药类型之间共享。它包括以下字段: <DesiredSpeed> – 弹药可以具有的最大速度, <SpeedVariance> – 速度的方差, <MaxTrajectory> <IsExplosive> – 定义由这种弹药组成的弹药箱在对你造成伤害时是否应该爆炸。 <BackkickForce> – 使用这种弹药射击时施加的力量。 接下来的字段 <ProjectileProperties> 和 <MissileProperties> 如其名所述,是特定类型弹药的专属字段。弹药特性标签包含以下字段: <ProjectileHitImpulse> – 被此弹药击中时的冲量, <ProjectileMassDamage> – 对非生物(方块等)施加的伤害, <ProjectileHealthDamage> – 对角色施加的伤害, <ProjectileTrailScale> – 子弹轨迹的缩放比例, <ProjectileTrailColor>– 子弹痕迹的颜色, <ProjectileTrailProbability> – 规定出现轨迹的几率。 导弹属性标签具有以下字段: <MissileMass> – 导弹的质量, <MissileExplosionRadius> – 导弹的爆炸半径, <MissileModelName> – 导弹的模型名称及路径, <MissileAcceleration> – 导弹的加速度, <MissileInitialSpeed> – 导弹的初始速度, <MissileSkipAcceleration> – 导弹是否具有加速度, <MissileExplosionDamage> – 导弹制造的爆炸伤害。

武器的模组支持 2/3

现在,我们需要为每种弹药定义定义弹药库定义:

<弹药杂志> <ID> <类型ID>弹药杂志</类型ID> <子类型ID>冷却弹丸弹药杂志</子类型ID> </ID> <显示名称>DisplayName_Item_NATO_25x184mm</显示名称> <图标>TexturesGUIIconsammoAmmo_http://Box.dds</图标><X>0.25</X> <Y>0.2</Y> <Z>0.2</Z> </尺寸> <质量>35</质量> <体积>16</体积> <模型>Models Weapons Ammo_Box.mwm</模型> <容量>140</容量> <AmmoDefinitionId Subtype="CoolProjectileAmmo" />

<弹药杂志> <ID> <类型ID>弹药杂志</类型ID> <子类型ID>冷却导弹弹药杂志</子类型ID> </ID> <显示名称>DisplayName_Item_Missile200mm</显示名称> <图标>TexturesGUIIconsammoSmall_http://Rocket.dds</图标><X>1.2</X> <Y>0.2</Y> <Z>0.2</Z> </尺寸> <质量>45</质量> <体积>60</体积> <模型>ModelsWeaponsProjectile_Missile.mwm</模型> <容量>1</容量> <AmmoDefinitionId Subtype="CoolMissileAmmo" />

每个弹药杂志定义包含以下字段: <Id> – 在不同定义中,弹药杂志的唯一标识符, <DisplayName> – 弹药杂志的显示名称, <Icon> – 弹药杂志在库存中显示的图标, <Size> – 弹药杂志在世界中的大小, <Mass> – 弹药杂志的质量, <Volume> – 弹药杂志的体积, <Model> – 弹药杂志的模型(不是弹药), <Capacity> – 一个弹药杂志中储存的弹药量, <AmmoDefinitionId> – 存储在此弹药杂志中的弹药定义的id。

到目前为止一切顺利?现在,让我们用我们全新的弹药杂志来定义武器定义:

<武器> <ID> <类型ID>武器定义</类型ID> <子类型ID>酷炫多功能武器</子类型ID> </ID> <投射弹药数据 开火速率="600" 射击音效名称="WepPlayRifleShot" /> <导弹弹药数据 开火速率="60" 射击音效名称="WepShipSmallMissileShot" /> <无弹药音效名称>WepPlayRifleNoAmmo</无弹药音效名称> <偏移射击角度>10</偏移射击角度> <射击后释放时间>250</射击后释放时间> <枪口闪光持续时间>40</枪口闪光持续时间> <弹药弹匣> <弹药弹匣 子类型="酷炫投射弹药弹匣" /> <AmmoMagazine Subtype="CoolMissileAmmoMagazine" /> </AmmoMagazines> </武器>

每个字段的描述: <Id> – 在不同定义中武器定义的唯一标识符, <ProjectileAmmoData> – 包含此武器使用的弹药属性。 “RateOfFire” 属性定义武器的射速。 值是每分钟的轮数。“ShootSoundName” 属性指定开火时播放的声音名称, <MissileAmmoData> – 包含此武器使用的导弹弹药属性, <NoAmmoSoundName> – 当我们尝试开火时没有弹药时播放的声音名称, <DeviateShotAngle> – 用于武器的扩散。 值是度。 <ReleaseTimeAfterFire> – 规定武器应在多长时间后停止播放射击声音。值以毫秒为单位。 <MuzzleFlashLifeSpan> – 规定枪口火焰应持续多久。值以毫秒为单位。 <AmmoMagazines> – 定义与武器兼容的弹药弹匣列表。“Subtype”属性对应于AmmoMagazine.sbc文件中指定弹药弹匣定义的“SubtypeId”属性。

武器改装支持 3/3

如你所见,我们的武器定义由两种弹药杂志类型组成。因此,我们必须定义<ProjectileAmmoData>和<MissileAmmoData>字段。没有这些字段,我们的模组将无法工作。如果我们的武器定义只使用投射弹药杂志,我们就无需包括<MissileAmmoData>字段。对于只使用导弹的武器同样适用此规则。 好的,现在我们能够将这个武器定义附加到某些物体上了。对于角色的枪械,我们必须定义一个新的物理物品物体(PhysicalItems.sbc)。对于船只的枪械或炮塔,我们必须定义一个新的立方体物体。让我们从物理物品开始:

<PhysicalItem xsi:type="MyObjectBuilder_WeaponItemDefinition"> <Id> <TypeId>PhysicalGunObject</TypeId> <SubtypeId>CoolVersatileGun</SubtypeId> </Id> <DisplayName>Cool Versatile Gun</DisplayName> <Icon>http://TexturesGUIIconsWeaponAutomaticRifle.dds</Icon>> <X>0.8</X> <Y>0.24</Y> <Z>0.08</Z> </Size> <Mass>3</Mass> <Volume>14</Volume> <Model>ModelsWeaponsAutomaticRifle.mwm</Model> < </物理物品>武器定义ID 副类型="冷酷多功能武器" />

定义新武器的重要字段和属性: “xsi:type” 属性在 <PhysicalItem> 标签中 – 必须设置为 “MyObjectBuilder_WeaponItemDefinition”, <TypeId> 的 Id 必须是 “PhysicalGunObject”, <WeaponDefinitionId> – 应指向特定的武器定义。 别忘了将新创建的物理项目添加到正确的类别中(见 BlockCategories.sbc)。

让我们用我们的武器定义(CubeBlocks.sbc)来定义炮塔和舰船火炮:

对于炮塔: <Definition xsi:type="MyObjectBuilder_LargeTurretBaseDefinition"> <Id> <TypeId>InteriorTurret</TypeId> <SubtypeId>CoolInteriorTurret</SubtypeId> </Id> …教程中忽略了一些字段(查看 CubeBlocks.sbc 中的 InteriorTurret 定义)… <BlockPairName>CoolInteriorTurret</BlockPairName> <WeaponDefinitionId Subtype="CoolVersatileWeapon" /> <InventoryMaxVolume>0.384</InventoryMaxVolume> </Definition>

对于舰船武器: <定义 xsi:类型="MyObjectBuilder_WeaponBlockDefinition"> <ID> <类型ID>小型加特林枪</类型ID> <子类型ID>酷加特林枪</子类型ID> </ID> …教程中忽略了一些字段(查看 CubeBlocks.sbc 中的小型加特林枪定义)… <块对名称>酷加特林枪</块对名称> <武器定义ID 子类型="酷多功能武器" /> <库存最大体积>0.064</库存最大体积> </定义>

定义新舰炮/炮塔的重要字段和属性是: <Definition> 标签中的 “xsi:type” 属性 – 对于炮塔,必须设置为 “MyObjectBuilder_LargeTurretBaseDefinition”。对于舰炮,必须设置为 “MyObjectBuilder_WeaponBlockDefinition”, <TypeId> 的 Id – 必须是以下之一:对于炮塔为 “InteriorTurret”、“LargeMissileTurret”、“LargeGatlingTurret”。对于舰炮为 “SmallGatlingGun”、“SmallMissileLauncher”、“SmallMissileLauncherReload”, <WeaponDefinitionId> – 应该指向特定的武器定义, <InventoryMaxVolume> – 对于炮塔和舰炮,重要的是指定其库存的体积。

不要忘记将新创建的舰炮/炮塔添加到正确的类别中(见BlockCategories.sbc)。同时,不要忘记在<BlockPairName>字段中设置正确的值。 当使用角色的枪械或舰船的枪械,并且有多个弹药盒时,你可以切换它们。为此,你必须选择一个武器并将其绑定到某个工具栏按钮上。然后,你需要点击相应的按钮以切换到下一个弹药盒。你不能在炮塔上切换弹药盒,它们会自动切换。

改造炮塔

通过最新的补丁,我们引入了一种在武器中定义假人的新方法。每当你创建一个新的枪支/炮塔时,应该在每个枪口的末端放置一个假人。通过这一改变,现在可以定义导弹/弹丸的生成点和方向。因此,除了定义假人的位置,你还需要记住它的旋转。假人的名称应为“muzzle_projectile”(用于弹药)和“muzzle_missile”(用于导弹)。为了未来的参考,请查看此模组中包含的模型。

目前你无法手动切换炮塔的弹药盒。当炮塔的某一种弹药盒用完时,它会自动切换到下一个可用的弹药盒。

如何为炮塔准备模型: – 对于炮塔来说,正确的位置放置假人和枢轴非常重要,否则由于子部件的加载错误,您将无法在游戏过程中放置炮塔 – 下载这个用于3Ds max的脚本,它将帮助您将假人附加到物体上 https://steamsolo.com/guide/modding-support-for-weapons-space-engineers/。这个脚本也有助于跟踪使用了哪些假人及其位置。 – 还请下载并解压mod https://steamsolo.com/guide/modding-support-for-weapons-space-engineers/,以找到我在图片中展示的所有模型 – 我建议您首先设计炮塔,然后将其切割成所需的部件,最后使用以下规则使其在游戏过程中生效 – 有关假人和部件的正确名称,请参见附带的图片

1. 转塔底座 – 伪件:传送带伪件,水平轴子部件伪件 – 定义转塔的尺寸,然后放置相应的底座模型 – 需要注意的是,尺寸需要考虑转塔的移动,因为碰撞模型只能在由立方体定义的区域内工作。立方体区域外的碰撞模型是不工作的,你将能够穿过其他物体。 – 当你准备好转塔的底座部分时,设置传送带和子部件的伪件 – 子部件是非常重要的伪件,并且在它的定义中必须包含下一个部件的名称(见红色方框) – 使用脚本工具将伪件分配给对象

2. 水平轴部分 – 假人:垂直轴的虚拟部件 – 0 0 0 (xyz) 在游戏中加载时将被 snap 到基础模型的虚拟部件上,确保 000 在你需要的地方 – 0 0 0 位置对于所有其他子部件都是一样的 – 将下一个子部件虚拟部件放置到该位置

3. 枪体 用于火箭发射器 – 仿制品:摄像头仿制品、枪口仿制品和枪管仿制品 – 在火箭发射器的情况下,这是炮塔的最终部件,应包含列出的所有仿制品才能正常工作

对于加特林机枪 – 伪像:摄像头伪像,枪管的子部件 – 在加特林机枪的情况下,这作为机枪的主体,并附带摄像头

虚拟模型: – 机枪虚拟模型 定义了玩家在控制炮塔时的视角位置 – 火口虚拟模型 置定了弹丸飞行的起点 – 炮管虚拟模型 放置粒子特效,应与火口位于同一位置

4.枪管部分——在加特林枪的情况下

–假人:枪口和枪管假人

-这是旋转的加特林炮塔的最后一部分

武器的改装音效

1) 声音文件格式

3D 对比 2D

更多的声道(立体声)并不总是更好的。

  • 3D 声音是与某个实体或空间中的某个位置绑定的声音。这些声音必须是单声道的。使用超过 1 个通道会导致播放损坏。

  • 2D 声音是指像音乐或 HUD 声音这样的声音。这些声音可以使用立体声。不建议使用超过 2 个通道。

转换中

我们的声音文件主要使用Wmaudio2编码。有一个例外,那就是循环声音,我们使用Adpcm编码,因为它支持循环播放。

要将你的 .wav 声音文件转换为 Wmaudio2,只需使用我们 Mod SDK 中的 xWMAEncode.exe。 示例:

xWMAEncode.exe MySound.wav MySound.xwm

要将你的 .wav 声音转换为 Adpcm(用于循环),只需使用我们 Mod SDK 的 AdpcmEncode.exe。 示例:

AdpcmEncode.exe -b 512 MySound.wav MySound.xwm

注意:“-b 512”可能会给你更好的压缩比,但不是必需的。

这是你的责任,使循环声音的结尾和开头之间的过渡无缝且没有“弹跳”。

所有使用的音效必须使用“xwm”扩展。

2) 例子

让我们为狙击模式添加射击音效。

我们需要做三件事:

  • 创造我们想要播放的声音。

  • 为这个声音创建音频定义。

  • 使武器使用此音频定义。

创造声音

我们想使用3D音效。这意味着我们需要单声道音效(只有一个声道)。在这种情况下,我们不会使用循环音效,因为我们的射速只有每分钟15发。如果我们的射速很高,我们会使用循环音效。我们的音效长度应该为4秒(每分钟15转)。

既然我们已经有WepSniperFire.wav声音文件,我们所需要做的就是将其导出为xwm。由于我们不需要循环功能,我们将使用Wmaudio2编码,通过我们Mod SDK工具的一部分xWMAEncode.exe来实现。

F:>xWMAEncode.exe WepSniperFire.wav WepSniperFire.xwm 将352800字节的44kPcm16位单声道数据编码为xWMA(比特率48000)

创建音频定义

让我们看看我们的音频定义将是什么样子

<?xml version="1.0"?> <Definitions http://xmlns:xsi="http//www.w3.org/2001/XMLSchema-instance%22 http://xmlns:xsd="http//www.w3.org/2001/XMLSchema%22%3E <Sounds> <Sound> <Id> <TypeId>AudioDefinition</TypeId> <SubtypeId>WepSniperShot</SubtypeId> </Id> <Category>WEP_SHIP</Category> <MaxDistance>2000</MaxDistance> <Volume>1.00</Volume> <Loopable>false</Loopable> <Waves> <Wave Type="D3"> <Start>AudioWepSniperFire.xwm</Start> </Wave> </Waves> </Sound> </Sounds> </Definitions>

让我们看看定义中的一些重要部分:

<SubtypeId>WepSniperShot</SubtypeId>

这是我们用来识别我们声音的独特音频定义ID。

<可循环>false</可循环>

我们不想让这个声音循环播放。

<波> <波类型="D3"> <开始>AudioWepSniperFire.xwm</开始> </波> </波>

在这里我们定义将要用于音频定义的文件。Type="D3" 表示我们正在定义一个3D音效文件。

创建武器定义

我们现在只需要告诉狙击手使用这个声音。

这是我们武器定义的样子:

<?xml version="1.0"?> <Definitions http://xmlns:xsi="http//www.w3.org/2001/XMLSchema-instance%22 http://xmlns:xsd="http//www.w3.org/2001/XMLSchema%22%3E <Weapons> <Weapon> <Id> <TypeId>WeaponDefinition</TypeId> <SubtypeId>SniperRifleStatic</SubtypeId> </Id> <ProjectileAmmoData RateOfFire="15" ShootSoundName="WepSniperShot" /> <NoAmmoSoundName>WepPlayRifleNoAmmo</NoAmmoSoundName> <DeviateShotAngle>0</DeviateShotAngle> <ReleaseTimeAfterFire>4000</ReleaseTimeAfterFire> <MuzzleFlashLifeSpan>40</MuzzleFlashLifeSpan> <AmmoMagazines> <AmmoMagazine Subtype="SniperRoundHighSpeedLowDamage" /> <AmmoMagazine Subtype="狙击弹低速高伤害" />

让我们看看定义中的一些重要部分:

<ProjectileAmmoData RateOfFire="15" ShootSoundName="WepSniperShot" />

在这里,我们告诉武器使用我们的音频定义“WepSniperShot”作为射击声音,并以我们之前提到的每分钟15发的射速。

<火灾后释放时间>4000</火灾后释放时间>

ReleaseTimeAfterFire 应该是声音的长度,以毫秒为单位。声音将在最后一发射击后给定的时间内自动停止播放。

有了我们狙击手的所有准备。

本篇好像不完整还有一个16.是关于火箭弹需要在炮口设置出口否则游戏不知道从哪里发射炮弹。以下是AI帮我补充的。

结合你提到的 “火箭弹炮塔炮口设置” 需求,

以及之前官方武器 MOD 指南(含你提供的核心文档)和新搜索结果,

火箭弹炮塔的炮口关键设置是 “特定名称的虚拟对象(Dummy)”——

这是游戏识别火箭弹发射点、方向及粒子效果的核心,具体规则如下:

一、火箭弹炮塔炮口必须设置的核心元素:muzzle_missile虚拟对象(Dummy)

根据官方武器 MOD 指南

(你之前参考的https://steamsolo.com/guide/modding-support-for-weapons-space-engineers/)

及搜索到的《Official Guide: Modding guide for new turret features》(摘要 3),

火箭弹(导弹类弹药)炮塔的炮口需在 3D 模型中添加命名为 “muzzle_missile” 的 Dummy,

其作用是定义 “火箭弹从哪里发射”“向哪个方向飞行”,具体要求如下:

1. 命名规则:严格匹配,不能错

火箭弹(导弹)炮塔炮口 Dummy 必须命名为 muzzle_missile(全小写,下划线连接);

(对比:子弹类炮塔炮口 Dummy 命名为muzzle_projectile,两者不能混用,否则火箭弹会从错误位置发射或方向偏移)。

2. 位置要求:精准对应炮口末端

Dummy 需放在火箭发射管的物理炮口最末端(即火箭弹实际 “飞出” 的位置),若位置太靠后,

会出现 “火箭弹在发射管内爆炸” 的 bug;若太靠前,会显得 “火箭弹凭空出现”。

3. 旋转方向:与炮口朝向一致

Dummy 的 “正方向”(通常是 3D 软件中的 + Y 轴)必须完全对齐炮口的发射方向(比如炮口水平朝前,

Dummy 的 + Y 轴也需水平朝前),否则火箭弹会 “斜着发射”“反向发射”,导致无法命中目标。

二、火箭弹炮塔炮口的补充设置:barrel Dummy(可选但推荐)

除了muzzle_missile,官方指南还提到火箭弹炮塔可额外添加 barrel命名的 Dummy

作用是 “绑定火箭发射时的粒子效果(如烟雾、火焰)”,让发射动画更真实:

位置:需与muzzle_missile完全重叠(粒子效果从炮口同步出现);

作用:若不添加barrel Dummy,火箭弹发射时可能只有弹体,没有火焰 / 烟雾特效,影响视觉体验。

三、避坑提醒:避免火箭弹发射异常的关键

Dummy 不能遗漏:若炮口未添加muzzle_missile,游戏会无法识别发射点,导致 “炮塔有音效但无火箭弹射出”;

与弹药类型匹配:确保炮塔绑定的弹药是 “导弹类”(Ammos.sbc 中xsi:type为MyObjectBuilder_MissileAmmoDefinition),

若绑定成 “子弹类”,即使加了muzzle_missile也无效;

多发射管需多 Dummy:若炮塔有多个火箭发射管(如 4 联装火箭炮塔),需为每个发射管的炮口单独添加 1 个muzzle_missile

(命名可加序号,如muzzle_missile_1、muzzle_missile_2),避免多管同时发射时火箭弹从同一位置挤出。

以上内容均来自官方 MOD 制作指南的核心规则,也是解决 “火箭弹炮塔发射异常” 的最常见要点 ——

若你在 3D 建模(如 Blender、3Ds Max)时按此设置炮口 Dummy,就能确保火箭弹正常发射。

以下是网页截图翻译1-15+16AI补充的火箭弹设置