输入与输出

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)Deutsch (de)Español (es)Polski (pl)Português do Brasil (pt-br)Русский (ru)中文 (zh)Translate (Translate)

输入(Inputs)输出(Outputs)(统称为"I/O")是指地图(en)里的实体(en)之间的通讯。实体拥有两种通讯方法:发送一个"输出"给其他实体,或者从其他实体接收一个"输入"。当一个实体被Kill(移除)的时候,实体可以发送一个"输出"给其他实体的"输入",使其改变颜色。相同的"输出"也可以用于触发另一个实体的刷出(spawning)"输入"。"输出"通过一个"连接"来匹配"输入",它控制了哪些额外的数据被传送到接收者,在接收"输出"之前要延迟多久,并且"输出"是否允许稍后再次发送。"输出"可以连接到任何"输入",反之亦然。这将允许实体间进行复杂,强大的互动。

考虑一下logic_timer(en)实体。它可以配置为当达到时间限制时去"激活"OnTimer"输出","触发" (或叫"调用")一个env_sprite(en)上的ShowSprite"输入"。当定时器达到了时间限制时,动画会出现。通过配置连接属性,你也可以让"输出"延迟2秒后才触发,或者让其只能触发一次。

输入

输入(Inputs)是让一个实体改变其工作的命令。他们由输出"触发"(或叫"调用") - 它们不能直接操作。

你可以查看一个”实体能接收的"输入"事件”的列表,这个列表里的项出现在物体属性对话框(object properties dialog)(en)里的"输入(Inputs)标签页里"。单击"标记(mark)"按钮的话,将会显示出接收这个"输入"的实体。

输出

Hammer的"物体属性(Object Properties)"对话框

输出(Outputs)是当一个实体的状态改变时激活的事件。举个例子,一个定时器(en)达到限定时间时会有一个"输出",按下一个按钮(en)时也会有一个"输出",关闭一个(en)时同样也会有一个"输出"。

"输出"事件是在物体属性对话框(object properties dialog)(en)里的"输出"标签页(Outputs tab)里创建的。这个接口提供了一个已经从实体释放出来的"输出"的列表,配置区域为一个(或多个)当前已选择的,按钮用来创建新的和删除旧的。最后,点击左下方标有"标记(mark)"的按钮,将会显示出当前"输出"的目标实体。

"输出"的配置区域是:

"输出"名字
决定什么事件能激活这个输出。例如,当一个玩家进入一个trigger_multiple(en)实体,那么会激活一个OnTrigger输出。
目标实体
实体的名为目标名字(en)类名字(en)的会接收"输入"。接受作为搜索通配符的*字符。
  • 一个粗体的名字意思是目标名字(targetname)指向多个实体。
  • 一个红色的名字意思是目标名字(targetname)没有指向任何目标。
    Icon-Bug.png错误:有效的类名字和通配符以及特殊的目标名字也会显示为红色。不用担心:引擎会承认它们的!  [todo tested in?]
"输入"名字
目标实体上的"输入"会被触发。这也是上下文相关的。举个例子,如果发送一个"输出"给一个门实体,可用的"输入"将会是"关闭(Close)或打开(Open)"。
参数
你可以带参数将数据传送给目标实体。一个参数可以是任何东西:用多大的音量播放一个声音(en),另一个实体的目标名字(en),或者是一个颜色(en)。这一切都取决于接受什么样的"输入"。如果什么都不接受的话,这个区域将会是灰色的。
一些"输出",如math_counter(en)OutValue,自己生成参数。要使用一个已生成的参数,只需要让那个区域的值为<none>
Note.png注意:如果"输出"值是目标名字(en),请记住,它可能不是唯一的!
时间延迟
在激活"输出"事件之前要等待多少秒。
只激活一次
如果勾选这个,在激活"输出"后,该"输出"会被删除。

设置一个简单的触发器

这是一个如何使用"输入"和"输出"做一个简单的触发器的例子,当玩家进入一个指定的区域时播放声音。

打开一个地图,然后添加一个ambient_generic(en)实体(在名字(Name)区域里,键入"ambient_1")。打开它的物体属性(Object Properties),选择一个要播放的声音文件,之后在Flags标签页,勾上"(一开始无声)Start Silent"。选择"tools/toolstrigger"贴图,然后用这个贴图创建一个方块固体。在这个固体上右击,然后选择"转换成实体(Tie to Entity)(en)"命令,然后选择成trigger_once(en)实体。打开输出标签页,然后点击添加(Add)...按钮。

设置"我的输出名(My output named)"为"OnStartTouch"。这样的话,在游戏里当玩家开始接触到这个固体时,就会产生一个"输出"(从而触发目标)。

使用下拉箭头设置"目标实体名(Targets entities named)"为"ambient_1"。这会让触发器输出的目标指向你先前放置好的ambient_generic

设置"通过这个"输入"(Via this input)"为"PlaySound"。这会选择目标ambient_generic的动作列表里的PlaySound动作,让其开始播放声音。

点击应用(Apply)按钮来保存你对触发器的更改,然后关闭它。现在我们已经设置了触发器,所以一旦玩家接触到它,它会发送一个命令给ambient_generic,让其开始播放声音。

如果你打开ambient_generic的属性,你可以看到触发器的"输出"是如何自动转换成ambient_generic的"输入"的。

如果你想编译和测试你的新触发器,请确保你已经拥有了地图所需的东西(玩家出生点,光照等等),并且已经分配了一个声音效果给ambient_generic

调试

Source提供了各种调试工具,用来调试那些工作不正常的I/O连接。

其中最重要的是物体的属性对话框。无效的输入输出会红色高亮显示在实体的"输入"或"输出"列表,对话框下方的I/O图标也会发生相应的变化。无效的"输出"也会显示在检查问题(en)里(Alt+P)。在每次编译前用这个来检查问题是个不错的主意。

Icon-Bug.png错误:有效的类名字和通配符值(en)会标记为错误。不用担心:引擎会承认它们的!  [todo tested in?]

抛开Hammer不说,游戏里有很多控制台(en)命令和变量可以在运行地图过程中帮助你发现错误。

developer <0-2>
开发者模式(en)报告所有实体的I/O到控制台,如果你在一个专用服务器(en)上玩的话,需要启用sv_cheats(作弊)(en)(下面所有的命令都需要它)。如果你在developer 2模式下,控制台显示的最后一组信息会显示在你的屏幕的左上角。
ent_messages_draw <bool(en)>
显示的东西跟开发者(developer)模式一样,除了代替控制台出现的东西外,它还会显示在3D世界里的实体位置上。
ent_fire <目标名(en)类名(en)> <input> <parameter>
这个"非常"有用的命令允许你在任何时间手动激活任何实体上的"输入"。如果你想提前解锁一个门,你可以输入ent_fire my_door unlock,如果你懒得用ent_fire my_door open,那么试试这个吧。
在Hammer里的"输出目标(output target)区域里",ent_fire支持类名和通配符。像ent_fire npc_* ignite是可以使用的!
Tip.png提示:ent_fire是激活特殊的!picker(en)目标名。用它来触发你在准心下的目标。
ent_pause
这个命令暂停除玩家外的所有实体;再次提交这个命令来解除暂停。它用来和ent_step搭配使用。
ent_step <步骤编号(number of steps)>
当和ent_pause一起使用时,这个命令让实体在再次暂停之前执行一个特定次数的I/O步骤(默认是1)。

参见