触发器

From Valve Developer Community
< Zh
Revision as of 04:10, 29 June 2025 by WoShiGeNiCheng (talk | contribs) (→‎另见)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
English (en)Русский (ru)中文 (zh)Translate (Translate)

触发器是能对其他实体存在作出响应的entity。地图制作者可以创建触发器brush(en)和触发器网格(en),而程序员可以将任何对象设为触发器。

Note.png注意:触发器中的Angles键值会在游戏中使其旋转。这可能有用,但如果残留未删除也会造成问题。

地图设计

tools/toolstrigger

Hammer中可以创建多种类型的brush entity(en)触发器,完整列表见⧼PrefixIndex/trigger/zh⧽。最常用的通用触发器包括trigger_oncetrigger_multipletrigger_looktrigger_proximity,它们共享以下属性和输出:

tools/toolstrigger:所有触发器实体必须在所有面使用此材质。也可使用%CompileTrigger创建自定义触发器材质。
Note.png注意:触发器可以使用不含%CompileTrigger的材质(触发器始终为非固体且不可见),但使用%CompileTrigger可避免浪费光照贴图。
过滤器:可使用Filters(en)来限制能激活触发器的对象。
过滤属性:属性(Flags)选项卡(en)提供了一系列无需额外实体的简单过滤选项。
OnStartTouch
OnEndTouch
当符合过滤条件的实体进入/离开触发器时触发(无论是否通过其他检测)。进入或离开的实体作为!caller传递。
OnStartTouchAll
OnEndTouchAll
同上,但仅在无其他(过滤后)实体接触触发器时触发。
OnTouching
OnNotTouching
响应TouchTest输入触发的输出。所有触发器都支持,但多数FGD(en)未列出。
OnTrigger:当实体满足所有触发条件时触发。
Warning.png警告:对于trigger_once,该输出不同于OnStartTouchOnStartTouchAll。不可重置的触发器激活后会在0.1秒后自毁,在此期间OnStartTouch仍可能被重复触发。

另见

编程

所有实体都能响应与其他实体的碰撞(参见Touch())。如需无实际碰撞的接触检测,有两种方案:

SetSolid(SOLID_NONE) AddSolidFlags(FSOLID_TRIGGER)
使实体在物体穿过时接收接触事件
CollisionProp()->UseTriggerBounds(true,iBloatSize)
为实体创建超出其bounding box(en)的"触发器框"(X/Y方向扩展iBloatSize单位,+Z方向扩展iBloatSize/2)。该框与世界坐标对齐且不受实体固体性和碰撞组影响,使用ent_bbox命令时显示为浅蓝色方框。
Valve对所有可拾取物品使用触发器框,扩展尺寸为24(这个数值大得惊人)。

笔刷

要创建使用笔刷模型形状(而非边界框)检测的新触发器,需继承CBaseTrigger并调用InitTrigger()