Godot:调用外部方法

2024-03-02

经过大量谷歌搜索,我仍然不明白什么可能是一个简单的解决方案。

场景:“主要”。包含一个 TileMap“Grid”,并附有一个脚本“Grid.gd”。

场景:“玩家”。包含一个 KinematicBody2D“Player”及其附加脚本“Player.gd”

在 Player.gd 中,我需要调用 Grid.gd“_Calculate”中的一种方法,向其传递两个变量,并让它返回一个变量。

var vNewPosition = Grid._Calculate(vPlayer, vInputDirection)

错误:标识符“Grid”未在当前范围内声明。

显然,我需要在某处引用 Grid.gd 脚本来访问它,但我尝试过的许多示例都不起作用。

提前致谢, 乔什


鉴于

主场景有一个 Player 场景的实例

And

在 Player.gd 中,我需要调用 Grid.gd“_Calculate”中的一种方法,向其传递两个变量,并让它返回一个变量。

我给你几个选择。


坏方法

如果玩家知道网格的节点路径,它可以使用get_node为拿到它,为实现它。

onready var _grid = get_node("../../grid")

或类似的东西。

然后使用它:

var vNewPosition = _grid._Calculate(vPlayer, vInputDirection)

这种做法当然是不建议。如果节点路径错误就会中断。


常见的方式

假设玩家不知道节点路径(这更有可能),您可以导出NodePathPlayer.gd 中的变量并使用它来获取网格:

exprort var grid_path:NodePath
onready var _grid = get_node(grid_path)

然后需要将主场景中的Grid Path属性设置为Grid。

这种方法比前一种方法更好,因为它不依赖于网格的路径。然而,它仍然取决于网格的存在。如果在没有 Grid 的情况下 Player 没有任何意义,那么这种方法是可以的。


好办法

如果网格可能存在也可能不存在,并且我们希望 Player 无论如何都能工作,我们可以调整上述方法:

exprort var grid_path:NodePath
onready var _grid = get_node_or_null(grid_path)

并记住在使用之前检查 grid 是否为空:

if grid == null:
    return # or whatever

var vNewPosition = grid._Calculate(vPlayer, vInputDirection)

或者像这样:

var vNewPosition = grid._Calculate(vPlayer, vInputDirection) if grid != null else null

这也允许我们指定一个默认值vNewPosition当没有网格时(null位于该行的末尾)。因此,您可以让 Player 在没有 Grid 时工作,当有 Grid 时它会使用,无论在哪里(因为 Main 告诉它它在哪里)。

这个解决方案并不是完全解耦的,因为Player仍然知道grid是一个有_Calculate。我们还假设有零个或一个,而不是多个。我可以想出一种方法来解决这个问题,但是为了解耦而解耦是没有必要的。我认为这对于您的用例来说已经足够好了。然而,如果您想要过度设计的方式,请告诉我。

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

Godot:调用外部方法 的相关文章

  • 【Godot】对 Godot 节点设计的思考

    对 Godot 中节点设计的思考 单个节点的功能设计的想法 xff0c 体会 Godot 的设计思想 低耦合 设计单个节点可复用的节点时 xff0c 调用方法尽量只对当前节点可获取到的变量或方法进行使用 xff0c 比如我写一个可以控制 K
  • 【Godot 4.0】一个简单的匿名方法的使用lambda

    Godot 4 0 beta3 Godot 4 0 中添加了 lambda 表达式 xff0c 匿名方法等很多方便的特性 xff0c 这里我写个用于扫描目录下所有文件的功能 可以看到代码非常简洁 span class token keywo
  • 戈多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
  • 在 Area2D 中覆盖 KinematicBody2D 运动?

    I m trying to create a windy area within which the player would be pushed continuously to the left lt 到目前为止 这就是我想出的Windy
  • 如何在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 我希望下面的
  • 如何在戈多中使刚体跳跃而不赋予其飞行能力

    我本来会使用运动体 但我想将现实生活中的物理添加到我的 2d 对象中 但似乎我可以通过多次按向上键来飞行 extends RigidBody2D var velocity Vector2 ZERO const GRAVITY 35 cons
  • Godot:调用外部方法

    经过大量谷歌搜索 我仍然不明白什么可能是一个简单的解决方案 场景 主要 包含一个 TileMap Grid 并附有一个脚本 Grid gd 场景 玩家 包含一个 KinematicBody2D Player 及其附加脚本 Player gd
  • 如何克服 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
  • 关闭 Godot 中的游戏

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

随机推荐

  • 有没有办法在 iOS 上自动更新(或只是清除缓存)PWA?

    我一直在 iOS 上努力尝试一些在 Android 上可以轻松运行的东西 让我的 PWA 在有新版本时自动更新 我根本不确定这在 iOS 上是否可行 我使用 vue js 和 Quasar 来构建我的应用程序 一切都可以在 Android
  • 检查用户是否处于特定半径(Flutter)

    我想使用地理位置检查用户是否在他 她的房子里 该应用程序将在前台运行 并且不会显示地图 用户的房屋纬度和经度将存储在 Firestore 中 当用户打开应用程序时 我想检查他 她是否在他的房子里 由于房屋大小可能会有所不同 我会考虑以几米为
  • Rails:如何从服务或队列中监听/拉取?

    大多数 Rails 应用程序的工作方式都是等待来自客户端的请求 然后发挥其作用 但是 如果我想将 Rails 应用程序用作微服务架构的一部分 例如 并进行一些异步通信 服务 A 将事件发送到 Kafka 或 RabbitMQ 队列 而服务
  • 重新加载环境变量而不重新启动Excel?

    我使用该功能Environ 从正在运行的 Excel 实例获取环境变量 当系统中定义了一个新变量时 Excel 在不重新启动之前不会知道它 我的问题是 有什么方法可以获取环境变量的新值而不需要重新启动Excel 测试用例是 Windows搜
  • 使用后删除临时文件

    我需要在 Windows Forms NET 3 5 应用程序中使用一些临时文件 这些文件在外部应用程序中打开 当然该应用程序的运行时间可能比我自己的程序更长 是否有任何最佳实践来确保随时清理这些临时文件 以避免用户的硬盘充满不再需要的 垃
  • array.sort() 在 IE 11 中无法使用compareFunction [重复]

    这个问题在这里已经有答案了 我正在对以下数组进行排序JavaScript 数组 sort 方法 http www w3schools com jsref jsref sort asp 当我使用compareFunction参数 Intern
  • 使用什么工具来比较和减少css样式表

    我有一个页面 page1 html 引用了一个css文件 style1 css 一切都很好 我需要 Page1 html 来另外引用 Style2 css 然而 当我添加引用时 Page1 html 上的一些内容出现了问题 我如何确定导致此
  • 带有networkx的超图

    有人熟悉networkx吗 我尝试获取一个超图 我想将超边设置为列表中的其他彩色节点 大小取决于它们的值 我想将节点设置为其他列表之外 networkx 网站上的文档和示例确实很少 但我确信这是可能的 我开始于这个例子 https netw
  • 如何从 SQL Server 的列中删除不间断空格?

    我正在尝试删除不间断空格 CHAR 160 来自我表中的一个字段 我尝试过使用类似的函数RTRIM 摆脱它 但价值仍然存在 我需要做什么才能从列中删除不间断空格 尝试使用REPLACE http msdn microsoft com en
  • Eonasdan/bootstrap-datetimepicker 日期时间选择器通过外部 javascript 调用重置

    我有用Eonasdan bootstrap datetimepicker 版本 4 17 47 现在解释一下当我从文本框打开 bootstrap datetimepicker 并选择日期时的情况 之后我有一个清除按钮 onclick 我清除
  • 在 Vega Lite 中使用数据作为数组而不是表

    如何在 VegaLite 中使用数组数据 我想将数据用作数组 dates 1 2 3 prices1 1 2 1 prices2 1 5 1 2 而不是 VegaLite 中传统使用的表数据 date 1 price 1 symbol 1
  • 查找包中的所有函数(包括私有函数)

    I know ls package grid and find funs package grid in mvbutils但显然他们都找不到只能在内部或通过以下方式访问的非导出函数和方法 or getAnywhere 我必须在以下位置获取文
  • 我可以在 VS 中构建这个项目,但不能使用 msbuild

    我正在尝试在 nuget 应用程序中构建一个 ms 测试项目 我的项目结构是这样的 MyPackage gt MyPackage gt MyPackageTest 如果我打开 VS 并右键单击并构建 MyPackageTest 它可以工作
  • 找不到与给定名称“@style/Theme.Holo.Light.DarkActionBar”匹配的资源

    平台 4 3 API级别 18 AndroidManifest xml
  • 单击 IE 中图像上方的 div

    我有一个图像 上面可能有一些 div 指定该图像中的某些选择 这些 div 应该是可点击的 像这样的东西 divOuter width 500px height 500px border 2px solid 0000FF position
  • Cheerio / jquery 选择器:如何获取标签 a 中的文本?

    我正在尝试访问网站上的链接 该网站看起来像第一个代码示例 链接位于不同的 div 容器中 div div class class1 div class item class1 a href http www example com 1 ex
  • Spring Boot 的外部库文件夹

    我想知道如何为我的 Spring Boot 应用程序外部化所有 jdbc 驱动程序 我不想在构建应用程序后将 jdbc 驱动程序插入到我的 fat jar 中 有没有办法设置 java vm 参数 通知 jar 执行应包含哪个外部文件夹 或
  • 在 MSBuild 参数中设置应用程序名称

    我正在使用这个从命令行部署我的网络应用程序 msbuild WebApplication1 csproj t Package p configuration release 它工作正常 但部署的应用程序与项目设置页面中使用的名称相同 我想使
  • 在 R 中创建滚动列表

    给定一个向量 数据框的列 我想创建一个滚动向量 l 0 10 将返回 窗口为 3 0 1 2 1 2 3 2 3 4 3 4 5 1 滚动应用 r是一个 9x3 矩阵 其每一行都是所要求的列表元素之一 并且split将其转换为向量列表 尽管
  • Godot:调用外部方法

    经过大量谷歌搜索 我仍然不明白什么可能是一个简单的解决方案 场景 主要 包含一个 TileMap Grid 并附有一个脚本 Grid gd 场景 玩家 包含一个 KinematicBody2D Player 及其附加脚本 Player gd