Foot Lockers

From Valve Developer Community
Jump to navigation Jump to search
English (en)中文 (zh)Translate (Translate)

求生之路系列求生之路系列 本简体中文页面由Payne酱翻译。

Foot locker(又称物品藏匿点、物品缓存)是在 DLC《短暂时刻》更新时加入的,高度可定制。它们不像《半条命 2》中的弹药箱那样是一种专用实体,而是由现有实体构建而成。实际上,更新中加入的新素材只有模型和音效。这里讨论的是静态持久储物柜、可生成的储物柜,以及包含多种物品类别的储物柜。

静态储物柜

这是最基础的储物柜类型:它会始终存在于地图中(与游戏中随机选择生成的储物柜不同),并会包含关卡设计师决定放入的任意类型物品。

储物柜。Foot locker。

在 Hammer 里看起来不怎么样,对吧?下面是它的制作方法。

1:储物柜模型和碰撞体


储物柜模型。

第一个构建模块是储物柜模型——一个简单的 prop_dynamic。将其插入空白地图(最好以你想要的实例名称保存),并赋予它以下属性(其余保持默认):

  • World Model: models/props_waterfront/footlocker01.mdl - 使用的模型。
  • Name: static_locker - 模型名称会在实例插入地图时按需修正。
  • Start Fade Dist: 1500 - Valve 用于开始淡出储物柜的一般距离。
  • End Fade Dist: 1900 - 在这个距离外,储物柜将不再可见。请确保它在这个距离确实在视野之外,否则你可能看到里面的物品。
  • Collisions: Not Solid - 储物柜模型实际上没有碰撞网格,因此设置此选项可确保游戏内控制台不会报错。
碰撞笔刷。

接下来,放入几个使用 nodraw 纹理的笔刷,让玩家和物体看起来会与储物柜碰撞。Valve 没有给储物柜制作自己的碰撞模型,可能是因为包含碰撞模型需要更昂贵的 VPhysics 计算(因为储物柜是凹形),所以使用笔刷充当储物柜的实体侧面和底座。

碰撞笔刷应厚 2 单位,并沿储物柜边缘放置。为储物柜底座也放一个笔刷很有用。不要忘记将所有笔刷绑定到 func_detail,否则会严重破坏你的 visleaves。

Note.png注意: 你可能想把储物柜的动画设置为打开,以帮助创建碰撞笔刷。在模型属性中,转到“Model”选项卡并选择序列“open”。之后别忘了设回“ref”,因为在此选项卡中更改默认动画可能会导致 Hammer 出问题。

2:储物柜物品及其他实体


储物柜中的物品。

将想要的物品放入储物柜并旋转/摆放它们。我这里用了医疗包和手枪,因为我设计这个储物柜用于战役开头。如果你使用其他物品,最好几乎铺满储物柜模型底部的整个物品层。

如果你使用土制炸弹、燃烧瓶或 Boomer 胆汁这类物品,你会想把它们的“Count”值设为 10,或可能更高。这意味着玩家能在游戏中从每个生成器拿取多个物品;当然,如果你只想要单次拾取(如图中的医疗包),把“Count”值设为 1。

Tip.png提示: 某些物品,例如肾上腺素,默认没有 count 值且只允许单次拾取;可以通过禁用“Smart Edit”并添加一个名为“count”的 KeyValue,值设为你选择的数字来覆盖。

将你添加的所有物品命名为 "static_locker_items"。

储物柜开启音效。

将储物柜动画设回 "ref"(关闭盖子),并在储物柜附近某处添加一个 ambient_generic。位置并不重要,因为我们会在 ambient_generic 的属性中指定声音的原点。

除以下属性外,其余可保持默认:

  • Name: static_locker_snd_open - 这将允许我们稍后触发声音。
  • Sound Name: Trunk.Open - 储物柜开启音效的 声音脚本条目。
  • SourceEntityName: static_locker - 这是 prop_dynamic 储物柜模型的名称。当被触发时,声音将源自储物柜模型本身,而不是 ambient_generic 实体的位置。

生成物品

模板生成器。

接下来,我们需要一个 point_template,以便在需要时生成物品。仅仅勾选物品上的 Must Exist 标志可能会导致其发光效果透过储物柜模型边缘可见,因此 point_template 确保物品只在需要时创建。对于可能存在也可能不存在的储物柜,point_template 允许仅在储物柜存在时生成物品(它被视为一个集合)。

设置 point_template 很简单:

  • Name: static_locker_template - point_template 的名称。
  • Template 1: static_locker_items - 当被触发时,point_template 会在它们对应的生成点上生成我们之前命名的 static_locker_items。

logic_game_event


添加一个 logic_game_event 实体,用于表示储物柜已被打开。推测需要它是因为它不是一个“专用”实体,否则该实体类的每个实例都会触发游戏事件。它可能不在 Hammer 的实体列表(FGD)中,因此添加一个不同的实体(例如 info_target),并在下拉框中将其名称改为 logic_game_event。你可能需要手动添加这些 KeyValues:

  • Key: targetname,Value: static_locker_event - 实体的名称。
  • Key: eventName,Value: foot_locker_opened - 此实体被触发时将触发的游戏事件名称。
  • Key: spawnflags,Value: 1 - 不知道这个标志有什么用。为了保险,我从 Valve 的地图中复制了这些值。

用于打开储物柜的 func_button。

现在用一个笔刷围住储物柜,并将其绑定到 func_button 实体。按钮使用 nodraw 纹理。它通常应从储物柜模型每侧向外延伸约 4 单位(当然底部除外,底部应与储物柜底座平齐)。

以下属性需要更改:

  • Name: static_locker_button - 以便你随时可以通过输入锁定/解锁按钮。
  • Glow Entity: static_locker - 当玩家在按钮范围内并看向它时,储物柜的 prop_dynamic 模型会发光,吸引玩家打开它。

需要设置以下 spawnflags:

  • Don't Move.

按钮还需要以下 outputs:

  • OnPressed, static_locker -> SetAnimation: opening.
  • OnPressed, self -> Kill.
  • OnPressed, static_locker_snd_open -> PlaySound.
  • OnPressed, !activator -> Speakresponseconcept: OpenLocker.
  • OnPressed, static_locker_template -> ForceSpawn.
  • OnPressed, static_locker_event -> FireEvent.

所有这些都需要勾选 "Fire Once Only"(仅触发一次)框。逐条解释:

1. 设置储物柜模型的动画以打开它。动画会自动停止,因此无需再发送另一个输入来停止。
2. 移除 func_button,这样它就不能再次被按下,也不会挡住箱子顶部、妨碍玩家拾取物品。
3. 播放储物柜开启音效。
4. 告诉“打开”储物柜的角色(按下按钮的那个)说一句台词,主要是告诉其他玩家他们找到了物品。
5. 在储物柜内部生成物品。
6. 向导演触发游戏事件。仅当你遵循了上面的可选步骤 5.5 时才包含此输出。

info_remarkable


info_remarkable。

最后一步是添加一个 info_remarkable,让引擎知道角色发现储物柜时应该说话。设置以下属性:

  • Name: static_locker_remarkable - 实体的名称。
  • Subject Context: WorldFootLocker - 告诉游戏角色应该说些与发现储物柜相关的话,比如“我们打开它吧”之类的。

3:测试

你的储物柜应该看起来类似这样:

游戏中的储物柜。

编译并加载你的地图,在游戏中测试你的储物柜。

可生成的储物柜

可生成储物柜与静态储物柜类似,只有少量修改。

多种物品

在《短暂时刻》中,一个储物柜可以拥有随机化的物品生成类型。例如,与其在一回合中出现过多 止痛药,某个特定储物柜的内容物可能改为包含大量 燃烧瓶。这只需要多几个实体和修改。

待完善: 完成文章(步骤、图片、测试、精简,最后庆祝游戏中有多样化的储物柜存在)。

预制件

下载从《短暂时刻》中提取的储物柜。