输入与输出
输入(Inputs)和输出(Outputs)(统称为"I/O")是指地图 里的实体 之间的通讯。实体拥有两种通讯方法:发送一个"输出"给其他实体,或者从其他实体接收一个"输入"。当一个实体被Kill(移除)的时候,实体可以发送一个"输出"给其他实体的"输入",使其改变颜色。相同的"输出"也可以用于触发另一个实体的刷出(spawning)"输入"。"输出"通过一个"连接"来匹配"输入",它控制了哪些额外的数据被传送到接收者,在接收"输出"之前要延迟多久,并且"输出"是否允许稍后再次发送。"输出"可以连接到任何"输入",反之亦然。这将允许实体间进行复杂,强大的互动。
考虑一下logic_timer 实体。它可以配置为当达到时间限制时去"激活"OnTimer
"输出","触发" (或叫"调用")一个env_sprite 上的ShowSprite
"输入"。当定时器达到了时间限制时,动画会出现。通过配置连接属性,你也可以让"输出"延迟2秒后才触发,或者让其只能触发一次。
输入
输入(Inputs)是让一个实体改变其工作的命令。他们由输出"触发"(或叫"调用") - 它们不能直接操作。
你可以查看一个”实体能接收的"输入"事件”的列表,这个列表里的项出现在物体属性对话框(object properties dialog) 里的"输入(Inputs)标签页里"。单击"标记(mark)"按钮的话,将会显示出接收这个"输入"的实体。
输出
输出(Outputs)是当一个实体的状态改变时激活的事件。举个例子,一个定时器 达到限定时间时会有一个"输出",按下一个按钮 时也会有一个"输出",关闭一个门 时同样也会有一个"输出"。
"输出"事件是在物体属性对话框(object properties dialog) 里的"输出"标签页(Outputs tab)里创建的。这个接口提供了一个已经从实体释放出来的"输出"的列表,配置区域为一个(或多个)当前已选择的,按钮用来创建新的和删除旧的。最后,点击左下方标有"标记(mark)"的按钮,将会显示出当前"输出"的目标实体。
"输出"的配置区域是:
- "输出"名字
- 决定什么事件能激活这个输出。例如,当一个玩家进入一个trigger_multiple 实体,那么会激活一个OnTrigger输出。
- 目标实体
- 实体的名为目标名字 或类名字 的会接收"输入"。接受作为搜索通配符的*字符。
- 一个粗体的名字意思是目标名字(targetname)指向多个实体。
- 一个红色的名字意思是目标名字(targetname)没有指向任何目标。
- "输入"名字
- 目标实体上的"输入"会被触发。这也是上下文相关的。举个例子,如果发送一个"输出"给一个门实体,可用的"输入"将会是"关闭(Close)或打开(Open)"。
- 参数
- 你可以带参数将数据传送给目标实体。一个参数可以是任何东西:用多大的音量播放一个声音 ,另一个实体的目标名字 ,或者是一个颜色 。这一切都取决于接受什么样的"输入"。如果什么都不接受的话,这个区域将会是灰色的。
- 一些"输出",如math_counter 的
OutValue
,自己生成参数。要使用一个已生成的参数,只需要让那个区域的值为<none>
。注意:如果"输出"值是目标名字 ,请记住,它可能不是唯一的! - 时间延迟
- 在激活"输出"事件之前要等待多少秒。
- 只激活一次
- 如果勾选这个,在激活"输出"后,该"输出"会被删除。
设置一个简单的触发器
这是一个如何使用"输入"和"输出"做一个简单的触发器的例子,当玩家进入一个指定的区域时播放声音。
打开一个地图,然后添加一个ambient_generic 实体(在名字(Name)区域里,键入"ambient_1
")。打开它的物体属性(Object Properties),选择一个要播放的声音文件,之后在Flags标签页,勾上"(一开始无声)Start Silent"。选择"tools/toolstrigger
"贴图,然后用这个贴图创建一个方块固体。在这个固体上右击,然后选择"转换成实体(Tie to Entity) "命令,然后选择成trigger_once 实体。打开输出标签页,然后点击添加(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图标也会发生相应的变化。无效的"输出"也会显示在检查问题 里(Alt+P)。在每次编译前用这个来检查问题是个不错的主意。
抛开Hammer不说,游戏里有很多控制台 命令和变量可以在运行地图过程中帮助你发现错误。
developer <0-2>
- 开发者模式 报告所有实体的I/O到控制台,如果你在一个专用服务器 上玩的话,需要启用sv_cheats(作弊) (下面所有的命令都需要它)。如果你在
developer 2
模式下,控制台显示的最后一组信息会显示在你的屏幕的左上角。 ent_messages_draw <bool >
- 显示的东西跟开发者(developer)模式一样,除了代替控制台出现的东西外,它还会显示在3D世界里的实体位置上。
ent_fire <目标名 或类名 > <input> <parameter>
- 这个"非常"有用的命令允许你在任何时间手动激活任何实体上的"输入"。如果你想提前解锁一个门,你可以输入
ent_fire my_door unlock
,如果你懒得用ent_fire my_door open
,那么试试这个吧。 - 在Hammer里的"输出目标(output target)区域里",
ent_fire
支持类名和通配符。像ent_fire npc_* ignite
是可以使用的!提示:ent_fire
是激活特殊的!picker
目标名。用它来触发你在准心下的目标。 ent_pause
- 这个命令暂停除玩家外的所有实体;再次提交这个命令来解除暂停。它用来和
ent_step
搭配使用。 ent_step <步骤编号(number of steps)>
- 当和
ent_pause
一起使用时,这个命令让实体在再次暂停之前执行一个特定次数的I/O步骤(默认是1)。