Targetname

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)Hrvatski (hr)中文 (zh)Translate (Translate)

Targetname is a base Keyvalue available in all 起源 起源 games. 目标名称(或者叫“名称”)顾名思义,即一个实体的名字。名字不是实体存在的必要条件,但通常来讲,实体必须得有一个名字,才能被运用到IO系统(en)中.

注意事项

  • 实体也可以通过其类名(en)(比如prop_dynamic)来成为IO中的被触发实体
  • 实体名称并不需要唯一性,它们之间可以共用同一个名字(其输出也会触发到所有同名实体上),多个实体共用的名称会被加粗
  • 实体名称不能包含!或者*字符,具体原因详见下文
  • 如果你打算将其他实体绑定到该实体上,则名称中不能包含,因为这被用于绑定到父实体模型上的附着点(en)

实例

  • 实例(en)可以自动给实体名称添加前缀或后缀,以避免重名可能导致的问题。如果未指定前缀名称,则将自动添加
  • 前缀与原始实体名称之间使用单个破折号进行分割,例如hall_a3-door_02
  • @为起始字符的实体名称(例如@exit_door)不会被添加前缀。即:如果@exit_doorexit_door_relay是前缀为Door_01的实例的一部分,则最终名称为@exit_doorDoor_01-exit_door_relay.

玩家事件

在大多数多人游戏中,任何使用以下名称的实体在出现对应事件时,都会收到Use(en)输出

  • game_playerdie - 每当player死亡时触发,死亡的玩家将作为!activator
  • game_playerkill - 每当player杀死另一个玩家时触发,杀手将作为!activator.
  • game_playerjoin - 每当player加入游戏时触发,加入游戏的玩家将作为!activator.
    Icon-Bug.png错误:机器人(en)不会触发该事件  [todo tested in ?]
  • game_playerspawn - 每当player出生时触发,出生的玩家将作为!activator.
    Icon-Bug.png错误:该事件在反恐精英:起源反恐精英:全球攻势军团要塞2中无效  [todo tested in ?]
  • game_playerleave - 每当player离开游戏时触发,在这种情况下因为玩家实体不存在,所以!activator不会有任何效果
证实:哪些游戏可以使用game_playerjoingame_playerspawn事件?
Tip.png提示:军团要塞2求生之路2中,使用Vscript(en)的事件Hook可以获取游戏事件的更多信息(例如攻击者死亡)。对应的事件分别为player_spawnplayer_deathplayer_disconnect.

匹配名称

在搜索实体时,起源可以使用一些扩展匹配功能,这些功能在各种情况下都很有用,可用于定位未知实体或仅知晓部分名字的实体,并且普遍用于IO系统中, 但它们也可以用于通过实体键值来定位实体,例如filter_activator_name/class(en)的Filter键值,或者实体绑定的父实体(en),这些扩展匹配功能是:

  • 通配符
起源一定程度上支持使用*通配符. 这意味着area1*将匹配任何名字开头为area1的实体,;例如area1_portal或者area1_door,但area2_door则不会被匹配,这种通配符还仅限用于名字末端*,这意味着更复杂的格式(比如*_doorarea*_door)没有效果
Note.png注意:Mapbase Mapbase支持完整的通配符系统,例如*_doorarea*_doorar*a*_d*r?通配符等,Mapbase还允许在IO系统中使用正则表达式
Note.png注意:Hammer无法识别大多数通配符格式,将其视为无效IO,但在实际游戏中可用

IO系统(en)还支持使用实体类名进行匹配,这使用了上面列出的所有相同的扩展匹配功能。起源的其他部分也支持类名匹配,但除非另有说明,否则通常情况并非如此。

Tip.png提示:尽管部分情况下不可信,但大多数游戏的VScript(en)支持迭代独立实体,字符串差异比较,正则表达式等,几乎允许任何类型的名字匹配

关键词

以下特殊目标名称可用于动态选择实体。

Note.png注意:并非所有实体参数都可以使用这些关键词,例如SetParent输出可以使用!activator关键词,但是玩家实体的SetFogController输出不能使用!activator/!caller关键词,而是使用雾实体的实际名称
!activator
触发整个IO链的起始实体
  如果玩家走进一个触发器(en),触发了logic_relay,那么玩家就是Relay的!activator
!self
触发当前输入链的实体
  如果玩家走进了一个触发器,导致logic_relay被触发,那么Relay自身就是!self
特例: 
!caller
触发当前输出链的实体
如果玩家走进了一个触发器,导致logic_relay被触发,那么触发器就是Relay输出的!caller
特例: 
Note.png注意:单个输出可以覆盖!caller指定的实体,这是通过point_entity_findermath_counterlogic_case和过滤器实体实现的
!player
指向玩家
  在多人游戏中,这指向的是第一个加入服务器的玩家
Note.png注意:当匹配实体名称时,其行为符合预期,即如果实体是玩家则进行匹配
Tip.png提示:如要匹配游戏内的所有玩家,请使用实体类名player进行匹配
Icon-Bug.png错误:在传送门2中,使用parentname参数进行实体绑定会在地图启动时导致实体无法绑定  [todo tested in ?]
PlacementTip.png解决方案:使用logic_auto(en)触发SetParent输入代替
!player_blue(存在于 传送门2 之中)
在传送门2合作模式中,这指向ATLAS(1号玩家)
!player_orange(存在于 传送门2 之中)
在传送门2合作模式中,这指向P-Body(2号玩家)
!pvsplayer
在实体的预渲染范围(en)内发现的第一个玩家,所使用的预渲染范围取自进行搜索的实体,如果没有搜索实体,则关键词返回的结果为!activator,如果!activator也不存在,则关键词返回的结果为!player
!picker
玩家准星下的第一个实体;通常仅用于调试。没有碰撞的实体只能通过瞄准其原点来选择
  在多人游戏中,这仅对第一个加入游戏的玩家有效

FindNamedEntity关键词

以下关键词仅可用由FindNamedEntity使用,这是一种NPC特有的匹配方法,只能通过特定系统进行搜索(例如场景编排)而不能被IO系统使用

待完善: Mapbase Mapbase 可将其用于IO系统。其他分支也有这种情况吗?
!speechtarget
由于“看向演员(en)”或“面朝演员(en)事件”,!caller正在观察的实体
!friend
!caller最近的友好NPC,如果NPC没有继承CAI_PlayerAlly类,这将返回玩家作为结果
!enemy
当前!caller的敌人

关键词注意事项

  • 对于特定输入,!activator!caller返回的结果可能会有差异,这取决于每个输入的实现方法,这通常不被推荐使用,例如math_counterGetValue输出
  • 当输出指定的触发实体为空时,!self不会被设置为!caller返回的结果
  • 用于输出覆盖参数的实体名称,由接收输出的实体而不是发送输出的实体评估。

参见


小作品

这篇文章是一个小作品,您可以帮助我们完善它。