输入与输出

From Valve Developer Community
< Zh
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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错误:有效的类名字和通配符以及特殊的目标名字也会显示为红色。不用担心:引擎会承认它们的!
"输入"名字
目标实体上的"输入"会被触发。这也是上下文相关的。举个例子,如果发送一个"输出"给一个门实体,可用的"输入"将会是"关闭(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)会标记为错误。不用担心:引擎会承认它们的!

抛开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)。

参见