Zh/Use: Difference between revisions
(Created page with "{{LanguageBar|Use|title=使用功能}} {{TabsBar|main=gs|base=Use}} {{toc-right}} 所有实体都有一个<code>Use</code>{{L|input|输入}},尽管许多实体对此不做响应。任何实体都可以设置自定义使用功能(参见{{↓|Programming}}),如果没有自定义功能则默认行为是将使用操作转发给实体的{{L|parent|父级}}。通常,使用功能执行玩家与实体交互时期望的操作(例如开门/关门、拾取物理对象)。有...") |
(→玩家使用逻辑) |
||
Line 20: | Line 20: | ||
* {{hl2}} - [https://github.com/ValveSoftware/source-sdk-2013/blob/39f6dde8fbc238727c020d13b05ecadd31bda4c0/src/game/server/hl2/hl2_player.cpp#L2824-L2950] | * {{hl2}} - [https://github.com/ValveSoftware/source-sdk-2013/blob/39f6dde8fbc238727c020d13b05ecadd31bda4c0/src/game/server/hl2/hl2_player.cpp#L2824-L2950] | ||
* {{tf2}} - [https://github.com/ValveSoftware/source-sdk-2013/blob/39f6dde8fbc238727c020d13b05ecadd31bda4c0/src/game/server/tf/tf_player.cpp#L20581-L20592] | * {{tf2}} - [https://github.com/ValveSoftware/source-sdk-2013/blob/39f6dde8fbc238727c020d13b05ecadd31bda4c0/src/game/server/tf/tf_player.cpp#L20581-L20592] | ||
* {{asrd}} - [https://github.com/ReactiveDrop/reactivedrop_public_src/blob/3f55ae9c37064d7d1013feb63c81e64656e24a33/src/game/shared/swarm/asw_player_shared.cpp#L1169-L1341] | * {{asrd}} - [[https://github.com/ReactiveDrop/reactivedrop_public_src/blob/3f55ae9c37064d7d1013feb63c81e64656e24a33/src/game/shared/swarm/asw_player_shared.cpp#L1169-L1341]] | ||
== 编程实现 == | == 编程实现 == |
Latest revision as of 05:35, 29 June 2025
所有实体都有一个Use
输入 ,尽管许多实体对此不做响应。任何实体都可以设置自定义使用功能(参见Programming ↓),如果没有自定义功能则默认行为是将使用操作转发给实体的父级 。通常,使用功能执行玩家与实体交互时期望的操作(例如开门/关门、拾取物理对象)。有几种调用方式:
1. 玩家看向实体并执行+use
控制台命令(通常绑定到E键)
2. 实体输出 指定Use
输入,或不指定任何输入
3. firetarget作弊 命令(直接调用_Use方法_,类型为USE_TOGGLE)
4. 在代码中直接调用C++函数
控制台变量
控制台变量/命令 | 参数或默认值 | 描述符 | 效果 |
---|---|---|---|
sv_debug_player_use | 0 | bool | 可视化+use逻辑。绿色十字=追踪成功,红色十字=距离过远,绿色方框=半径范围内成功 |
玩家使用逻辑
([待完善] 总体描述) 由玩家实体的PlayerUse方法定义。[1] 可能被覆盖:
编程实现
虽然始终存在Use
输入[5]和_Use方法_[6](作为CBaseEntity的一部分),但实际的_Use函数_初始为null。此处的_Use函数_指m_pfnUse
字段设置的函数,可通过SetUse( void *SomeFunc(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) )
随时分配。_Use函数_还必须在实体的数据描述 中使用DEFINE_USEFUNC ( our_func )
定义。

CBaseEntity::Use
方法仅检查是否设置了_Use函数_(即m_pfnUse
非null),如果设置了则调用;否则如果有父级则调用父级的_Use方法_。许多实体通常重写_Use方法_而非设置_Use函数_。设置_Use函数_的优势在于可以动态更改为不同函数,例如响应输入时。
使用类型
定义于shareddefs.h
typedef enum
{
USE_OFF = 0,
USE_ON = 1,
USE_SET = 2, //表示我们传递了一个值
USE_TOGGLE = 3
} USE_TYPE;
I/O中的使用类型
在映射时无法通过I/O系统指定USE_TYPE
或value
。
Use输入使用outputID属性指定USE_TYPE。这意味着只能通过在代码中将AcceptInput或AddEvent函数的outputID参数设为所需USE_TYPE来指定。玩家执行使用操作时[7]如此设置,USE_TYPE基于实体的ObjectCaps 。
outputID参数作为USE_TYPE也导致以下行为:
- ent_fire将outputID设为0,意味着通过它触发的use始终为USE_OFF类型
- 当前游戏会话中第一个加载的输出(具有outputID 1)触发的use输入为USE_ON,第二个为USE_SET,第三个为USE_TOGGLE,其余通常被解释为USE_TOGGLE
- firetarget直接以USE_TOGGLE类型调用Use函数

创建仅含npc_grenade_frag的地图,设置4个输出 |