Zh/Inputs and Outputs: Difference between revisions

From Valve Developer Community
< Zh
Jump to navigation Jump to search
mNo edit summary
m (Setting bug notice hidetested=1 param on page where the bug might not need tested in param specified)
 
(14 intermediate revisions by 8 users not shown)
Line 1: Line 1:
{{otherlang2
{{LanguageBar|title = 输入与输出}}
|title=输入与输出
|en=Inputs and Outputs
|de=Inputs and Outputs:de
|ru=Inputs and Outputs:ru}}


{{toc-right}}
{{toc-right}}


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


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


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


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


== 输出 ==
== 输出 ==


[[File:Output.png|thumb|Hammer的"物体属性(Object Properties)"对话框]]
[[File:Outputs-new.png|thumb|Hammer的"物体属性(Object Properties)"对话框]]


'''输出(Outputs)'''是当一个实体的状态改变时激活的事件。举个例子,一个[[logic_timer|定时器]]达到限定时间时会有一个"输出",按下一个[[func_button|按钮]]时也会有一个"输出",关闭一个[[prop_door_rotating|门]]时同样也会有一个"输出"。
'''输出(Outputs)'''是当一个实体的状态改变时激活的事件。举个例子,一个{{L|logic_timer|定时器}}达到限定时间时会有一个"输出",按下一个{{L|func_button|按钮}}时也会有一个"输出",关闭一个{{L|prop_door_rotating|门}}时同样也会有一个"输出"。


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


"输出"的配置区域是:
"输出"的配置区域是:


; "输出"名字
; "输出"名字
: 决定什么事件能激活这个输出。例如,当一个玩家进入一个[[trigger_multiple]]实体,那么会激活一个'''OnTrigger'''输出。
: 决定什么事件能激活这个输出。例如,当一个玩家进入一个{{L|trigger_multiple}}实体,那么会激活一个'''OnTrigger'''输出。
; 目标实体
; 目标实体
: 实体的名为[[targetname|目标名字]][[classname|类名字]]的会接收"输入"。接受作为搜索通配符的*字符。
: 实体的名为{{L|targetname|目标名字}}{{L|classname|类名字}}的会接收"输入"。接受作为搜索通配符的*字符。
:* 一个大的名字意思是目标名字(targetname)指向多个实体。
:* 一个粗体的名字意思是目标名字(targetname)指向多个实体。
:* 一个红色的名字意思是目标名字(targetname)没有指向任何目标。{{bug|有效的类名字和通配符以及[[Targetname#Keywords|特殊的目标名字]]也会显示为红色。不用担心:引擎会承认它们的!}}
:* 一个红色的名字意思是目标名字(targetname)没有指向任何目标。{{bug|hidetested=1|有效的类名字和通配符以及[[Targetname#Keywords|特殊的目标名字]]也会显示为红色。不用担心:引擎会承认它们的!}}
; "输入"名字
; "输入"名字
: 目标实体上的"输入"会被触发。这也是上下文相关的。举个例子,如果发送一个"输出"给一个门实体,可用的"输入"将会是"关闭(Close)或打开(Open)"。
: 目标实体上的"输入"会被触发。这也是上下文相关的。举个例子,如果发送一个"输出"给一个门实体,可用的"输入"将会是"关闭(Close)或打开(Open)"。
; 参数
; 参数
: 你可以带参数将数据传送给目标实体。一个参数可以是任何东西:用多大的音量播放一个[[ambient_generic|声音]],另一个实体的[[targetname|目标名字]],或者是[[color255|一个颜色]]。这一切都取决于接受什么样的"输入"。如果什么都不接受的话,这个区域将会是灰色的。
: 你可以带参数将数据传送给目标实体。一个参数可以是任何东西:用多大的音量播放一个{{L|ambient_generic|声音}},另一个实体的{{L|targetname|目标名字}},或者是{{L|color255|一个颜色}}。这一切都取决于接受什么样的"输入"。如果什么都不接受的话,这个区域将会是灰色的。
: 一些"输出",如[[math_counter]]的<code>OutValue</code>,自己生成参数。要使用一个已生成的参数,只需要让那个区域的值为<code><none></code>。{{note:zh-tw|如果"输出"值是[[targetname|目标名字]],请记住,它可能不是唯一的!}}
: 一些"输出",如{{L|math_counter}}的<code>OutValue</code>,自己生成参数。要使用一个已生成的参数,只需要让那个区域的值为<code><none></code>。{{Note|如果"输出"值是{{L|targetname|目标名字}},请记住,它可能不是唯一的!}}
; 时间延迟
; 时间延迟
: 在激活"输出"事件之前要等待多少秒。
: 在激活"输出"事件之前要等待多少秒。
Line 46: Line 42:
这是一个如何使用"输入"和"输出"做一个简单的触发器的例子,当玩家进入一个指定的区域时播放声音。
这是一个如何使用"输入"和"输出"做一个简单的触发器的例子,当玩家进入一个指定的区域时播放声音。


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


设置"我的输出名(My output named)"为"<code>OnStartTouch</code>"。这样的话,在游戏里当玩家开始接触到这个固体时,就会产生一个"输出"(从而触发目标)。
设置"我的输出名(My output named)"为"<code>OnStartTouch</code>"。这样的话,在游戏里当玩家开始接触到这个固体时,就会产生一个"输出"(从而触发目标)。
Line 64: Line 60:
Source提供了各种调试工具,用来调试那些工作不正常的I/O连接。
Source提供了各种调试工具,用来调试那些工作不正常的I/O连接。


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


{{bug|有效的类名字和[[Targetname|通配符值]]会标记为错误。不用担心:引擎会承认它们的!}}
{{bug|hidetested=1|有效的类名字和{{L|Targetname|通配符值}}会标记为错误。不用担心:引擎会承认它们的!}}


抛开Hammer不说,游戏里有很多[[Developer console|控制台]]命令和变量可以在运行地图过程中帮助你发现错误。
抛开Hammer不说,游戏里有很多{{L|Developer console|控制台}}命令和变量可以在运行地图过程中帮助你发现错误。


; <code>developer <0-2></code>
; <code>developer <0-2></code>
: [[Developer|开发者模式]]报告所有实体的I/O到控制台,如果你在一个[[dedicated server|专用服务器]]上玩的话,需要启用[[sv_cheats|sv_cheats(作弊)]](下面所有的命令都需要它)。如果你在<code>developer 2</code>模式下,控制台显示的最后一组信息会显示在你的屏幕的左上角。
: {{L|Developer|开发者模式}}报告所有实体的I/O到控制台,如果你在一个{{L|dedicated server|专用服务器}}上玩的话,需要启用{{L|sv_cheats|sv_cheats(作弊)}}(下面所有的命令都需要它)。如果你在<code>developer 2</code>模式下,控制台显示的最后一组信息会显示在你的屏幕的左上角。
; <code>ent_messages_draw <[[bool]]></code>
; <code>ent_messages_draw <{{L|bool}}></code>
: 显示的东西跟开发者(developer)模式一样,除了代替控制台出现的东西外,它还会显示在3D世界里的实体位置上。
: 显示的东西跟开发者(developer)模式一样,除了代替控制台出现的东西外,它还会显示在3D世界里的实体位置上。
; <code>ent_fire <[[targetname|目标名]][[classname|类名]]> <input> <parameter></code>
; <code>ent_fire <{{L|targetname|目标名}}{{L|classname|类名}}> <input> <parameter></code>
: 这个"非常"有用的命令允许你在任何时间手动激活任何实体上的"输入"。如果你想提前解锁一个门,你可以输入<code>ent_fire my_door unlock</code>,如果你懒得用<code>ent_fire my_door open</code>,那么试试这个吧。
: 这个"非常"有用的命令允许你在任何时间手动激活任何实体上的"输入"。如果你想提前解锁一个门,你可以输入<code>ent_fire my_door unlock</code>,如果你懒得用<code>ent_fire my_door open</code>,那么试试这个吧。
: 在Hammer里的"输出目标(output target)区域里",<code>ent_fire</code>支持类名和通配符。像<code>ent_fire npc_* ignite</code>是可以使用的! {{tip:zh-cn|<code>ent_fire</code>是激活特殊的<code>[[!picker]]</code>目标名。用它来触发你在准心下的目标。}}
: 在Hammer里的"输出目标(output target)区域里",<code>ent_fire</code>支持类名和通配符。像<code>ent_fire npc_* ignite</code>是可以使用的! {{tip|<code>ent_fire</code>是激活特殊的<code>{{L|!picker}}</code>目标名。用它来触发你在准心下的目标。}}
; <code>ent_pause</code>
; <code>ent_pause</code>
: 这个命令暂停除玩家外的所有实体;再次提交这个命令来解除暂停。它用来和<code>ent_step</code>搭配使用。
: 这个命令暂停除玩家外的所有实体;再次提交这个命令来解除暂停。它用来和<code>ent_step</code>搭配使用。
Line 84: Line 80:
== 参见 ==
== 参见 ==


* [[Entity Creation|实体的创建]]
* {{L|Entity creation|实体的创建}}
* [[List of entities|实体列表]]
* {{L|List of entities|实体列表}}
* [[Targetname|目标名]]
* {{L|Targetname|目标名}}
* [[User Inputs and Outputs|使用输入和输出]] {{todo|Merge into this article}}
* {{L|User Inputs and Outputs|使用输入和输出}}
* [[AddOutput|添加输出]]
* {{L|AddOutput|添加输出}}


[[Category:Level Design]]
{{ACategory|IO System}}
[[Category:Chinese]]
{{ACategory|Level Design}}

Latest revision as of 07:15, 20 May 2025

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

参见