按钮已经存在,按下以后另一个游戏对象该如何知道这件事?Godot的Using signals文档先把信号定义为节点在特定事件发生时发出的消息,再说明其他节点可以连接该信号,并在事件发生时调用函数。[1] 这个起点把发出事件的对象、连接关系和接收方的反应分开,便于阅读一段交互逻辑。
原文将信号称为内置的委托机制,用来让一个游戏对象响应另一个对象的变化,并减少两者直接引用造成的耦合。这个描述关注事件联系,而不是要求摘要中预先把所有对象的行为合成一个函数。看到某个节点会发出信号,仍要知道资料中哪些接收方与这个信号建立了联系,才能说明后续反应来自哪里。
文档用游戏角色的生命值条作例子:角色状态变化后,界面上的条需要反映变化。角色状态和界面呈现分别属于场景中的对象,信号将发生的事件传给需要响应的一方。这里是游戏界面说明,不涉及现实健康信息;本文也没有运行角色、按钮或界面代码。
自定义信号一节让事件名称更具体。原文以角色生命值耗尽时的health_depleted等名称为例,并说明信号代表刚刚发生的事件,所以通常采用过去式动作词命名。名称因而帮助读者理解“发生了什么”,而不只是给一个变量贴上任意标签。官方同时说明,自定义信号与内置信号按同样方式工作。
事件还可以带出相关信息。来源说明,信号可以选择声明一个或多个参数,以health_changed的旧值和新值为例。只知道“值发生变化”,与同时取得变化前后两个值,向接收方提供的信息不同。文档也保留了责任边界:参数会在界面中出现,但实际发出时传递正确值仍由代码负责,不能从声明本身认定每次传值已经正确。
信号作为类型的说明补充了这一点。源码指出,自Godot 4.0起,信号与Callable一样是第一类类型,可以直接作为方法参数传递,而不必只把它们表示成字符串。本文据此理解文档里的信号对象,不提供连接代码,也不由类型支持推断线程、性能或某个项目已经成功运行。
本次实际采用的是官方godot-docs的master分支源码;它不能被标成4.5分支的完整正文,也未确认首次发布日期。对游戏引擎资料而言,围绕事件、连接、接收函数及所带参数解释,能够清楚描述消息怎样组织协作,而不将事件已定义、消息已发出和接收反应已验证混为一项结果。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。