CS2 指令系统(一):实体与IO系统

Junity 发布于 9 天前 193 次阅读 最后更新于 9 天前 1257 字 预计阅读时间: 6 分钟


AI 摘要

本文深入解析CS2指令系统,重点介绍实体(Entity)概念与IO交互机制。涵盖实体类型(逻辑实体、模型实体)、创建方式(ent_create/give)、命名规则(类名/目标名),以及通过IO系统实现input/output互联的方法(ent_info/ent_fire),帮助开发者精准控制游戏对象行为。

前言

现在网上对于cs2指令的介绍大多局限于仅仅介绍指令本身,而没有对cs2对指令系统有较为深入的讲解,本文的目的是让读者更加深入地了解指令系统。

Valva开发文档

本文不可能将所有技术细节全部展示,例如,本文会介绍什么是实体,但不会将实体一一列出,对于想要进一步了解的读者,请在Valve的 开发者文档中进一步查找。

实体(Entity)

实体是存在于游戏中的对象,类似Unity中的GameObject。实体不一定是玩家可见的,例如,cs2中可以安放炸弹的区域实际上是一个 func_bomb_target 实体。在起源引擎的文档中,实体被分为很多类,我们主要关注下面几类:

  1. 逻辑实体(Logic Entity):用于控制游戏进程的实体,例如有一个叫做 vote_controller 的实体负责控制投票系统。
  2. 模型实体(Model Entity):模型实体就是有3D模型的实体,大多数有碰撞体积的东西都属于这类。
    每个实体都有自己的 类名(classname) 来表示这个实体属于什么类型,例如,沙鹰的实体类名叫做 weapon_deagle 。实体还有自己的 目标名(targetname) ,同一类的实体可以有不同的目标名来作区分。

特殊的目标名

游戏中有一些特殊的目标名来指代特定的实体,以方便书写指令:

  1. !picker:指代准星指向的实体。
  2. !caller:指代一个output的发送者,见下文
  3. !activator:指代一个input的接受者,见下文
  4. !player:第一个加入游戏的玩家

创建实体

我们可以用 ent_create 指令来创建一个实体。实体会在准星指向的位置被创建。这个指令的语法如下:

ent_create <实体名称> <参数1名称> <参数 1> <参数2名称> <参数 2>...<参数N名称> <参数 N>

这里的 参数 是指在创建实体时,可以进行配置的参数。这一项可以在文档中某个实体页面的 KeyValues 小节找到。例如,对于鸡🐔(chicken),可以设置的参数有 SetBodyGroup (模型),那么我们可以用下面的指令来创建一个兔耳小鸡:

ent_create chicken SetBodyGroup 4

创建实体也可以用 give 指令实现,与 ent_create 不同,give 会将实体创建在玩家脚下,并且无法指定参数。由于cs中玩家会默认捡起地上的武器,因此这个指令可以达到给予玩家武器的效果。

IO系统

实体间的交互使用一个叫 IO 的机制来完成。每个实体都有自己的 Input 和 Output。有编程基础的读者可以理解为 Qt 中的信号槽。

其中,Input 可以理解为实体接受消息的接受器,外界可以向实体发送这些消息来改变实体的行为。例如,可以对门实体发送 use 这个input来开关它;而Output可以理解为实体发送信号的发送器,实体会在需要的时候发送这些信号,例如一个定时器实体会在时间到时发送“时间到”这个信号。

在CS2中,我们可以将实体的output与另一个实体的input相连,实现特定的逻辑效果。

查询可用的IO

我们可以使用 ent_info 来查找一个实体可用的Input和Output:

ent_info weapon

手动触发Input

使用 ent_fire 指令可以手动触发实体的Input,语法为:

ent_fire <实体的类型名/目标名> <input名称> <可选参数> <可选延迟>

这里的类型名或目标名支持 通配符 。这里的可选延迟指在多少秒后应用这个input。

连接input与output

连接input与output是使用实体的 "AddOutput" 这个Input实现的,语法为:

ent_fire <实体的类型名/目标名> AddOutput "<实体的output名> <接受者的目标名>:[接受者的input名]:[参数覆盖]:[延迟的秒数]:[可以执行的次数]"

其中,接受者指input被实体的output连接的另一个实体。例如:A的output连接到了B的input,那么B就是接受者。接受者的input可以不填,默认为 use

特殊用法:修改对象属性

由于AddOutput的实现方式,它也可以用于修改对象的属性,这里的属性和上面创建实体时的参数含义相同,语法为:

ent_fire <实体的类型名/目标名> AddOutput "<属性名> <属性值>

但并不是所有属性都能用这个方式修改成功。

此作者没有提供个人介绍。
最后更新于 2025-06-21