Zh/Entity Hierarchy (parenting): Difference between revisions
Freezing2688 (talk | contribs) No edit summary |
(根据新的内容更新了翻译 update translation) |
||
Line 1: | Line 1: | ||
{{ | {{lang|Entity Hierarchy|title=实体层级(依赖关系)}} | ||
|title=实体层级(依赖关系) | |||
}} | |||
本简体中文页面由 [[User:GlrWere|Gloria]] 汉化。 | 本简体中文页面由 [[User:GlrWere|Gloria]] 汉化。 | ||
当一组实体“绑定(Parented) | 当一组实体“绑定(Parented)”到一起时,所有层级的实体就能严格一致地运动,表现得如同一个单独的物理对象。每个下层实体(child-entity)都会跟随上层实体(parent)的运动。 | ||
举个简单的例子,将一个 [[light_dynamic]] 实体绑定到一个实体类型为[[prop_physics|物理实体]]的台灯模型上,当台灯运动时,光源就会随台灯一起运动。 | |||
绑定关系始终都在下层实体的[[HammerObjectPropertiesDialog|对象属性]]中设定,上层实体无法控制绑定关系。(对英语用户来说)这种形式导致了文档中不得不使用反身动词(Parented)的形式进行说明,例如“必须被绑定到”“绑定下层实体到上层实体上”“实体可以有上层实体”这类神奇的表述。 | |||
* | *注:“parented”直译为“以xxx为双亲”。个人建议翻译成“绑定”,符合原意且易于说明和理解。 | ||
所有的实体都可以设置 parent 属性,尽管其中的一些[[Non-FGD features|在FGD中并不包含这个属性]],而且通常它们即便设置了 parent 也不一定能正常生效。例如,将 [[prop_physics]] 绑定到其他实体上时会表现得很奇怪,因为它们的运动是物理系统负责的;而对于一个 [[logic_relay]] 实体来说,它们既不会自己运动,也不可见,因此绑定它也没什么意义。对于物理实体来说,建议用 [[prop_dynamic]] 或 [[prop_dynamic_override]] 作为替代,或是使用[[constraint|物理约束系统]]。 | |||
{{warning:zh-cn | 单组/单串嵌套的实体层级中最多允许 '''512''' 个实体 {todo:zh-cn|如果超过上限会怎么样?}}}} | |||
* ''' | == 下层实体特性(Child Behavior) == | ||
* '''偏移量(Offset)''' 指的是实体与上层实体在绑定时的相对位置(以及角度)。虽然偏移量会一直保持不变,下层实体的运动将会完全与上层实体的运动平行,并且在上层实体旋转时,绕着上层实体的原点“公转”。只有 ''SetParentAttachment'' 事件输入能够''修改''偏移量;它会将实体立即“传送”并维持在上层实体的绑定点上。 | |||
* | * '''碰撞箱(Collision)''' :下层实体自身的碰撞体在绑定后会被忽略,因此在上层实体运动时,可能会出现穿墙或其他穿模问题。受脚本控制的运动例如动画、或是基于笔刷的实体,它们的碰撞箱仍然存在,因此你可以用各类笔刷实体来构建复杂的运动机械。 | ||
* 当上层实体收到 '''Killed''' 事件并被移除时,它当前的所有下层实体都将被从游戏中移除。 | |||
* | |||
== | * 如果下层实体没有定义与用户交互的事件,如(+USE)或是触碰,这些事件会被'''向上传递'''到上层实体。利用这一机制,我们可以将一个 [[prop_dynamic]] 绑定到一个 [[func_button]] 上;当用户对着 prop_dynamic 模型按下 +USE 键(使用键)时,实际上是在与按钮交互。 | ||
* | ==Parentname 属性== | ||
在两个实体间创建绑定关系的方法是,将下层实体的 <code>parentname</code> 属性设置为上层实体的'''[[targetname|实体名称]]'''。 | |||
* 维持偏移量。 {{bug:zh-cn|[[Counter-Strike: Source|反恐精英:起源]] 中部分实体的 <code>parent</code> 属性存在异常。取而代之的是使用 [[logic_auto]] 实体,然后在地图开始时调用 <code>SetParent</code> 事件进行绑定。}}{{bug:zh-cn| 在 [[Half-Life 2: Deathmatch|半条命2:死亡竞赛]]的Linux专用服务器中,实体可能会丢失绑定。因此,强烈建议使用 [[logic_auto]] 实体,并在输出中添加“<code>OnMapSpawn child SetParent parent</code>”(其中:child 表示下层实体名称,parent 表示上层实体名称)}} | |||
* 此外,如果要绑定到[[attachment|附着点(attachment point)]]上,可以通过 <code>parent,attachment</code> 的参数形式来进行设定。附着点的作用是,让其它实体可以绑定到某个模型的动画部分,例如{{l4d}}中的榴弹炮曲柄上。这种设置方法和 | |||
<code>SetParentAttachmentMaintainOffset</code> 类似。 | |||
[[File:L4D Handle prop Following attachment.gif|thumb|榴弹炮的手柄是一个单独的实体,它会跟随榴弹炮模型的 "Handle" [[$attachment|绑定点]]运动。]] | |||
== SetParent 输入事件 == | |||
你可以在实体上[[Inputs_and_Outputs|触发]]一个 '''SetParent''' 输入事件来更改绑定。 | |||
* 将上层实体的 ''targetname'' 作为 SetParent 的输入参数,来把子实体绑定到新的父实体上。 | |||
* 如果参数一栏为空,则它的效果与 ''ClearParent'' 输入事件相同(见下方)。 | * 如果参数一栏为空,则它的效果与 ''ClearParent'' 输入事件相同(见下方)。 | ||
* 能够保持偏移量。 | * 能够保持偏移量。 |
Revision as of 02:50, 21 October 2022
本简体中文页面由 Gloria 汉化。
当一组实体“绑定(Parented)”到一起时,所有层级的实体就能严格一致地运动,表现得如同一个单独的物理对象。每个下层实体(child-entity)都会跟随上层实体(parent)的运动。
举个简单的例子,将一个 light_dynamic 实体绑定到一个实体类型为物理实体的台灯模型上,当台灯运动时,光源就会随台灯一起运动。
绑定关系始终都在下层实体的对象属性中设定,上层实体无法控制绑定关系。(对英语用户来说)这种形式导致了文档中不得不使用反身动词(Parented)的形式进行说明,例如“必须被绑定到”“绑定下层实体到上层实体上”“实体可以有上层实体”这类神奇的表述。
- 注:“parented”直译为“以xxx为双亲”。个人建议翻译成“绑定”,符合原意且易于说明和理解。
所有的实体都可以设置 parent 属性,尽管其中的一些在FGD中并不包含这个属性,而且通常它们即便设置了 parent 也不一定能正常生效。例如,将 prop_physics 绑定到其他实体上时会表现得很奇怪,因为它们的运动是物理系统负责的;而对于一个 logic_relay 实体来说,它们既不会自己运动,也不可见,因此绑定它也没什么意义。对于物理实体来说,建议用 prop_dynamic 或 prop_dynamic_override 作为替代,或是使用物理约束系统。
下层实体特性(Child Behavior)
- 偏移量(Offset) 指的是实体与上层实体在绑定时的相对位置(以及角度)。虽然偏移量会一直保持不变,下层实体的运动将会完全与上层实体的运动平行,并且在上层实体旋转时,绕着上层实体的原点“公转”。只有 SetParentAttachment 事件输入能够修改偏移量;它会将实体立即“传送”并维持在上层实体的绑定点上。
- 碰撞箱(Collision) :下层实体自身的碰撞体在绑定后会被忽略,因此在上层实体运动时,可能会出现穿墙或其他穿模问题。受脚本控制的运动例如动画、或是基于笔刷的实体,它们的碰撞箱仍然存在,因此你可以用各类笔刷实体来构建复杂的运动机械。
- 当上层实体收到 Killed 事件并被移除时,它当前的所有下层实体都将被从游戏中移除。
- 如果下层实体没有定义与用户交互的事件,如(+USE)或是触碰,这些事件会被向上传递到上层实体。利用这一机制,我们可以将一个 prop_dynamic 绑定到一个 func_button 上;当用户对着 prop_dynamic 模型按下 +USE 键(使用键)时,实际上是在与按钮交互。
Parentname 属性
在两个实体间创建绑定关系的方法是,将下层实体的 parentname
属性设置为上层实体的实体名称。
- 维持偏移量。 Template:Bug:zh-cnTemplate:Bug:zh-cn
- 此外,如果要绑定到附着点(attachment point)上,可以通过
parent,attachment
的参数形式来进行设定。附着点的作用是,让其它实体可以绑定到某个模型的动画部分,例如中的榴弹炮曲柄上。这种设置方法和
SetParentAttachmentMaintainOffset
类似。

SetParent 输入事件
你可以在实体上触发一个 SetParent 输入事件来更改绑定。
- 将上层实体的 targetname 作为 SetParent 的输入参数,来把子实体绑定到新的父实体上。
- 如果参数一栏为空,则它的效果与 ClearParent 输入事件相同(见下方)。
- 能够保持偏移量。
SetParentAttachment输入事件
Template:Note:zh-cn 你还可以在子实体上触发一个 SetParentAttachment输入事件,将它绑定到父实体的某个特定的附着点上。参数为附着点的名称。
- 子实体会立即“传送”到附着点的位置。这是唯一一种无法保持偏移量的方法。
SetParentAttachmentMaintainOffset输入事件
Template:Note:zh-cn 你还可以在子实体上触发一个 SetParentAttachmentMaintainOffset输入事件 将它绑定到父实体的某个特定的附着点上。这部分的作用与 SetParentAttachment输入事件 完全一致,区别在于这个方法将会保持子实体绑定到父实体时的偏移量不变。
- 能够保持偏移量不变,但子实体将会跟随附着点运动、旋转而不是父实体的实体原点。
ClearParent输入事件
你还可以在子实体上触发一个 ClearParent输入事件 来解除父子实体的绑定。这个事件仅会将子实体从它当前的父实体上“解除绑定”、“分离”,这样子实体就能够独立于父实体运动(或是不运动)了。
KillHierarchy输入事件
Template:Note:zh-cn 如果在父实体触发一个 KillHierarchy输入事件,会将父实体以及它所有的子实体从世界移除。
- 如果在父实体触发一个 Kill 输入事件,也可以将父实体和它的子实体从世界移除。... ?

FollowEntity()函数
程序开发者可以使用 FollowEntity()
以控制绑定关系。
绑定的相关教程(俄文)
教程由 Project-S 制作。