Godot 监听来自同一场景的多个实例的信号

2023-12-26

我有以下场景: 玩家 敌人 攻击

当攻击与敌人发生碰撞时,敌人会发出“onHit”信号。

播放器监听该信号并反弹。

这一切都运行良好,但现在如果我复制敌人,因此有多个敌人场景,我如何收听所有敌人的信号?有没有办法获取场景的所有实例并连接到它们的所有信号?有没有更好的方法将此消息发送回玩家?

我对戈多很陌生,所以任何建议都非常有帮助!谢谢。


使用信号总线。

是的,您可以迭代节点并找到所有敌人(例如通过比较他们的脚本)。然而,如果所有的敌人都将自己注册到一个列表(或一个组)中,那就更容易了_ready。但是,您不需要这些。

见解是这样的:一个物体可以发出其他物体的信号。

我们通过创建信号总线来利用这一点。这是 Godot 中的常见模式。其过程如下:

  • 创建一个自动加载(单例) https://docs.godotengine.org/en/stable/getting_started/step_by_step/singletons_autoload.html脚本。让我们称之为SignalBus.

  • 在脚本中,定义信号。没有别的。 *在我们的例子中,我们定义on_hit:

    signal on_hit
    
  • 每个需要发出信号的地方都是通过信号总线来实现的。在这种情况下,敌人会这样做:

    戈多 3 或 戈多 4

    SignalBus.emit_signal("on_hit")
    

    或者使用新的 Godot 4 语法:

    SignalBus.on_hit.emit()
    
  • 在需要处理信号的地方,连接到它。例如关于_ready. 像这样的事情:

    Godot 3

    func _ready() -> void:
        SignalBus.connect("on_hit", self, "_on_hit")
    
    func _on_hit() -> void:
        # whatever
        pass
    

    Godot 4 遗留语法(此语法简化了代码升级)

    func _ready() -> void:
        SignalBus.connect("on_hit", Callable(self, "_on_hit"))
    
    func _on_hit() -> void:
        # whatever
        pass
    

    在 Godot 4 中,我们可以简单地将方法引用作为Callable:

    func _ready() -> void:
        SignalBus.connect("on_hit", _on_hit)
    
    func _on_hit() -> void:
        # whatever
        pass
    

    或者使用新的 Godot 4 语法:

    func _ready() -> void:
        SignalBus.on_hit.connect(_on_hit)
    
    func _on_hit() -> void:
        # whatever
        pass
    

这样,信号的发射器和接收器不需要彼此了解。他们只需要知道信号总线。它随处可用(由于是自动加载)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Godot 监听来自同一场景的多个实例的信号 的相关文章

  • 【Godot】行为树(一)了解与设计行为树代码

    行为树介绍 行为树是个节点树 xff0c 父节点通过不断遍历子节点 xff0c 根据不同类型的节点执行不同的分支 最终调用叶节点执行功能 行为树也不难理解 xff0c 他就像代码逻辑一样 xff0c 只是用节点的方式展现出来 xff0c 而
  • 【Godot 4.0】一个简单的匿名方法的使用lambda

    Godot 4 0 beta3 Godot 4 0 中添加了 lambda 表达式 xff0c 匿名方法等很多方便的特性 xff0c 这里我写个用于扫描目录下所有文件的功能 可以看到代码非常简洁 span class token keywo
  • Godot 4 源码分析 - 文件读入编码处理

    今天需要读入xml文件进行处理 结果读入一个带中文的文件时 出错了 当然程序还能运行 但编译器一直报错 而且XML解析也不正确 单步调试发现读入的内容出现乱码 具体逻辑 String FileAccess get as text bool
  • 关于在windows使用msys2 + mingw + gcc/g++ 编译godot的笔记

    关于在windows使用msys2 mingw gcc g 编译godot的笔记 编译参数 1 target release debug release debug 2 多线程参数 j数字 3 profile是自定义构建参数 可以启用或者禁
  • 戈多3.2.1。刷新查询时无法更改此状态。使用 call_deferred() 或 set_deferred() 来更改监控状态

    在我的 2D 游戏中 玩家能够摧毁箱子 具有两种碰撞形状的物体 当被摧毁时 板条箱会产生也具有碰撞形状的物品 但是当调用以下函数时 Godot控制台中会显示许多类似的错误 Code func on Crate item dropped co
  • 如何创建没有 setter 函数的 getter 函数?

    我的脚本中有多个导出的变量 每当更改一个变量时 我想调用一个通用的 getter 并让值自动设置 tool export float var sample1 setget smthn changed export float var sam
  • 合并多个精灵节点?

    例如 假设我有 2 个精灵节点 但也可以超过 2 个 如下所示 每个人都有自己独立的图像我想要的是将它们组合起来并用单个图像创建一个新的精灵节点 在工具模式下 like this 也许可以通过使用Image 毫无疑问涉及计算 或者也许使用一
  • 如何检测 Godot 中的碰撞?

    我有3个场景 一个名为 KinematicBody2D tscn 的 KinematicBody2D 节点 该场景是一个玩家在屏幕上从左向右移动 我还有一个名为 mob tscn 的场景 它是一个igidbody2d节点 这个场景只有精灵和
  • (Godot 引擎)用 Tilemap 瓷砖填充 2D 多边形

    我在 Godot 引擎中遇到一个无法解决的问题 怎么可能 在代码中 用图块填充 Polygon2D 区域 我尝试过获得点位置 使用 2D for 循环遍历线的顶点 但我无法理解这一点 这是我期待的结果的模型 我有解决方案 有一点 hacky
  • 如何在Godot 4.0游戏引擎中实现可组合的角色/技能系统?

    我目前正在使用 Godot 尝试 MOBA 风格游戏的原型 我正在努力寻找一种管理角色及其技能的方法 所有角色都将具有相似的属性 姓名 生命值 奔跑速度 力量等 然而 所有角色的技能都会有所不同 尽管有些角色非常相似 例如基于投射物的技能将
  • Godot 监听来自同一场景的多个实例的信号

    我有以下场景 玩家 敌人 攻击 当攻击与敌人发生碰撞时 敌人会发出 onHit 信号 播放器监听该信号并反弹 这一切都运行良好 但现在如果我复制敌人 因此有多个敌人场景 我如何收听所有敌人的信号 有没有办法获取场景的所有实例并连接到它们的所
  • 在 godot 游戏引擎中使用不同的编程语言?

    我想要将不同的编程语言绑定到 Godot 游戏引擎 有关于这个主题的指导文件或视频吗 例如 这个项目是如何完成的 戈多锈 https github com godot rust godot rust 如果我能学习基础知识 我就能成功地用不同
  • 安卓:应用程序未安装

    这里是新手 我用Godot游戏引擎制作了我的第一个游戏并成功导出到android 复制到我的手机上 它安装并运行良好 几个小时后 我做了一些更改并再次导出 再次复制了 apk 但现在当我尝试安装它时 它没有完成安装 我多次尝试更改导出设置
  • 如何获取另一个场景godot中的节点?

    我正在制作一个具有多个场景的游戏 需要有 get node 来自另一个场景的节点 变量 并且我不知道如何从另一个场景获取节点 如果我理解正确的话 您想连接到来自另一个场景中的节点的信号 直接方法会起作用 const bullet prelo
  • 如何在 Godot 中将字符串转换为枚举?

    使用 Godot 3 4 我的枚举设置为 enum STRENGTH DEXTERITY CONSTITUTION INTELLIGENCE WISDOM CHARISMA 我希望能够使字符串 STRENGTH 返回枚举值 0 我希望下面的
  • 如何克服 Godot 将按钮字体更改为默认颜色的问题?

    我正在使用 Godot 4 我在容器中手动创建了很多按钮 我在主场景中设置了一个颜色变量 tempcol 当我单击带有 tempcol 设置的按钮时 比如 Color Red 按钮的字体颜色更改为白色 似乎是默认字体颜色 但是当我单击另一个
  • 传递Physics2DShapeQueryParameters 层进行检查

    我目前正在为我的 2D 自上而下游戏开发一个构建系统 最后一步是检查是否有任何物体 例如树或玩家 阻碍了物品的放置 经过一些研究后 我发现使用Physics2DShapeQueryParameters 是正确的方法 我唯一的问题是我不知道如
  • 同一节点的碰撞检测和重叠检测? [第2部分]

    的延续上一个问题 https stackoverflow com questions 71608423 collision detection and overlapping detection in same node 71622366
  • 如何应用着色器并仅生成图像一次?

    我正在尝试将像素化着色器应用于我的纹理 并且我只需要将其应用一次 之后我可以一遍又一遍地重复使用我的着色器生成的图像作为纹理 而不必每次都进行计算 那么我如何拍摄一些图像 gt 应用着色器并在每次游戏加载时仅渲染它们一次 gt 并将它们用作
  • 关闭 Godot 中的游戏

    我正在使用 Godot 创建网页游戏 为了关闭游戏 我尝试使用 get tree quit 如果我在 IDE 上使用它 它就可以工作 当我在我的服务器上尝试它时 导出项目后 它不起作用 我确信导出设置没问题 我怎样才能关闭游戏 并且 如何添

随机推荐

  • SAS LOOP - 从具有值的记录创建列

    假设我有随机诊断代码 例如 001 v58 142 如何从记录中的代码构造列 Input id found code 1 1 001 2 0 v58 3 1 v58 4 1 003 5 0 v58 15000 0 v58 Output id
  • Twilio 在打电话时说动词

    基于这个问题 https stackoverflow com questions 6863305 twilio say verb nested into a dial verb 它非常接近我想要的 当双方建立连接时 我们尝试在通话期间触发
  • 从 Apache Velocity 模板访问常量值?

    是否可以从 Velocity 模板访问常量值 即 Java 类中定义的公共静态最终变量 我希望能够写出这样的东西 if a lt Long MAX VALUE 但这显然不是正确的语法 有很多种方法 1 您可以将值直接放入上下文中 2 您可以
  • 如何优化 MySQL 更新查询?

    我有一个包含 300 000 条记录的表 在此表中有重复的行 我想更新列 flag TABLE number flag more column ABCD 0 ABCD 0 ABCD 0 BCDE 0 BCDE 0 我使用此查询
  • 限制 Django 模型中的递归外键深度

    我有一个 Django 模型 其中 self 的外键可为空 我有兴趣对递归深度引入硬限制 例如 10 哪里是检查这个的正确位置以及我应该在那里抛出什么样的异常 我的意思的伪示例 def limit recursion depth self
  • Apache mod_rewrite 未将表达式映射到参数

    我有一个网站使用apache mod rewrite并且在过去 6 个月里一直工作 没有出现任何错误 我有以下重写规则 RewriteRule products a z products php category 1 NC L 这是我页面中
  • WooCommerce:将自定义 Metabox 添加到管理订单页面

    我目前已成功向我的 WooCommerce 产品页面添加一个字段 该字段显示值 在购物车 前端 中 在结账页面 前端 在订单页面 前端 并在管理个人订单页面 后端 中 问题 它没有在管理订单 自定义字段 Metabox 中显示为自定义字段及
  • 如何在无限行模型中设置初始起始页?

    我使用的是带有无限行模型和分页功能的 Ag Grid 版本 20 0 0 我希望能够设置第一次加载的初始页面 但我没有看到任何允许我自定义它的属性 他们只提供方法paginationGoToPage更改页面 但此方法要求首先加载网格 这迫使
  • 如何在sql server management studio 2012中创建复合外键

    我可以通过选择两列 OrderId CompanyId 并右键单击并设置为主键 在 sql server management studio 2012 中成功创建复合主键 但我不知道如何使用 sql server management st
  • Firebase 测试实验室对 Appium 的支持

    有谁知道 Firebase 测试实验室是否支持 Appium 测试框架 至少在路线图中吗 由于 Firebase 由 Google 提供支持 因此您很难指望它会优先支持开源社区驱动的框架 而 Appium 正是如此 目前 Firebase
  • 共享指针如何工作?

    共享指针如何知道有多少指针指向该对象 在本例中为shared ptr 基本上 shared ptr有两个指针 一个指向共享对象的指针和一个指向包含两个引用计数的结构体的指针 一个用于 强引用 即具有所有权的引用 另一个用于 弱引用 即不具有
  • Google Play Install Referrer API 与 INSTALL_REFERRER 广播

    最近Google发布了Google Play Install Referrer API 公告 https android developers googleblog com 2017 11 google play referrer api
  • 类库项目文件未编译为 .dll 或调试

    在我的解决方案中 我有一个编译成 dll 的类库项目 我有一个网络项目 我有多个具有不同网络项目但具有相同类库的解决方案 类项目中的文件之一 utilities cs 突然不会编译到 dll 中 我对此文件进行了更改 但更改不会显示在网站上
  • 在 Swift 3 中获取 GCD 标签

    我有一些代码可以获取当前 GCD 队列的标签以用于日志记录 在 Swift 2 中如下所示 if let queueName String UTF8String dispatch queue get label DISPATCH CURRE
  • 调用对象数组时出现空引用异常[重复]

    这个问题在这里已经有答案了 我早些时候试图获得一些帮助 但我认为我没有提供足够的信息 尽管我很感谢所有的建议 目标只是将对象室的新实例添加到数组中并打印到列表框 当用户尝试输入已经存在的房间名称时 它应该简单地显示在数组中已经存在的房间的规
  • JQuery Datepicker - 仅选择星期一和星期四

    我有以下代码 仅允许用户从 jquery datepicker 选择星期一 我想对此进行调整 以便能够选择星期一和星期四 有任何想法吗 beforeShowDay function date return date getDay 1 您可以
  • 如何在引导列之间添加边距而不换行[重复]

    这个问题在这里已经有答案了 我的布局目前看起来像这样 在中心列中 我想在每个之间添加一个小边距Server分区但是 如果我向 CSS 添加边距 它最终会换行并看起来像这样 div class row info panel div class
  • 如何在不运行两个单独的进程调用的情况下获取 DBI 中的行计数?

    我正在 Perl 中运行 DBI 但无法弄清楚当我运行准备好的语句时如何确定返回的行计数是否为 0 我意识到我可以在 while 循环中设置一个计数器来获取行 但我希望有一种不那么丑陋的方法来做到这一点 基于快速浏览here http ww
  • 网站阻止 Selenium:有办法绕过吗?

    该网页手动打开正常 但使用 Selenium 时直接出现 维护 错误消息 from selenium import webdriver driver webdriver Chrome executable path chromedriver
  • Godot 监听来自同一场景的多个实例的信号

    我有以下场景 玩家 敌人 攻击 当攻击与敌人发生碰撞时 敌人会发出 onHit 信号 播放器监听该信号并反弹 这一切都运行良好 但现在如果我复制敌人 因此有多个敌人场景 我如何收听所有敌人的信号 有没有办法获取场景的所有实例并连接到它们的所