
本指南将极其详细地讲解如何使用自定义动画创建武器、近战武器、物品等内容。 包含两个预制件。 前言 在开始之前,我想说明一下,Steam有时会自行删除图片。 如果某些地方我提到了图片但实际没有显示,我深表歉意。 如果发生这种情况,请告诉我,因为我无法每天都盯着这个页面检查。 我知道本指南确实非常非常长,但为了容纳所有信息,不得不如此。 实际制作工作只需不到两天时间。因此,你可以在周末完成一个模组。 如果在动画制作上投入更多精力关注细节,实际所需时间会有所不同。本指南涵盖以下内容:修复已反编译的Valve武器模型以实现动画效果、为任意武器模型制作动画、制作视图模型和世界模型、HUD图标、声音(作为单独的视频教程)。注意:如果您想使用现有动画制作模组,请查看另一篇指南!此方法适用于默认动画和重新动画的模组,还可以完全跳过修复动画的步骤。您需要:工具:Blender 2.8或更新版本,用途:建模和动画;Blender Source Plugins,用途:在Blender中导入/导出Valve模型格式。Blender IK与HUD预制件:包含带有IK骨骼的Blender保存文件,用于制作枪支动画,其中还包含一个【Hud Icon Render】预制件。 可选预制件:这是一套由我预先制作的第一人称模型QC文件,只需少量编辑即可使用。 求生之路2创作工具(来自Steam工具库):包含编译模型、在游戏外测试模型以及打包发布插件所需的软件。 可选工具GCFScape:用于解包VPK文件,以获取原始模型进行反编译(Crowbar也可实现此功能)。 Crowbar:可解包VPK文件以获取原始模型进行反编译,具备模型反编译功能和模型编译用户界面。打包插件的用户界面。 发布插件的用户界面。 任何文本编辑器。 推荐:记事本++ 用于编辑QC文件,该文件用于编译模型。 记事本++的VDF语言 具备语法高亮功能,使QC编辑更加轻松。 VTFEdit 将纹理转换为《求生之路2》使用的格式。 如果需要编辑纹理,可以使用Photoshop、GIMP或Paint.NET,并配合VTF插件。 Photoshop的VTF插件 仅适用于32位版本的Photoshop。 GIMP的VTF插件 Paint.NET的VTF插件 获取原始武器文件 在本指南中,我将制作一个手枪模组,但所有武器的制作流程完全相同。 (是的,所有武器都是如此。)即便是近战武器、医疗包、可乐、地精、汽油桶…… 只需跟着操作并认真学习,就能了解如何编辑任何武器。 1.0首先,我们需要获取想要编辑的武器的第一人称模型和第三人称模型。 《求生之路2》有多个模型存放位置,且这些位置下还有多个子文件夹。 前往游戏文件夹。你可以在库中右键点击游戏,选择【属性】,然后在【本地文件】选项卡中点击【浏览本地文件】。

打开“Update”文件夹,使用GCFScape或Crowbar打开Pak01_Dir.vpk文件。 枪支世界模型位于“models w_models weapons”路径下。 枪支第一人称模型位于“models v_models”路径下。 近战武器和gnome模型位于“models weapons melee”路径下。 CSS刀具模型与枪支模型一同位于w_models和v_models路径下。 可携带物理道具的路径有所不同,具体如下: props_equipment/oxygentank01.mdl props_junk/explosive_box001.mdl props_junk/gascan001a.mdl props_junk/propanecanister001a.mdl 大多数武器的名称都比较直观,但部分武器的名称较为特殊,以下列出这些特殊名称,以帮助你找到所需模型。武器 模型名称 手枪 v_pistola v_dual_pistola w_pistol_a w_pistol_a_dual w_pistol_b 木质泵动式霰弹枪 v_pumpshotgun w_shotgun 镀铬泵动式霰弹枪 v_shotgun_chrome w_pumpshotgun_a 自动霰弹枪(贝内利M4) v_autoshotgun w_autoshot_m4super 步枪(M16A2) v_rifle w_rifle_m16a2 沙漠步枪(SCAR) v_desert_rifle w_desert_rifle 冲锋枪 v_smg w_smg_uzi 消音冲锋枪 v_silenced_smg w_smg_a 猎枪 v_huntingrifle w_sniper_mini14 反恐精英:起源刀具 v_knife_t w_knife_t 不过并非所有物品都在【更新】中。如果你找不到需要的物品,请依次检查DLC3、DLC2、DLC1,最后检查求生之路2。 如果任何模型有更新,更新文件会放在更新文件夹中。 但我不知道是否会更新以及何时更新,所以最好逐个检查。 通过选择世界模型和视图模型,并将文件从GCFScape或Crowbar拖到你选择的文件夹中,来提取它们。


你需要MDL、VTX、VVD文件。可选的是用于世界模型碰撞的PHY文件,但你其实并不需要。因为在线游戏会强制客户端使用原始碰撞数据。

1. 使用Crowbar反编译模型。

红色部分适用于所有模型。 绿色部分仅为视图模型所需,但你仍可以为世界模型反编译动画,之后再将其删除。 世界模型也有物理网格,你可以对其进行编辑,但在线游玩时会忽略这些网格。因此我不会勾选【物理网格SMD文件】选项。 你将获得一个包含所有源内容的文件夹。

修复视图模型设置 此步骤仅在你想要重新制作原版Valve武器动画时需要。 如果你计划制作自己的动画,请跳至步骤3.0。 武器很可能会看起来混乱不堪,因为部件散落在各处。 这会导致无法进行动画制作,甚至无法将你的武器绑定到此骨骼集。

2.0选择武器的骨架,并导入解包后的待机动画序列。不一定必须是待机动画,任何能让枪械“组装完成”的动画均可。

在姿态模式下,使用右侧的大纲视图选择武器骨骼。

将这块骨头移到旁边。

同时将所有身体骨骼添加到选择中

清除所选骨骼的所有变换

现在枪看起来像是被重新组装好了。但还不要退出姿势模式!

移动并旋转枪骨,使其指向前方,远离所有身体骨骼。

检查所有角度,确保武器确实是直的。这把冲锋枪尽管从参考姿势开始在所有轴向上仅旋转了90度,但仍然是歪斜的。这可能是该枪械在制作动画时产生的问题。

旋转枪支,直到枪支本身看起来是直的。或者至少达到你想要的笔直程度,因为之后你会对其进行动画处理。2.4退出姿态模式,进入网格物体的修改器选项卡。应用其现有的骨架修改器。

现在既然这个模型已经重新组装好了,删除所有骨骼。 现在你可以导出这个模型,以便在下一步将其导入到预制件中。 装配第一人称视角模型 3.0打开可下载预制件中的Blender保存文件。 你会看到我已经加载了AK47。

AK47是占位模型和比例参考,用于帮助你确定武器模型的大小。 3.1 将你的武器模型导入此blend文件。 模型可能会被导入到“Arm Collection”(手臂集合)中,只需将它们移出即可。


3.2 移动并缩放你的模型,直到握把大小与AK47的握把大致相同。如果你在之前的部分中修复了原版Valve武器,那么它的尺寸已经是正确的。

你也可以通过“创建新骨架”导入原始视图模型,删除导入的骨架,然后直接使用原始网格来调整你的枪支比例。


3.3删除AK47模型,或者你导入的原始枪支模型(如果你已导入)。从现在开始,我们只需要你将要制作动画的那个枪支模型。在物体模式下,选择你缩放后的模型并应用所有变换。

3.4现在你可以在骨架编辑模式下,将所有武器骨骼移动到你希望它们在枪支上的位置! 注意:【Weapon.A.Shell】、【Weapon.A:Flashlight】和【Weapon.A.Muzzle】是可选的配件骨骼。你可以决定配件应该附加到哪个骨骼上。例如,这允许你在霰弹枪上安装泵动式手电筒。只需将【Weapon.A:Flashlight】重新父级到枪机,或你自己创建的任何泵动骨骼上,然后将配件骨骼移动到你想要的位置。 近战武器也有更多用于近战模糊效果和“刀刃”位置的配件。每种近战武器的模糊效果配件设置位置似乎都有所不同。你可以像图中所示那样为这些配件制作骨骼,或者手动将你的视图模型与原始模型进行比较,并在HLMV(半条命模型查看器)中调整配件,直到它们合适为止。

如果需要,你可以添加更多骨骼,或者删除不需要的骨骼。 在任何情况下都绝对不要编辑手臂骨骼。只能编辑武器骨骼。

当你将所有武器骨骼调整到理想位置后,就可以开始为枪支绑定骨骼了。 3.5 - Blender 2.8 1. 选择你的网格物体。 2. 按住【Shift】键,将网格拖到骨架上。 3. 松开鼠标,但继续按住【Shift】键。 4. 此时会弹出“设置父级到”窗口,你现在可以松开【Shift】键。 5. 选择“使用空组”选项。

3.5 - Blender 2.9选择你的网格物体 按住【Shift】键并在3D视图的物体模式中点击骨架。 按下【Ctrl】+【P】 选择【使用空组】。 3.6现在你的枪模型已拥有所有骨骼,可以开始绑定了。 如果你修复并导入了一个Valve的枪模型,列表中可能会有多余的骨骼,请删除它们。 选择你想要绑定到骨骼的网格,先从可移动部件开始,最后处理枪身。 选中网格后,点击【分配】按钮进行绑定。 确保权重设置为1.0。

一旦某个部件完成绑定,按H键将其隐藏,然后继续绑定其他所有松散部件。过一会儿,你将只剩下需要绑定到主枪骨骼上的部件。

按A键选择所有剩余内容,并将其绑定到武器骨骼上。这样做可以确保不会有任何内容同时绑定到两根骨骼上。完成所有绑定后,你可以在骨架上进入姿态模式并移动骨骼。现在你可以检查所有部件是否已正确绑定,不应有任何拉伸现象。我必须绑定扳机骨骼,因为我在之前的图片中忘记了它。

3.7现在你可以检查你的枪支材质是否有合理的名称。只需确保它们没有任何文件后缀或文件夹结构,例如“desktop/myjunk/gun.tga”。

3.8现在你可以将绑定好的武器以SMD格式导出到QC文件所在的同一文件夹中。首先选择要导出到的文件夹,然后按下导出按钮。

动画设置与基础姿势 注意:我希望你已经掌握了动画制作的基础知识,因为我不会讲解基础内容。 在我的预制件中,弹夹骨骼并非枪骨骼的子物体,这样能让换弹动画的制作更简单。 弹夹骨骼通过【子物体约束】来模拟子物体的效果。 拇指根骨骼通过反向运动学(IK)与拇指相连,旋转拇指时会带动拇指根一起旋转。 前臂扭曲骨骼未使用反向运动学,因为我更倾向于对其进行更精确的控制。 除了待机动画外,你可以制作多个版本的动画,但可以制作一些小动作动画来替代。 可以对相机进行动画处理,但仅限旋转操作。不过大多数人并不喜欢这种设置。如果你确实想制作相机动画,请旋转ValveBiped.Camera骨骼。或者添加你自己的内容并制作动画,确保同时为预制件中的Blender相机添加【复制旋转】约束,以正确可视化相机旋转。 4.0转到动画选项卡,将关键帧编辑器更改为动作编辑器。 这样我们就可以将所有动画作为不同动作保存在同一个Blender保存文件中。

创建一个名为【闲置】的新动作。

手上的八面体骨骼是手部IK骨骼。移动它们,其他部分会随之移动。 作为其子物体的球体是肘部辅助骨骼。 如果不希望它们相互父子化,你可以更改父子关系。

制作一个简单的单帧序列,确定你希望枪支的握持位置和方式。使用相机和视野辅助工具来决定枪支的位置。我使用85的视野,所以我会确保枪支在该视野下可见,同时也要在51的视野下有足够的可见度。

别忘了部分玩家会使用非常大的视野范围。所有离开屏幕的物体,比如换弹时的手部和弹夹,都应该移出画面之外。注意最左侧只有部分关键帧吗?我们需要为每根骨骼至少设置一个关键帧。按A键选择所有骨骼,然后按I键为所有骨骼添加关键帧。缺少关键帧可能会导致动画出错。

我们所有的动画都将基于当前这个姿势。不过现在,给手部骨骼和弹夹骨骼添加一个“父子关系”骨骼约束。这样你只需移动武器骨骼,弹夹和手部就会自动跟随。选择右手IK骨骼,进入骨骼修改器选项卡,添加“父子关系”约束。

选择骨架,然后选择武器骨骼。手部会移开,这是正常现象。

按下【反向设置】按钮一次将使手部复位。

现在移动武器骨骼,手部将随之移动。

现在你也可以用左手来操作了。不过我不会这么做,因为左手从来不用。 闲置 4.1现在你可以基于这个基础位置制作闲置动画。 使用大约60或120帧,并加入一些闲置噪点。 最重要的是,所有循环序列的第一帧和最后一帧必须完全相同。 这样就可以了。

顺便说一下,你可以在这里更改帧率。如果你想制作60 FPS的动画的话。更高的帧率只会让游戏内的动画本身更流畅。游戏本身已经做了一些平滑处理,但效果可能有点不稳定。

运行 4.2现在闲置动画已经完成,我们可以制作跑步动画了。 还记得你创建“Idle”动作的位置吗?创建一个新的“Run”动作。 “新建动作”按钮会复制当前使用的动作。 这很方便,因为跑步动画基本上就是一个动作幅度更大的闲置动画。

对于本指南来说已经足够了。
注意:你可以使用两套跑步动作,向前跑和向后跑。或许你甚至可以为侧向移动设计更多动作,但我从未尝试过。 观察姿势 4.3观察姿势是你上下看时看到的混合序列。它们是可选的,但能增加不错的效果。 创建一个名为“观察姿势”的新动作。它只有三帧。 第0帧是“向下看”。 第1帧是你已有的默认闲置基础姿势。 第2帧是“向上看”。 建议只添加非常轻微的移动。动作幅度过大看起来会很奇怪。 我个人会将光标固定在肩膀上作为支点,然后将枪旋转0.5度。

即将推出的动画的帧数信息。 从现在开始,必须使用本指南来检查你的动画需要多少帧。 所有剩余动画必须具有正确的帧数和相应的每秒帧数(FPS)。 【帮助之手循环(helping_hand_loop)】和【物品循环(item_loop)】除外。 查找你正在制作动画的枪械。我正在制作沙漠之鹰(Deagle),所以我要查找手枪/沙漠之鹰(Pistol / Deagle)。 我接下来要制作的动画是开火(Fire)和开火图层(Fire_layer)。 非图层序列用作计时器,而图层序列是你所看到的内容。

那份指南指出,Fire和Fire_Layer序列均使用30帧,帧率为30 FPS。 因此,在Blender中创建一个名为Fire的新动作,设置为正好30帧,帧率30 FPS。 从技术上讲,不一定要严格是30帧30 FPS。 帧数只需与帧率相对匹配即可。 例如:30帧对应30 FPS,60帧对应60 FPS,1337帧对应1337 FPS。 如果将帧数增加4.5倍,帧率也需要相应增加4.5倍。 此外,有些武器的_layer序列比非_layer序列的帧数更多。 你应始终以非_layer序列的帧数为基准来确定动画长度。 除非不存在非_layer序列,例如狙击步枪的melee_layer,它没有melee序列。 出于某种原因,“non _layer”序列起到了计时器的作用。“_layer”序列是你在游戏中实际看到的内容。 示例: 你重新装填枪械。游戏会同时触发“reload”和“reload_layer”序列播放。 你可以看到“reload_layer”序列使枪械产生动作,而“reload”序列在后台运行。 当“reload”序列结束时,你的输入会被解锁,你可以再次开火。 无论“reload_layer”是否仍在播放,只要“reload”结束,你就能再次发射子弹。 如果“reload”在“reload_layer”之前结束,你可以取消可见动画并再次射击。 如果“reload_layer”在“reload”完成前停止动作,你必须等待才能射击。 通常,非_layer序列和_layer序列拥有相同的帧数。 有些人会故意制作长动画,利用这种可中断动画的特性。你需要注意正在移植的动画,避免移植错误。 传统上,任何内容都不能跳过。但有些武器是专门为此设计的。 例如: 洛基站长制作了一个武器模组,将M60替换成了转轮机枪。 “开火”序列为默认的30帧、30帧每秒(即1秒)。 “fire_layer”序列则达到了176帧、40帧每秒(即4.4秒)。 他将枪管动画设计为在射击动画“本应”结束后,继续旋转3.4秒。 这使得你可以在枪管仍在减速旋转时开枪。 另一个例子: 有些人制作的换弹动画允许在插入弹匣后中断动画,就像如今一些视频游戏中那样。对于这类动画,你需要注意希望它实际停止的时间点。这可以通过在Blender中加载动画轻松实现,检查“结束帧”应该是哪一帧,然后在计算时使用该帧,而不是动画的总帧数。不过,如果一个序列紧接着另一个序列,当非图层序列结束时,图层序列将自动被截断。例如,拾取黏性炸弹道具的非图层序列为30帧,但图层序列有50帧。由于拾取道具后会立即播放道具循环动画,你永远不会看到图层序列的第31到50帧。在这种情况下,你只需使用0-30帧,无需关注图层序列有更多帧这一事实。在Blender中,你需要在结束帧上精确添加一个关键帧。SMD会一直导出到最后一个关键帧,即使你的“结束”标记在几帧之前。因此,一个120帧的序列至少必须在0帧和120帧各有一个关键帧。此外,每个骨骼都需要关键帧。即使是完全没有移动的骨骼,比如脊柱,也需要。对于这些骨骼,只需在0帧为所有骨骼设置关键帧。 开火 4.4 开枪操作非常简单。在动画中将枪向后移动几帧,摆好扳机、击锤、滑套等需要移动的部件的姿势。

我制作这个动图时忘了设置触发条件,但你应该明白意思。 重新装填 4.5 现在,关于重新装填动画,有个比较烦人的问题需要处理。就是我们之前给弹夹添加的那个“子对象”约束。我们添加这个约束是为了让弹夹能跟随枪支移动,但在重新装填时,我们希望单手移动枪支时,另一只手的弹匣不会跟着移动。这意味着我们还需要为该约束的影响程度设置关键帧。 这前提是你使用的是我提供的预制件,其中弹夹骨骼不是武器骨骼的子对象。我更喜欢这种动画制作方式,因为它能给我更多自由度。不过如果你更喜欢另一种方式,可以重新设置骨骼的父子关系。 首先创建一个新的“重新装填”动作。制作动画,直到弹匣将要掉落的关键帧。为片段骨骼创建一个关键帧,按i键但不要实际移动它。 转到片段骨骼的骨骼约束选项卡,将鼠标悬停在【影响】滑块上并按i键。 滑块应变为黄色。

将时间轴移动几帧,把片段移出视图。在该帧处,同样将片段的“子级”影响值设为0。

这使得弹夹能够“脱落”,并在下落过程中摆脱“子对象”约束的影响。这样一来,你就可以移动右手的枪,而弹夹不会神奇地跟着移动。此时,你可以用左手做任何动作。如果你愿意,可以为左手的IK设置一个“子对象”约束,使其也跟随弹夹移动。我这样做是为了通过移动弹夹来简化手部动画的制作。正如你在上面的图片中看到的,“子对象”的影响后来会恢复到1。这会迫使弹夹回到它应有的位置。

现在你需要稍微移动那些关键帧上的片段,以修复穿模问题。

现在用更多手部动作来装饰动画。插入弹匣时要记得考虑惯性。

近战 4.6 近战 关于近战推击,唯一需要知道的重要点是,Valve在《求生之路2》的代码中设定,近战推击的动画与感染者实际被推中的效果发生在同一帧。 这意味着近战动画应从拳头几乎立即伸出的状态开始,否则在拳头击中感染者之前,感染者就已经开始向后倒下了。 我建议按2倍的帧数和帧率进行动画制作,以便更精确地控制手部处于【出拳】姿势的时机。 或者可以像Valve那样,让动画从拳头完全伸出的状态开始。 这样一来,整个动画就变成了【出拳后的恢复动作】。 我已经制作了两个近战动画。我们之后再讨论这个。你只需要制作一个。


辅助之手/物品交互 注意:这些动画是相对可选的。 “辅助之手”用于当你看向倒地的玩家时。 “物品交互”用于当你看向可互动的物体时,例如弹药、物品或按钮。 这些动画除了手部姿势外完全相同。辅助之手是手掌向上,而物品交互是手掌向下。 你也可以为两者使用同一套动画以节省时间。 很多人会认为这些动画愚蠢且无用,所以我会展示如何制作它们,同时也会展示如何完全避免使用它们。 如果你不想要这些动画,只需不为其制作任何动画即可。 稍后我们将编辑QC文件以适应此决定,因为你不能直接删除序列。这些动画由三部分组成:手部伸出、闲置循环和手部收回。你可以在Blender中制作单个动画,并在QC文件中使用【frame X Y】来分离它们。你不一定非要这样做,但这种方法可以让你保留单个动画SMD文件。查看【动画查找指南】,了解动画需要多少帧。

伸展手部需要20帧,循环动画不限帧数,收回手部需要20帧。制作一个20帧的手部伸展动画。

我想要一个60帧的循环序列,所以复制20帧的关键帧并将其移动到80帧。然后在中间添加一些噪点。

提示:起始帧和结束帧设置可让你选择Blender将要播放的帧,这使你能够仅测试动画的循环部分。

收回动作同样为20帧。你可以复制伸展帧并将其反转来制作收回帧。

现在你有一个手部伸展、完成一次“循环”然后收回的动画。 小动作 4.8你能够创建随机播放的小动作动画。 我们不能像《半条命2:MMod》那样设置“给满弹匣的枪换弹时检查弹匣”,也不能像《反恐精英:全球攻势》那样“按G键检视武器”,或者像《孤岛惊魂2》那样“闲置一分钟就摆弄武器”这类特定触发条件。 我们只有随机播放的内容,它们随时都可能播放。甚至可能在你开枪时播放,而且小动作动画和你的射击或近战等输入之间不会有任何过渡。 动画会立即切换到触发状态,如果武器移动幅度过大,看起来会很奇怪。 如果要做的话,就做点简单的。或者只能希望玩家暂时选择不使用该武器。


导出动画 现在你可以逐个导出序列。 选择任意动作

前往你导出枪支模型的同一位置。Blender会检测到你处于姿态模式,并导出所选动作。

你也可以使用批量导出脚本来自动导出场景中的所有动画。 前往脚本选项卡,新建一个脚本并输入以下内容,然后点击“运行脚本”按钮即可在Blender中导出所有动画。 ############################################# # 批量将所有动作导出为单独文件 # 供Blender Source Tool使用 # 点击“运行脚本”按钮即可导出 # 作者:Davi (Debiddo) Gooz,可免费使用 ############################################# import bpy import os for a in bpy.data.actions: bpy.context.object.animation_data.action = bpy.data.actions.get(a.name) bpy.ops.export_scene.QC编辑(使用预制文件) 我已为所有武器第一人称模型提供了一个预制QC文件。 此预制文件让你可以轻松编辑少量行,而非大量行。 如果按照本节使用此预制文件,之后你可以跳至“声音与粒子事件”部分。 如果你不想要预制文件,请前往“基础第一人称模型QC编辑”。 从仓库下载bones.qci并将其放入你的源文件所在文件夹。 下载你正在制作的武器的QC文件,并将其放入同一文件夹。

5.01 - 基础QC文件编辑 打开QC文件并编辑红框内的行。 【CustomMeshHere】应替换为你在步骤3.8中导出的枪支模型。 【Models/Weapons/Whatever】是材质和纹理的存放路径。

$CDMaterials "Models/Weapons/Whatever" 表示材质和纹理位于 "Materials/Models/Weapons/Whatever"! 5.02 - 添加动画 1 向下滚动到 $animation 行。 红色区块中的字符串是你导出的动画。 我已经给它们起了基本名称,但如果你导出时使用了不同的名称,请现在更改。 确保使用正确的名称,如果你决定以两倍帧率进行动画制作,也要在这几行中更改帧率设置。

5.03 - 添加动画 2 设置好帧率和动画文件名后,复制整个$animation区块。 然后将前缀从A_替换为AL_。 在记事本++中,点击左上角的a_,按住Shift+Alt并点击最下方的a_。 现在你已选中整列,可以一次性编辑所有这些文本。

你可以看到我修改了辅助手和物品手的设置,同时还添加了另一个近战动画和额外的小动作动画。 5.04.1 - 添加辅助手 这些预制件中的辅助手和物品伸展动画的设置与本指南之前说明的有所不同。 在本指南中,你制作了一个手部伸展、播放循环动画然后收回的动画。 但在QC中,我将其设置为一个动画用于伸展和收回,而循环则是另一个smd文件。 你可以通过交换使用的动画并“限制”动画的哪些部分用于手部伸展、循环和收回,轻松更改此设置。 _Ext表示手部伸展,_Ret表示手部收回。 在截图中可以看到,a_it_ext、a_it_ret和a_it_idle使用的是同一个动画。然而伸出手的动作使用0-20帧,收回手的动作使用80-100帧,而闲置状态使用20-80帧。

5.04.2- 不使用“援助之手” 若你不希望显示任何“援助之手”动画: 请注释掉所有以hh_和it_开头的动画。

在“辅助手”上方添加以下行: $weightlist empty { "ValveBiped.ValveBiped" 0 } 每个“根”骨骼都需要定义为权重0。 如果你添加了完全没有父级的骨骼,也需要将其列出! 然后让每个辅助手动画使用此权重列表,同时使用a_look_mid作为动画。

5.05 - 添加额外动画 如果需要额外动画,你可以将原始序列复制到所有其他序列下方,更改序列名称并使其使用其他【$animations】。

注:活动权重 活动名称后的数字为该活动的【权重】。

它决定了此序列的播放概率。 实际计算方式如下: 游戏会查看所有相同活动的序列,并将它们的总权重相加。 以我为例,有两个近战活动。一个权重为3,另一个权重为2。总和为5。 现在,将每个单独活动的权重与总和进行比较。 权重为3的序列有“3除以总和”的播放概率,即3/5。 另一个序列的播放概率仅为2/5。 你可以利用这一点来制作极其罕见的动画,方法是将默认动画的权重设为99。 这样,默认动画的播放概率为99/100,而额外动画的播放概率为1/100。 5.06 - 添加小动作动画 对于小动作动画,请在原始序列下方添加以下文本块: $weightlist empty { "ValveBiped.ValveBiped" 0 } $序列 fidget00a_look_mid 权重列表 空 ACT_VM_FIDGET 100 帧数 120 帧率 1 $序列 fidget00_layera_look_mid 权重列表 空 ACT_VM_FIDGET_LAYER 100 帧数 120 帧率 1 $序列 fidget01 a_fidget1 ACT_VM_FIDGET 2 $序列 fidget01_layeral_fidget1 减去 a_idle 0 增量 ACT_VM_FIDGET_LAYER 2

让我解释一下这些代码行的作用: Fidget_00及其_Layer为空。 它们是不可见的,用于平衡其他小动作的触发频率。 平衡机制如下: 由于“NumFrames 120 FPS 1”,Fidget_00会以1帧每秒的速度播放全部120帧。 因此,当它触发时,会确保在120秒内不会触发其他小动作。 Fidget00的权重为100 Fidget01的权重为2 Fidget02的权重为3 所有权重总和为105 Fidget00有100/105的概率被触发。如果触发,接下来2分钟内不会有其他小动作触发。 当Fidget00“播放完毕”后,游戏会再次随机决定下一个触发的小动作。 如果再次选中Fidget00,由于其较高的权重,将再次进入2分钟的无小动作状态。最终它会选择Fidget01或Fidget02中的一个进行游戏,然后再次掷骰子。 非常简单。 现在质检中只剩下附件和事件了。 请查看下一部分。 附件(使用预制件) 5.07.1接下来是$attachments。 这些用于处理枪口火焰的位置、手电筒/激光的放置位置以及弹壳抛出粒子的显示位置。 如果不使用预制件的附件,请按照此指南正确定位它们。 如果决定在Blender中使用附件骨骼("Weapon.A.Shell"、"Weapon.A:Flashlight"和"Weapon.A.Muzzle"),可以用以下内容替换现有附件: $attachment "shell" "Weapon.A.部分武器设有前向节点,其位置应与枪口火焰相同。 若不希望相机有任何移动,直接移除相机附着点即可。 顺便说明一下这些附着点的作用: 枪口附着点 前向节点:子弹弹道生成位置。Attach_shell_eject(旧版) muzzlesmoke(新版):快速射击后出现的烟雾。位于枪管末端或枪膛内。 Muzzle_flash:枪口闪光 Flashlight:手电筒和激光 Shell:弹壳抛壳口 Attach_muzzle、Attach_shell_eject、Muzzle_flash和Forwardnode应使用相同数据。 它们共同构成完整的枪口闪光效果。 但你可以将Muzzle_flash移到相机后方视野外以“删除”它,就像消音武器应该做的那样。 5.07.2 近战武器的配件有所不同。球棒和武士刀的“模糊”配件位置差异很大。棒球棒的配件甚至会移动,因为它绑定在弹夹骨骼上。 因此,通常最好将位置和旋转与原始武器进行比较。不过一般来说,让模糊效果与手部保持一段距离是个不错的主意,而刀刃(不知为何)则与实际刀刃悬浮着相当一段距离。还要确保旋转角度大致相同,否则粒子效果可能会出现异常。


5.07.3燃烧瓶和破片手榴弹有用于引信和火焰粒子的附着点。 如果你不想使用它们,一定不要删除它们的附着点。 缺失附着点会导致粒子在地图中心生成并覆盖所有物体。 相反,应将附着点移到摄像机后方。 $attachment "fuse" "ValveBiped.ValveBiped" 0.00 0.00 -100.00 rotate 0 0 0 $attachment "Wick" "ValveBiped.ValveBiped" 0.00 0.00 -100.00 rotate 0 0 0 现在,阅读完本节后,你可以直接跳至【声音和粒子事件】部分。 基础视图模型QC编辑(不使用预制件) 这些【不使用预制件】部分适用于当你不使用我提供的qc基础预制件时。 6.01用记事本++打开视图模型QC文件 你会在最顶部看到一个$modelname。

$Modelname决定我们将要编译的模型的名称和位置。 之后我们需要在HLMV中打开模型,这要求我们使用自定义的$modelname。 复制$modelname行,在其中一行前添加//,并将另一行更改为唯一的名称。

这会导致原始文件因被视为注释而被忽略,转而编译成你所选择名称的模型文件。 ReasonHLMV是一款用于检查模型的工具。我们需要用它来检查动画、设置附件以及查看材质,而无需实际加载游戏。 然而,HLMV程序设定为如果找到pak01_dir.vpk文件,就会始终从中加载模型。 这意味着你永远无法看到你的自定义枪支,因为它位于pak01_dir.vpk中。 当你想要为游戏进行编译时,必须将此改回原样,否则你的枪支模组会出现问题! 6.02 下一部分是$bodygroup,这部分与你的模型相关。 模型通过$bodygroup、$body或$model进行编译。我使用$model,因为它所需空间更少。 将$bodygroup部分替换为针对每个smd文件的单行$model代码。

"MrFunreal"是内部保存的名称,在此处完全没有实际用途。我将其用作水印,因为它已保存在模型中。这样如果有人盗用我的模组,我就能发现。BODY和CLIP是我想要编译的smd文件,无需添加.smd后缀。如果您碰巧有同名的.smd和.dmx文件,系统将使用dmx文件。6.03接下来的部分是$surfaceprop、$contents和$illumposition,请勿编辑这些内容。$Surfaceprop决定模型的表面属性(材质)。第一人称模型从不与任何物体交互,因此surfaceprop没有作用,但世界模型会使用它。跳至$cdmaterials,这是材质和纹理的保存位置。此文件夹结构位于materials文件夹内。cdmaterials "models v_models Weapons pistol" 意味着纹理实际上位于"materials models v_models Weapons pistol"中。你可以根据需要更改此路径,或将纹理放入该文件夹。我喜欢添加自己的文件夹。确保该行以/结尾。

接下来是$attachments。 这些用于控制枪口火焰的位置、手电筒/激光的安装位置以及弹壳抛射粒子的出现位置。 如果你决定在Blender中使用附件骨骼("Weapon.A.Shell"、"Weapon.A:Flashlight"和"Weapon.A.Muzzle"),可以用以下内容替换现有的附件: $attachment "shell" "Weapon.A.Shell" 0 0 0 rotate 0 0 0 //$attachment "forwardnode" "Weapon.A.Muzzle" 0 0 0 rotate 0 0 0 //$attachment "muzzlesmoke""Weapon.A.Muzzle" 0 0 0 rotate 0 0 0 $attachment "attach_shell_eject""Weapon.A.Muzzle" 0 0 0 rotate 0 0 0 $attachment "attach_muzzle""Weapon.A.Muzzle" 0 0 0 rotate 0 0 0 $attachment "muzzle_flash""Weapon.A.Muzzle" 0 0 0 rotate 0 0 0 $attachment "flashlight""Weapon.A:手电筒“0 0 0 旋转 0 0 0 $attachment “attach_camera” “ValveBiped.attach_camera”0 0 0 旋转 0 0 -90 部分武器有【前向节点】。它应与枪口焰位于同一位置。 如果不希望相机有任何移动,也可以直接移除相机附着点。 顺便说明一下这些附着点的作用: 【枪口附着点】 【前向节点】子弹弹道生成位置。 【抛壳口(旧)】 【枪口烟雾(新)】快速射击后出现的烟雾。位于枪管末端或枪膛内。 【枪口焰】枪口焰光源 【手电筒】手电筒和激光 【抛壳口】弹壳弹出位置。 【枪口附着点】、【抛壳口(旧)】、【枪口焰】和【前向节点】应使用相同数据。 它们共同构成完整的枪口焰效果。不过你可以将枪口火焰模型移到摄像机后方视野外,以此来“消除”它,就像消音武器应该有的效果那样。 6.04.2 近战武器的配件系统有所不同。球棒和武士刀的“模糊”配件位置差异很大。棒球棒的模糊配件甚至会移动,因为它绑定在弹夹骨骼上。 因此,通常最好将配件的位置和旋转角度与原版武器进行对比。 但一般来说,让模糊效果离手部有一段距离是个不错的主意,而刀刃(不知为何)则需要悬浮在实际刀刃前方一段距离。 还要确保旋转角度大致相同,否则粒子效果可能会出现 bug。


6.04.3燃烧瓶和破片手榴弹有用于引信和火焰粒子的附着点。 如果不想使用它们,请勿移除其附着点。 缺少附着点会导致粒子在地图中心生成并覆盖所有物体。 应将附着点移至摄像机后方。 $attachment "fuse" "ValveBiped.ValveBiped" 0.00 0.00 -100.00 rotate 0 0 0 $attachment "Wick" "ValveBiped.ValveBiped" 0.00 0.00 -100.00 rotate 0 0 0 6.05接下来是$cbox、$bbox、$definebones、可能还有$jigglebones、$weightlists,最后是$animations和$sequences。 $cbox和$bbox不得更改。 $definebones的顺序绝不能改变。不同的顺序会导致玩家手臂出现问题。 如果需要自定义$definebones,请在$definebones列表上方添加$UnlockDefinebones。这允许你修改骨骼数值,而不改变其顺序。 如果你确实使用$UnlockDefinebones,你应该在QC文件的末尾用自定义模型定义你的$model行。因为这会改变模型的参考姿势。 如果有人反编译你的模型,它会看起来很糟糕,并且必须重新组合。 所以只需在QC的末尾定义你的自定义模型。 附件除外,因为它们会确定自己实际将被附加到哪个骨骼上并自行排序。 向QC添加动画(不使用预制件) 6.07如果你正在编译自己的动画,现在可以编辑$animations和$sequences。 向下滚动到你有$weightlist或几个$animation行的位置。你很可能会有一个【权重列表】模块和一些“修正动画”。


删除所有内容。 接下来你需要的行是第一个序列。 对于手枪,它应该是“闲置”,大多数枪支使用“观察姿势”,一些物品使用“瞄准”。

供参考: 在《求生之路2》中,IK链线条用于实现IK(反向运动学)效果。它们帮助手部跟随枪支移动。不过,膝盖部分会决定肘部的位置。根据我的经验,注释掉IK链中的膝盖部分是个不错的主意。这样可以强制编译器不“虚构”肘部的位置。

çąäş

6.08现在我们将设置自己的动画。 在第一个$sequence之前添加以下行: $animation "a_idle"anims idle loop ikrule rhand touch "weapon" usesource ikrule lhand touch "weapon" usesource $animation "look_down"anims/lookposeframes 0 0 subtract a_idle 0 $animation "look_mid"anims/lookposeframes 1 1 subtract a_idle 0 $animation "look_up"anims/lookposeframes 2 2 subtract a_idle 0 $animation "a_run"anims/run.smdloop "A_idle"是你导出的闲置序列。 所有观察动画都加载"lookpose"动画,同时指定第0帧为"向下看"姿势,第1帧为自然姿势,第2帧为向上看。 "a_run"定义跑步动画。 "anims/..."部分加载实际的动画smd文件。如果你将闲置动作命名为“idlenoise”,那么a_idle需要加载“anims/idlenoise”。或者,如果你的观察动作是“look”,则将“anims/lookpose”替换为“anims/look”。a_idle中的Ikrule及后续内容用于处理《求生之路2》中的反向动力学(IK)。这会使手部跟随你指定的骨骼。在上述设置中,它让右手接触(并因此跟随)“weapon”骨骼,同时左手也接触“weapon”骨骼。如果你不希望手部跟随枪支,请使用“release”。例如,我的左手除非在换弹时,否则从不接触枪支。我会将“ikrule lhand touch "weapon" usesource”替换为“ikrule lhand release”。

如果你决定更改动画的帧率,可以在$animation中添加“fps”设置,以强制动画按你想要的帧率运行。 在上图中,你可以看到a_run $animation被强制以60 fps播放。 如果没有fps设置,动画默认以30 fps播放。 6.09 此步骤有两个目的:一是防止错误,二是为你的动画提供未来保障。 错误预防: 如果非图层序列和图层序列使用相同的“anim/animation.smd”文件,它们可能会出现问题。 出于某种原因,其中一个可能无法正常工作。因此,我们通过此步骤完全避免了这个问题。
未来保障: 我们将对动画进行减法处理以实现混合效果,这样看起来会更好。 然而,混合动画会导致其在反编译时出现损坏。 这意味着任何想要将你的枪支移植到其他槽位的人都无法做到。 而且,如果你想修复模组中的某些问题,但丢失了源文件,就需要反编译自己的模组。如果没有对动画进行“未来保障”处理,你将无法重新编译自己的动画。这种情况我已经遇到过三四次了。 有多种方法可以处理这一步骤。 但我只展示那种能同时保留动画以便未来使用的方法。 复制每个动画文件,并将副本重命名为带有_layer后缀的名称。

创建一个动画文件块,将每个smd文件定义为使用a_前缀的动画。然后复制所有内容,并让副本使用_layer.smd文件,采用al_前缀。

以a_为前缀的$animation行用于非图层$sequences。以al_为前缀的则用于图层$sequences。部分武器的某些动画可能没有非图层序列。例如军用狙击步枪只有melee_layer,没有melee序列。在这种情况下,仍应设置a_和al_两种$animation,其中a_动画作为备用。注意:在本指南中,你会看到我仍对非图层和图层使用相同的a_anim。这是因为此步骤是在指南其他部分完成后编写的。请默认所有非图层序列使用a_anim,而图层使用al_anim。对此造成的混淆深表歉意。6.10 完成$animation行的设置后,需配置Idle_layer和look_poses。以手枪为例,需设置idle和idle_layer。只有手枪存在这种情况。 请检查你的质量控制(QC)中哪个序列包含跑步动画,哪个包含视角动画。 确保你的$animations的使用方式与该图片一致。 第二个a_run是“向后行走”动画,因此你可以为其制作第二个动画。

重要的是,序列中的观察姿势应为上、中、下。按此顺序排列。否则,你的观察姿势会颠倒。6.11现在我们可以开始修改所有序列,以使用你的动画或smd文件。首先,检查是否有任何序列包含大量Ikrule行。如果有,将其删除。

如果你在$animation中更改了帧率,请删除此处的帧率设置。 如果你未在$animation中更改帧率,请保留$sequence中的此帧率设置。 如果你使用smd文件且需要不同的帧率,请在此处编辑$sequence中的帧率设置。

在$sequences中,将已使用的animation.smd替换为你制作的$animations。“Deploy”应使用a_deploy,“Deploy_layer”应使用al_deploy。但此图像是在之前步骤之前完成的,因此这里的$animation名称不同。

可能有很多图层序列包含这种减法、增量和注释的组合。它们对我们的动画毫无用处,需要删除。

相反,所有层级序列(可能“辅助手”除外)都需要以下设置: 减去a_idle 0 delta ikrule rhand touch "weapon" usesource ikrule lhand touch "weapon" usesource 当然,你的ik规则必须与你在闲置状态下使用的规则相同。 除非左手像在换弹、近战和辅助手动作中那样移动。 在这些情况下,左手必须释放。 我自己的左手ik规则通常使用释放,除非在换弹期间,我让它跟随弹夹,因为这是一把单手枪,让左手跟随任何骨骼都是没用的。

如果任何序列仍在使用权重列表,请从该序列中删除这些行。

不要对非层级序列执行“减去a_idle 0 delta”操作。这会破坏非层级动画,导致其在反编译时无法恢复! 处理辅助手(不含预制体) 6.12.1 当所有其他序列更新完成后,你需要处理手伸出序列。 如果你想保留手序列,请执行此步骤。 如果你不想使用它们,请改为执行步骤6.12.2。 注意:不知为何,如果你未对辅助手序列执行“减去a_idle 0 delta”操作,左手拇指根会出现问题。我不清楚具体原因。但如果你的手伸出时左手拇指根出现问题,只需禁用左手拇指根骨骼的IK约束,导出辅助手动画,然后重新启用该约束即可。

互助动画有些小问题。伸展动画必须使用0淡出,而收回动画必须使用0淡入。所以我的做法是,伸展动画使用0.3淡入、0淡出,收回动画使用0淡入、0.3淡出。必须这样做的原因是,如果从伸展或收回动画到循环动画使用任何类型的淡入淡出效果,都会导致动画先淡入到闲置序列,然后再过渡到循环序列,从而产生非常混乱的过渡效果。

另外: 伸展的手部动作在使用subtract a_idle 0 delta时完全无法正常工作。 这就是为什么我对伸展动作使用更长的淡入时间,对收回动作使用更长的淡出时间。 还记得我提到过可以制作一个包含伸展、循环和收回动作的序列吗? 如果你想“拆分”它,就必须像处理lookposes(注视姿势)那样使用“Frame”(帧)选项。 你在步骤6.09中已经见过这个操作了,但现在它才真正派上用场。

如你所见,我有三个$animation行,它们都使用同一个.smd文件。 "Extend"被设置为仅使用0到20帧。 "Loop"使用20到80帧,同时启用"loop"以帮助平滑循环。 "Retract"被设置为使用80到10帧。 由于我的$animation行中包含"frame X Y"行,所以这里不需要再使用它们。 如果你不使用$animation行,而是在这些序列中使用smd文件,那么你需要在此处添加这些帧定义。

如果你完全不想使用辅助提示序列,请勿删除它们。但你可以通过某种方式“禁用”它们,使其不会实际显示出来。将整个辅助提示部分(全部12个序列)替换为以下内容:$weightlist empty { "ValveBiped."ValveBiped" 0 } $序列 "helping_hand_extend" 剪辑权重列表为空 动作 "ACT_VM_HELPINGHAND_EXTEND" 1 $序列 "helping_hand_extend_layer" 剪辑权重列表为空 动作 "ACT_VM_HELPINGHAND_EXTEND_LAYER" 1 $序列 "helping_hand_loop" 剪辑权重列表为空 动作 "ACT_VM_HELPINGHAND_LOOP" 1 $序列 "helping_hand_loop_layer" 剪辑权重列表为空 动作 "ACT_VM_HELPINGHAND_LOOP_LAYER" 1 $序列 "helping_hand_retract" 剪辑权重列表为空 动作 "ACT_VM_HELPINGHAND_RETRACT" 1 $序列 "helping_hand_retract_layer" 剪辑权重列表为空 动作 "ACT_VM_HELPINGHAND_RETRACT_LAYER" 1 $序列 "item_extend" 剪辑权重列表为空 动作 "ACT_VM_ITEMPICKUP_EXTEND" 1 $序列 "item_extend_layer" 剪辑权重列表为空 动作 "ACT_VM_ITEMPICKUP_EXTEND_LAYER" 1 $序列"item_loop" 剪辑权重列表为空 动作 "ACT_VM_ITEMPICKUP_LOOP" 1 $序列 "item_loop_layer" 剪辑权重列表为空 动作 "ACT_VM_ITEMPICKUP_LOOP_LAYER" 1 $序列 "item_retract" 剪辑权重列表为空 动作 "ACT_VM_ITEMPICKUP_RETRACT" 1 $序列 "item_retract_layer" 剪辑权重列表为空 动作 "ACT_VM_ITEMPICKUP_RETRACT_LAYER" 1 但你需要将"CLIP"替换为$model行中使用的任意smd文件。

警告: 部分物品具有不同的序列和动作名称。例如,医疗包使用itempickup_extendr和ACT_VM_ITEMPICKUP_RETRACT_,这是因为存在拼写错误,而Valve从未注意到或懒得修复。 添加额外动画(不使用预制件) 6.13 - 可选 之前我提到过我们能够添加多个版本的动画。我有第二个近战动画,想要使用它。 要添加额外动画,请将原始序列行复制到qc文件的最底部。通过在序列名称后添加2、3或其他数字来更改$sequence名称。

你看到活动名称后面的【1】了吗?

这就是该序列的【权重】。它决定了该序列的播放概率。 实际计算方式如下: 游戏会查看同一活动的所有序列。 它会将所有同名活动的权重相加得出总权重。 以我为例,有两个近战活动,一个权重为1,另一个为2,总权重为3。 然后将单个活动的权重与总权重进行比较。 权重为2的序列有2/3的播放概率,而另一个则有1/3的概率。 这意味着你可以将一个序列的权重设为99,另一个设为1,从而使后者变得稀有。 添加小动作动画(无预制件) 6.14 - 可选 与添加额外版本的动画类似,你可以添加随机播放的动画。在你的QC最底部(或者至少在辅助手部相关内容之后)添加以下行: $weightlist empty { "ValveBiped.ValveBiped" 0 } $sequence fidget00CLIP weightlist empty activity ACT_VM_FIDGET 100 numframes 120 fps 1 $sequence fidget00_layerCLIP weightlist empty activity ACT_VM_FIDGET_LAYER 100numframes 120 fps 1 $sequence fidget01 a_fidget activity ACT_VM_FIDGET 2 $sequence fidget01_layera_fidget subtract a_idle 0 delta activity ACT_VM_FIDGET_LAYER 2 $sequence fidget02 a_fidget2 activity ACT_VM_FIDGET 3 $sequence fidget02_layera_fidget2 subtract a_idle 0 delta activity ACT_VM_FIDGET_LAYER 3 如果你已决定省略辅助手部序列,那么你已经拥有空权重列表,无需再添加一个。将CLIP替换为你在$model行中使用的任意smd文件。 让我们简单谈谈这些内容的作用。 Fidget00和Fidget00_layer是“空”的小动作。它们是不可见的,仅用于平衡其他小动作的触发频率。 在前面的部分中,我提到了活动权重。Fidget00序列的权重为100,用于抵消Fidget02和Fidget03的权重。这使得实际的小动作序列分别有2/105和3/105的播放概率。 Fidget00序列末尾的“Numframes 120”会人为生成一个120帧长的序列,而实际上并不存在这么多帧的序列。其背后的FPS 1会强制该序列每秒播放一帧。Numframes 100和FPS 1同时设置意味着,如果Fidget00序列播放(其播放概率为100/105),它们将持续播放120秒。因为它们有120帧,每秒播放一帧。其工作原理大致如下:Fidget00有100/105的概率播放。如果它开始播放,在接下来的2分钟内,其他任何小动作动画都无法播放。当Fidget00“播放完毕”后,游戏会再次随机决定接下来播放哪个小动作动画。你需要在“展示我精美的小动作动画”和“这家伙有多动症,连一分钟都静不下来”之间找到平衡。声音和粒子事件:在进行此操作之前,建议先进行一次测试编译,尤其是当你不完全确定是否喜欢动画的时间节奏时。如果你不喜欢这个时间安排,就必须重新制作动画,并且调整事件的时间。所以我会把这些留到最后做。 6.15到现在你可能已经注意到某些图层序列上的【事件】行。

这些决定了哪一帧触发声音。 在第10帧播放“Pistol_Silver.ClipOut”。 在第34帧播放“Pistol_Silver.ClipIn”。 在第36帧播放“Pistol_Silver.ClipLocked”。 它们非常简单直接:选择一帧以及要播放的声音。 有关所有可能的声音事件的完整列表,请参考本指南中的【声音事件】部分。 要轻松确定应在哪一帧播放声音,可以查看Blender中的关键帧列表,了解某一动作发生在哪一帧。 例如,在这个换弹动画中,弹夹骨骼从第8帧开始移动。

在插入时,我使用【时间轴滑块】来确定何时播放该音效。第49帧就可以。

检查所有需要声音事件的【图层动画】并为其设置时间。例如,我的【空弹夹换弹图层】将使用:

警告: 请留意声音事件本身的时间。 你想要的实际声音完全有可能在你选择的帧之后播放。 一个令人困扰的例子是MP5的【枪栓回拉】声音。它会依次播放【枪栓回拉】和【枪栓前推】。 这种微小的时间差可能导致你获取声音的时机过晚,因此你可能需要将触发帧设置为更小的数值。 近战武器注意事项: 简而言之,对于近战武器,你应该将模糊附着事件以及任何声音或粒子事件添加到非图层序列和图层序列中。 由于一些特殊机制,事件的使用位置会完全根据动作名称进行切换。 不过,我们可以通过将事件添加到两个序列中来简化操作,这样能减少麻烦。声音事件并非唯一可设置的内容。你还可以通过相同方式触发抛壳粒子效果和枪口闪光事件。


关于可用粒子的信息也在【动画查询指南】中。 ═══════════════════════════ HLMV的视图模型编译 在编译任何内容之前,建议你在游戏中添加一个【自定义内容】文件夹。 这能让你的自定义模组文件与原版文件分开存放。 这样做的好处是,当你想清除所有存放了数月的模组文件(如纹理或这些临时编译文件)时,只需删除该文件夹的内容即可。 7.0打开Crowbar。 进入【设置游戏】选项卡,确保至少正确设置了gameinfo、模型编译器和打包工具的所有路径。首先,你必须拥有创作工具,才能使用这些工具。

检查你的【$Modelname】行是否使用了默认模型名称以外的内容。在我的预制件中,我使用的是【!/TEMP.mdl】,但你可以使用任何你想要的名称。

将你的QC文件拖到撬棍工具上。默认情况下,它应该会打开编译选项卡。确保“输出至”设置为“游戏的‘models’文件夹”,并且你正在为求生之路2进行编译。

编译完成时会有提示。我之所以说明这一点,是因为很多人都会询问何时完成。

以下是一些你可能遇到的常见错误: 错误:'EXCEPTION_ACCESS_VIOLATION' (assert: 1) 原因: • 顶点数量过多。 • 网格的骨架与物理网格的方向不匹配。 • 在$lod设置中使用$removemodel。 • 在序列中错误使用"FixupLoop"。数字应分别对应动画前和动画后,例如应为-5和-5,而非5和115。 • 使用Perl脚本生成的SMD文件进行比例调整,该文件不包含骨骼位置信息。当你为减小文件大小而删除网格线条时,可能同时删除了骨骼信息,从而导致此问题。 • 使用N边形几何。N边形是指具有多个顶点但内部没有三角形的面,例如八边形。错误:模型中使用的骨骼数量过多,已使用X个,最大数量为Y。骨骼数量过多。除了删除骨骼外没有其他修复方法。 错误:使用的材质过多,最多32个。这不是很明显吗? 错误:X - IK规则不匹配。带有IK规则的$sequence使用了具有不同IK规则的$animation。通过为$sequence和$animation赋予相同的IK规则来修复此问题。 错误:X - IK规则数量不匹配:"Y" "Z"。$sequence使用了$animation。其中一个有一个IK规则,而另一个有两个。通过为两者赋予相同数量的IK规则来修复此问题,即使你只是在其中一个上使用"Release"。无法加载文件“$sequence” • 某处缺少一个“,导致编译器将$sequence当作文件名来查找文件。 • 事件名称没有在其与}之间添加“和空格。例如:{ event 5004 1 CedaJar.HelpingHandExtend}” 动画(主要是IK骨骼)导出完全损坏 不知道原因,但你可以通过在“姿态 - 动画 - 烘焙动作”中勾选所有复选框来烘焙动画以修复此问题。 导出烘焙后的动画。 导出后撤销烘焙,以便恢复你的IK设置。 除了此临时修复方法外,尚未找到实际的解决办法。有时Blender就是会出现故障。 这些只是在视图模型上常见的一些错误。在HLMV中检查模型 如果编译成功,请加载创作工具,并通过它打开模型查看器。

点击“文件-加载模型”,然后找到你自定义名称的模型。


8.1点击“文件-加载武器”以加载一组第一人称手臂模型。是的,我知道这听起来有些矛盾。自《半条命:起源》以来,他们就一直没费心重命名这个按钮。前往“模型-武器-手臂”并加载任意玩家手臂模型。

注意:如果你遇到提示文件夹不存在的错误,这是因为HLMV(模型查看器)比较老旧。它无法加载pak01_dir.vpk文件中的任何模型,除非你有对应的松散文件夹。打开Crowbar的“设置游戏”选项卡,然后点击“创建‘models’文件夹树”按钮。

警告:这也会读取您已加载的插件,并在插件内为模型创建子文件夹。这意味着如果您有包含自定义模型的战役,这些模型会使您的HLMV(半条命模型查看器)变得混乱。您可以在点击此按钮前重命名插件文件夹,然后再改回名称来避免这种情况。您会看到类似这样的情况:一把没有纹理的枪和一些动画。

你可以按下这个【法线贴图】按钮来开启法线贴图。反正你之后也需要用到它。

目前,如果模型外观没有问题,请打开序列选项卡。

最上方的序列是你通常最先看到的。将其更改为类似【部署层】的名称。你可能会看到动画变得奇怪,就像这样。

这是因为我们混合了所有动画。要正确查看这些动画,你需要按以下方式设置序列:

我的第一个序列是闲置状态。对你来说,它可能是闲置图层。选择任何混合a_run和a_idle的序列。第二个序列是你想要查看的那个。将右侧的滑块向右移动并勾选方框。你也可以进入【视图模型模式】以切换到视野相机。

实际视野数值设置在渲染选项卡中。不过界面元素也会遮挡大部分枪械。

我个人会进入视角模型模式,按住窗口中间的鼠标右键并向下拖动鼠标,以缩小视野范围。

当然,由于你进行了缩小操作,这里的视野(FOV)已不再是你在《求生之路2》中实际看到的视野,但Blender中的视野辅助工具已经让你对在《求生之路2》中能看到的内容有了足够的了解。现在你可以循环浏览你的动画,检查是否有任何异常情况。这里的这个滑块是速度滑块,允许你以任何想要的较慢速度播放。

下方的滑块是帧擦洗器。它能让你检查任意一帧且不会使其移动。 右侧带有圆点的序列就是受滑块影响的序列。

《求生之路2》视图模型编译 9.1 确认所有序列在HLMV(半条命模型查看器)中显示正常后,你可以直接编译以用于游戏内,或者如果之前跳过了动画事件,先处理动画事件。 要将其编译为游戏内可用版本,首先必须将$modelname替换为原始名称。 【你必须执行此操作。我重复强调,你必须这样做。】 你必须。你必须。你必须。 不知道有多少人就是因为没有这样做,才会疑惑为什么自己的模组无法正常运行。

然后,在编译选项卡中,将输出设置为“工作文件夹”,并在qc文件附近创建一个文件夹。该文件夹将作为你的插件,之后会被转换为vpk文件。你所有的材质、模型和其他内容都放在那里。

点击编译按钮。它将编译模型并在你的插件内自动创建所有所需的子文件夹。

9.2 进入你之前编译好的文件夹,将其拖到Crowbar的【打包】选项卡上。将【输出至】文件夹设置为《求生之路2》的addons文件夹,然后点击左下角的打包按钮。这样会将你的插件直接打包到《求生之路2》中。

打包完成后,你可以启动游戏并在游戏内查看武器。确保你没有启用任何替换同一武器的插件。你的插件暂时不会显示在插件菜单中,因为它没有addoninfo.txt文件。我们会在最后发布前再创建该文件。 现在你可以在游戏内测试这把枪。尝试所有能触发的动画:部署、射击、换弹、近战、物品拾取(通过看向你未携带的物品)。 提示:在控制台输入nb_stop 1可以阻止 bots 尝试扶起罗谢尔。 对于闲置动画,你要么等待它们自动播放,要么暂时将fidget00的numframes(帧数)减少到1,或者将其fps(帧率)提高到120。选择哪种方式都可以。纹理仍然会损坏,但目前这并不重要。你可以现在就跳过这一步去修复它们,但我更倾向于在完成世界模型后再处理。


现在你可以选择调整动画,或者继续处理世界模型。但你可能也会遇到一些bug。最常见的bug是屏幕顺时针旋转90度,或者手部模型到处乱动。如果你的相机旋转了90度,有两个简单的修复方法:删除“attach_camera”附着点。如果你一开始就不希望有任何相机旋转,这是最简单的修复方法。旋转“attach_camera”附着点本身,使其适配。在HLMV中,附着点的正确朝向是【红线指向观察方向,蓝线向上,绿线指向左方】。

如果你想旋转附件,请使用【旋转】框,直到辅助线正确对齐。 然后将【Qc字符串】框中的内容复制到你的qc文件中,替换现有的附件。 如果手部出现混乱,99%是因为你用撬棍工具添加了新的$definebone行。 添加新行会导致顺序改变,而这种顺序变化会引发故障。 要恢复默认设置,请将原始的Valve武器模型反编译到任意文件夹,然后将其qc文件中的$definebones复制到你的文件中。 ═══════════════════════════ 制作世界模型 10.1 既然第一人称模型这个难点已经完成,我们可以快速制作世界模型了。 你可以根据角色手持武器的状态制作不同的世界模型。另一个选项是让武器在玩家背上时显示不同的模型,但这需要脚本支持。 后者可能不是个好主意,因为存在脚本限制等问题。 不过如果你确实想要不同的世界模型,可以制作多个模型来使用。 在Blender中,导入解包后的世界模型,确保勾选“创建新骨架”选项。


10.2 复制你的视图模型网格并将它们放置在原始武器上方。选择它们,按下Shift+D,然后移动鼠标。点击左键放置。

现在对世界模型网格应用所有变换。

将你的新网格重命名为有意义的名称。我喜欢添加w_前缀。

10.3我们可以选择让武器的某些部件可移动。 弹夹、枪栓(或手枪的套筒)以及弹夹内的子弹均可移动。 不过,只有当弹夹中仅有一发子弹时,子弹才会生效,因为它只会向弹夹深处移动。如果弹夹装满了可见的子弹,就无法实现这一效果,比如我的枪就是如此。

如果你想要这些活动部件,就需要将武器重新绑定到那些骨骼上。 首先,将你复制的枪支模型拖到世界模型的骨架上,将它们父级设置到该骨架,就像我们在步骤3.5中所做的那样。 Blender 2.8: 1. 选择你的模型对象。 2. 按住“Shift”键并将模型拖到骨架上。 3. 松开鼠标,但继续按住Shift键。 4. 会出现“设置父级到”窗口,此时可以松开Shift键。 5. 选择“使用空组”。 Blender 2.9: 1. 选择你的模型对象。 2. 在3D视图的对象模式下,按住“Shift”键并点击骨架。 3. 按下Ctrl和P键。 4. 选择“使用空组”。 现在,顶点组中会同时包含所有第一人称模型骨骼和世界模型骨骼。这是有意为之的,我们将利用这一点来选择已绑定的部分,并将其重新绑定到另一个骨骼上。

为了方便操作,我已经从该视图中删除了除武器骨骼外的所有内容。 插曲:本节将说明击针、套筒和泵动装置在射击和换弹过程中的运动方式。 如果您对此不感兴趣,可以跳至10.5部分,将击针完全绑定到武器骨骼上。 击针以不同权重绑定到两个骨骼上。 这是一种巧妙的设计,能让所有武器动画使击针向后移动X单位,但武器权重决定了其实际移动距离。 具体工作原理说明:如果一个网格绑定到单个骨骼,那么该骨骼将决定所有运动。 如果一个网格绑定到两个骨骼,那么该网格将同时受到两个骨骼的影响。 权重越大的骨骼,其影响力就越大。如果手枪的套筒以50%权重绑定到枪机骨骼、50%权重绑定到武器骨骼,那么套筒模型将在这两根骨骼之间完美移动,且仅移动枪机骨骼移动距离的一半,因为武器骨骼会使其保持原位。但如果套筒以80%权重绑定到枪机骨骼、20%权重绑定到武器骨骼,那么枪机骨骼对套筒移动幅度的影响更大。

在模型编辑模式中,找到滑架或枪栓所绑定的骨骼,然后点击“选择”。

现在你之前已经绑定好的整个滑块会被重新选中。这样可以节省手动选择所有网格的时间。暂时将权重滑块设置为0.5,并将其以0.5的权重绑定到武器和螺栓上。

我摆了个姿势,它就移到这里了。不过你之后会发现,这基本没什么用。 给滑套绑定好骨骼后,先暂时将其隐藏。 选中弹夹,将其绑定到弹夹骨骼上,权重设为1。 你也可以把子弹绑定到子弹骨骼上,但如果能看到弹夹内部的话,效果可能会很奇怪。这种情况下,你就不需要绑定子弹了。这样一来,在取出弹匣时就能看到子弹。不过说实话,谁会在第三人称视角下注意那一颗子弹呢? 给弹夹绑定好骨骼后,也把它隐藏起来。

现在将所有剩余内容绑定到武器骨骼上。然后,从顶点组中删除所有多余的第一人称模型骨骼。

10.5 导出世界模型。 打开世界模型QC文件。 现在我们要做的和之前处理视图模型时基本一样。 创建一个新的模型名称,将视图模型的cdmaterials复制到世界模型中。 为你的模型切换身体组,并切换$sequence以同样使用你的模型。

可能存在碰撞模型部分。我不会创建新的碰撞模型部分,因为我并不在意。 如果你不想创建新的碰撞模型部分,可以删除整个碰撞模型部分。 世界模型附着点 现在我们需要为HLMV(半条命模型查看器)编译它,以便检查并设置附着点。 确保撬棍的输出路径再次设置为“游戏的‘models’文件夹”。 编译模型,在HLMV中加载世界模型,然后打开“附着点”选项卡。

我们有三种可能的配件。 没有手电筒配件将不会显示手电筒和激光。 这不会“阻止激光提高枪支精度”,因为根本没有激光。 我之前收到过很多这样的评论。 按照你的意愿移动和旋转配件。 配件名称 排列方式 弹壳 左抛壳 蓝色朝上,红色朝左,绿色朝后 弹壳 右抛壳 蓝色朝上,红色朝右,绿色朝前 手电筒 蓝色朝前,红色朝左,绿色朝上 枪口火焰 蓝色朝右,红色朝前,绿色朝上 当配件按照你的需求设置好后,将【QC字符串】内容复制到你的QC文件中。


世界模型变体(装备/未装备) 以下信息仅提供给确实需要的人。 《求生之路2》允许你更改模型在手持或背负状态下的显示效果。 你可以根据需要选择以下一种或两种方式: 1. 模型编辑:使模型在手持状态下显示为不同样式。 2. 脚本编辑:仅更改模型在背负状态下的显示样式。 如果不需要区分模型,可跳过此部分。 模型编辑:此方法需要两部分: 一个基础$model,身体组会添加到该模型上,且始终可见。 一个包含两个身体的【flashlight】身体组。 不清楚为何命名为【flashlight】,使用其他名称均无效。 可能是因为玩家装备枪支时只有手电筒,具体原因不明,无需深究。第一个身体组的模型会添加到$model的顶部。 $model和第一个身体组在地图中被发现时以及在玩家背上时都可见。 第二个身体模型仅在幸存者手持它时才可见。 如果添加“blank”,那么当有人手持第二个身体模型时,它实际上会被移除。 提示:你可以为$model使用一个不可见的三角形。 这允许你的武器或物品拥有完全不同的模型。 例如,一个医疗包在被人手持时变成一卷绷带。 但为了优化,所有始终可见的共享网格都应放在$model中。 否则你将毫无理由地需要更多的计算能力和更大的文件大小。 示例QC $model sword sword.smd //始终可见,在任何时候。 $bodygroup flashlight { studio sheath.smd // sheath loaded onto sword. blank // blank bodygroup loads when held, effectively removing the sheath. } Example of "different models entirely"$model dud invisible // must exist, but it's invisible. $bodygroup flashlight { studio medkit// On back and in world studio Bandages// only visible in other's hands. }Script edit:The script approach only changes the model that is seen on another players back. The model itself is the same as any other worldmodel, so you basically just have two of those. Caveats: 1. Some servers will not allow you to use the script, because it forces the hosts script on you. 2. if hosting with this mod, joined players might have bugs due to missing models on their end. 3. Other script mods are not compatible, obviously.要实现这一效果,你只需要第二个世界模型,并在武器脚本中添加以下代码行:AddonModel path/to/model/here.mdl 示例: "viewmodel" "models/v_models/v_rifle.mdl" "playermodel" "models/w_models/weapons/w_rifle_m16a2.mdl" "AddonModel" "models/w_models/weapons/w_rifle_m16a2_ADDON.mdl" "AddonAttachment" "primary" "addon_offset" "0 0 0" // 偏移量:v^, <>, Z轴网格 "addon_angles" "0 0 0" 同时,你也可以编辑附加模型的附着点、偏移量和角度。但由于玩家模型模组可以设置自己的附着点,这可能是徒劳的。 HLMV中的世界模型测试 12从【Survivors】文件夹中加载任意幸存者模型(teenangst和biker_light除外)。

将世界模型加载为【武器】

根据你拥有的武器,需要为玩家加载不同的动画。第一个序列必须是该枪械类型的任意闲置动画。

第二个按键序列可以设为【射击】,第三个可以设为【换弹】。

就像视图模型动画一样,使用右侧的TheDot™️和Slider©️来选择动画。底部的Scrubber®现在可以帮助你检查任何帧,比如查看在换弹或开火期间滑动是否足够。

该死,得重新调整滑套的重量。

如果你也遇到这种情况,请回到Blender并调整滑套的权重平衡。如果希望滑套移动幅度更大,选中滑套并增加枪机骨骼的权重。如果希望滑套移动幅度更小,选中滑套并增加武器骨骼的权重。这样就差不多了。我将枪机骨骼的权重设为0.5,武器骨骼的权重设为0.6。

现在还需要检查片段是否正常运行。你对此没有任何影响,所以基本上只需检查它看起来是否正常。

完成世界模型 13.与视图模型类似,在QC文件中交换$modelname行,以编译游戏中实际使用的枪支模型。

然后也将其编译到你的插件【工作文件夹】中。

然后再次打包插件以在游戏内查看。

开始在游戏内查看。

你可以将以下功能绑定到按键: bind "m" "sb_takecontrol" bind "j" "upgrade_add LASER_SIGHT" bind "9" "incrementvar r_drawvgui 0 1 1" 看向任意机器人,按M键即可切换到该机器人。 使用“Give”命令给自己想要的武器。 近战武器与地图绑定,部分地图不允许使用武士刀或其他特定近战武器。 TUMTaRA地图允许使用所有近战武器。 按J键可获取激光瞄准器。 看向另一个机器人即可切换过去。 使用狙击步枪时,按9键可切换HUD显示,然后放大机器人手中的枪,查看你过去30分钟在Blender里制作的内容。 注意:遗憾的是,每个人握持枪械的方式略有不同。 如果一把枪在弗朗西斯手中握持得很合适,在尼克手中可能完全不匹配。 花点时间对比一下他们握持同一把武器的方式。



制作纹理 纹理由两部分组成:一是纹理本身,即“你所看到的内容”;二是材质,它定义了“你如何看到纹理”。 首先,我们需要纹理本身。你可能获取了一个带有.tga、png或其他格式纹理的模型,或者你自己在Substance Painter等软件中制作了纹理。 14.1 - PBR转换及其他编辑 如果你有PBR纹理,打开Photoshop,加载漫反射贴图,并将AO(环境光遮蔽)贴图叠加到漫反射贴图上。Source 1引擎不会像这样将它们分开处理。


与PBR以及大多数其他用法相比,Source 1还会反转法线贴图的绿色通道。 粗糙度可用作环境贴图遮罩,既可以作为法线贴图的Alpha通道,也可以单独使用。我将其用作法线遮罩的Alpha通道,默认情况下它也可兼作Phong遮罩。 环境贴图遮罩用于控制(基础)世界反射的可见程度。它可以使某些部分更具反射性,而其他部分反射性较弱,例如脏污的镜子,或金属上露出底漆金属的划痕。 粗糙度也可用作Phong指数纹理,方法是将红色通道设为约125的纯灰色,保留绿色通道,将蓝色通道设为黑色(因为该通道未被使用)。Phong用于控制光线在模型上的反射方式,对金属材质效果非常好。

以下是我处理PBR纹理的方法: PBR纹理 在源文件中的用途 基础颜色 漫反射 混合AO 漫反射(叠加在基础颜色上) 高度 未使用 金属度 未使用 - 可用作遮罩,辅助制作环境贴图遮罩或 phong 指数遮罩 法线 法线贴图(反转G通道) OpenGL法线 法线贴图(反转G通道) 粗糙度 环境贴图遮罩、Phong遮罩或Phong指数纹理 这里无法详细说明。本指南已经足够长了。 如果想了解更多关于环境贴图遮罩和Phong相关内容的工作原理,可以自行查阅相关资料。环境贴图遮罩(Envmapmask) 冯氏光照模型(Phong) 如果你像这样手动编辑纹理,不妨直接将所有材质从Photoshop或GIMP中导出为VTF格式。 这种情况下,你可以跳过步骤14.3,直接进入14.4。 14.2 进入将要转换为你的插件的文件夹。 按照你拥有的$cdmaterials行,创建完整的材质设置。


我再说一遍。 材质和纹理文件应放入Materials文件夹,而非模型文件夹。 14.3 准备好可用的纹理后,使用VTFEdit将所有纹理转换为VTF格式。 最好将所有纹理放在同一个文件夹中进行此操作。 打开VTFEdit,点击【工具】,然后选择【转换文件夹】。

在弹出的窗口中,选择【转为VTF】并关闭【创建VMT文件】选项。我们确实需要VMT文件,但这样会为每个不需要VMT文件的纹理都创建一个,数量太多了。选择纹理所在的位置,以及我们新建的文件夹,将转换后的纹理放在那里。

14.4 创建一个包含以下内容的文本文件: vertexlitgeneric { $basetexture } 将其命名为你在Blender中使用的某个材质的名称,并以vmt为文件扩展名。每个材质都需要有自己的VMT文件。

现在我们有基础的空白材质。将$basetexture更改为加载此特定VMT对应的VTF的路径和文件名。

位置已在Materials文件夹内。只需复制cdmaterials所使用的内容,并附加纹理名称。你可以添加法线贴图、环境贴图以及其他所有你需要的素材。

不过目前,你需要编辑所有VMT文件,确保至少加载所需的基础纹理和法线贴图(如果你有的话)。

让纹理看起来美观取决于你自己。 要让纹理在HLMV(半条命模型查看器)中显示,需在步骤7.0之前,将你的插件中的materials文件夹复制到你在《求生之路2》中创建的“Mods”文件夹里。 近战武器血迹纹理 14.5 近战武器可以有血迹覆盖层。 你可以制作自己的血迹纹理,或者像Valve那样,让所有近战武器使用相同的“通用”血迹纹理。 简单方法:在你的近战武器的每个VMT文件的最后一个}之前粘贴以下内容,即可轻松添加血迹效果。 $detail "models/infected/hunter/hunter_01_detail" $detailscale "1.75" $detailblendfactor .001 $detailblendmode 0 $detailAmount 0 代理 { 血腥之手 { resultVar $detailAmount } 等于 { srcVar1 $detailAmount resultVar $detailblendfactor } } 精准血迹 要获得与你的近战武器“精准匹配”的血迹纹理,你必须创建一张图像,其中十六进制颜色#757575(RGB 125)的区域可设置为你想要的任何血迹颜色。 基础灰色将叠加到你的武器上。

如何获取纹理取决于你自己。你可以使用Substance Painter(如果你有的话),或者直接从网上粘贴血迹图片到你的武器上。

然后将以下内容粘贴到您的VMT文件中: $detail "【血液纹理路径】" //血液纹理 $detailscale "1" $detailblendfactor .001 $detailblendmode 0 $detailAmount 0 Proxies { BloodyHands { resultVar $detailAmount } Equals { srcVar1 $detailAmount resultVar $detailblendfactor }

是的,大概就是这样了。如果你觉得你的血液纹理效果太淡或几乎看不见,可以使用Photoshop或GIMP将图像多次叠加到自身上,直到血液颜色变得浓郁且深沉。

HUD图标 15.01 Blender IK和HUD预制件包含一个Render.Blend文件,这是我为你制作的预制件,可帮助你轻松创建HUD图像。 打开Render.blend文件。

导入你的武器SMD文件。

删除骨架和格洛克模型。格洛克模型仅作为视觉辅助工具,用于展示预期效果。然后调整武器位置,使其尽可能多地占据相机画面。如有需要,可以缩放模型,这无关紧要。

如果你有多个模型,请快速将它们合并。这样能让操作快一点。 15.02移除所有材质。

注意 - 通道与性能:此保存文件设置为使用GPU(显卡)进行渲染,包含600次AO通道。Blender 3.0不再有专门的AO通道。你可以添加更多通道,或减少通道数量以缩短渲染时间。

下方的性能设置可进一步调整Blender允许使用的线程数量。若你认为自己的电脑无法处理24线程,可将其设为【自动检测】或大幅降低线程数。或者,如果你想根据自己电脑实际的线程数量(无论多少)来调整Blender的线程使用量,也可在此处进行设置。

渲染尺寸:此处的设置为渲染尺寸。如果需要可以进行更改。我们反正会在Photoshop或Gimp中编辑图像。

原始HUD图标尺寸约为64x64像素或124x64像素。如你所见,我的1080图标稍大一些。这是因为我们要对HUD图标进行超级采样,使其看起来更清晰,尤其是在大屏幕上。你可以将100%调整为50%来缩小图标。我个人喜欢将其调大,以便能在创意工坊图片中展示这个渲染效果。按F12键进行渲染并等待完成。完成后,将其保存为未压缩的PNG格式。



15.04返回游戏文件,打开更新后的pak01_dir.vpk文件并导出武器HUD文件。这些文件位于“materials/vgui/hud”目录下。将它们导出到你的武器模组文件夹内的相同目录中。

5月15日:在Photoshop中打开VTF文件并进行放大,直到较短的边达到512像素。可以是512×512或1024×512,也可以更小,这只是我的做法。制作更大的HUD图标会显著增加文件大小,尤其是使用BGRA8888格式时。如果不希望文件过大,请保持默认图像分辨率。

6月15日 导入你的渲染图并调整其位置,使枪支与原图上的枪支重合。确保没有任何内容接触到图像边缘。

15.07 复制渲染层并将副本设为纯白色。然后添加纯黑色背景,并将白色枪支与黑色背景合并。

将此复制到阿尔法通道。

现在由你决定是否要为该图像添加阴影,还是将其设为纯色。《求生之路2》默认使用纯色,但就个人而言,我更喜欢带阴影的效果。如果你想要纯色,将RGB通道调至全白即可。如果你想要阴影,在RGB通道中启用另一个渲染图层。你可能需要使用色阶工具来调亮图像。

无论你选择哪种方式,请将其保存为不带多级纹理的VTF格式。我推荐使用BGRA8888格式,因为它是未压缩的,这意味着白色会准确导出为白色。DXT5压缩会使图像偏蓝。注意:有时Photoshop插件无法保存alpha通道。这种情况下,你需要重新打开导出的VTF文件并重新添加alpha通道。原因不明,但情况确实会发生。如果你使用DXT5导出,还会发现压缩导致VTF文件偏蓝,因此你也需要替换该文件。15.09如果你使用了更高分辨率,请打开VMT文件并添加以下内容:$basetexturetransform "center .5 .5 scale X Y rotate 0 translate .5 .5" 这行代码用于告诉游戏对$Basetexture进行变换,包括缩放、旋转和位置。我们用它来缩小HUD图像。因为与模型不同,HUD纹理如果直接放大就会损坏。如果我们用VMT缩小纹理,纹理本身仍会保持高分辨率且看起来不错,同时还能适配所需的位置。如你所见,缩放使用X和Y轴,我们需要替换它们。使用计算器将当前VTF缩放值除以原始缩放值,然后用结果替换X和Y轴的值。


末尾的“Translate”(平移)功能可对图像进行水平和垂直移动。通常设置为0.5 0.5效果很好,但有时需要微调,比如设为0.7 0.5。总之,保存文件,打包,然后在游戏内测试。

声音 16.01如果你想制作自定义声音,建议将它们打包成一个单独的模组。 大多数人似乎更喜欢使用自己想要的任何声音。 所以你肯定会遇到有人盗用你的模组,然后在没有声音的情况下重新上传。 我已经制作了一个关于这方面的视频指南,不想再制作文字版本了。 该视频是关于制作“任何”声音模组的,但同样适用于枪支声音。 请注意,大多数开火声音位于left4dead2文件夹中,而新的“TLS”换弹声音都在Update文件夹中。 dlc1、dlc2和dlc3中也有一些声音,比如M60和高尔夫球杆的声音,你可以使用。 最好先检查Update文件夹,然后是dlc3、dlc2、dlc1,最后是left4dead2文件夹。 为模组使用最新可用的声音。最终测试与打包 最后一步是在游戏内对武器进行大量测试,确保所有功能都符合预期效果。





好的。 在你完成所有操作前,最后一步: 打开你将用作插件的文件夹。 创建一个名为addoninfo.txt的文件,并填入以下内容: "AddonInfo" { addonversion "1" //最多31个字符,允许包含小数 addontitle "在此处填写标题" //最多127个字符 addonauthor "在此处填写作者名称" //最多119个字符 addonDescription "在此处填写描述" //最多1023个字符 //以下是游戏插件菜单中显示的标签,可用于筛选插件 addonContent_Campaign 0 addonContent_Map 0 addonContent_Skin 0 addonContent_weapon 1 addonContent_BossInfected 0 addonContent_CommonInfected 0 addonContent_Survivor 0 addonContent_Sound 0 addonContent_Music 0 addonContent_Script 0 addonContent_prop 0 }

还有一个addonimage.jpg文件。它只会在插件菜单中显示一个缩略图,仅此而已。 这个文件的设计非常奇怪,显然是开发者没有考虑周全的结果。说实话,我不建议制作这个文件。 addonimage.jpeg只有在它是正方形且手动安装到插件文件夹时才有效。通过创意工坊下载你模组的用户会看到创意工坊缩略图,不过创意工坊缩略图只有在它是矩形时才会显示。但与此同时,矩形的创意工坊缩略图在创意工坊页面上看起来非常难看。看看就知道了。Valve 设计的系统使得那些带有黑边的难看矩形创意工坊图标能在游戏中正常显示,而右侧那些非常精美的方形图标却无法使用,尽管游戏内的图像空间原本是方形的,现在也依然如此。



如果你仍需要附加图片,请将任意方形图片加载到vtfedit中,使用默认的dxt5压缩进行压缩,然后将其导出为名为addonimage.jpeg的jpeg格式图片。 ═══════════════════════════ 最后想说的话。 我花了两天时间编写本指南,同时制作了你所看到的这个模组。 我制作了一个东西,截取了截图并在此处记录了过程。 这意味着如果你严格按照指南操作,应该也需要大约相同的时间。 如果你在制作枪支模组时需要帮助,可以加入【Dead 4 Mods】Discord服务器。那里有包括我在内的一些成员可以为你提供帮助。 看在路西法的份上,请不要加入后就直接私信我寻求帮助。 如果你想加入聊天,我也有自己的Discord服务器。我有时会发布一些正在制作中的图片,但大多是表情包。
2026-02-17 02:03:12 发布在
Left 4 Dead 2
说点好听的...
收藏
0
0
