UI计数器值在场景间不传递

你好!

我有一个关于硬币计数器 UI 元素的问题,该元素用于显示收集到的硬币数量。问题是,当切换到新场景时,数值会消失,不再显示数字。返回上一个场景也无法恢复数值,它们会完全消失。

我已经搜索了相关主题并阅读了 UI 教程,但没有找到解决方案。如果有人能指点我正确的方向,我将不胜感激。

谢谢!

在修改任何内容之前,最好将这个问题拆分为两个部分,因为它们在屏幕上看起来相同,但修复方法不同。

是数值消失了,还是仅显示消失了?在场景切换后,请通过非该 UI 元素的途径(例如调试打印输出或第二个临时标签)读取硬币数值,并查看其内容。如果数值仍然正确,说明计数本身存活了下来,但元素与该数值的绑定关系出现了问题。如果显示为零,说明数值本身未能保留。

这一点很重要,因为存在于场景中的 UI 元素会随场景的创建而创建、随场景的销毁而销毁,因此附加在元素上的任何数据在离开场景时都会丢失。要让计数器持续正常工作,必须满足两个条件:计数值必须存储在比场景更持久的位置,并且在新场景开始时,新元素必须指向该值,因为新创建的元素会使用其初始默认值,而不是你上一次设置的值。

如果测试表明数值已保留,请检查元素被指示读取哪个值的位置,并确保该逻辑在场景开始时运行,而不仅仅是在游戏启动时运行一次。

1 个赞

UI 没问题。它在场景间保持持久化(即每个场景中都有每个 UI 元素的实例)。但是,UI 元素中的数值消失了。即使收集了更多金币,它也不再显示数值。计数器显示的数值来源于玩家身上的一个变量。默认情况下,总收集量变量不会在控制台中显示。据我所知,AGM 似乎没有简单的方法将变量值添加到控制台显示中。我想这是一个足够简单的 GDScript,所以我会通过编写代码来确保该变量在场景过渡时保持持久化。

然而,这仍然留下了数值消失的问题。我理解如果目标玩家变量在过渡时被清除,值就会消失,但为什么当收集新金币时它不重新出现呢?我有其他 UI 元素可以顺利传递它们的数值。唯一的区别是这个元素显示的是数值。

要在不编写任何代码的情况下查看数值,我的 F1 调试器提供了针对项目和对象作用域的开关和变量列表,你可以在游戏运行时分页浏览:[Plugin] Baz F1 Debugger

目前金币计数存储在哪里?如果它是玩家身上的一个对象变量,我建议将其改为数据库中的项目变量(Project Variable)。项目变量不绑定到特定场景,因此它们可以跨越场景过渡而保留,并且 UI 元素可以从任何场景读取同一个变量。

关于拾取另一个金币时数值没有恢复的问题,我在想是否是因为显示元素指向了玩家对象,而在场景过渡时丢失了该目标。如果它在场景加载时解析了一次对象,之后再也找不到它,那么即使计数功能仍然正常工作,它也无法显示任何内容。你能截图展示一下 UI 元素的设置吗?主要是它被设置为什么目标以获取数值?

2 个赞

感谢Baz提供的插件!我想我会经常用到它。至于将硬币计数设为项目变量,有人能指点我一下最好的方法吗?当然,我会自己摸索一下,但我不熟悉在AGM或Godot中设置项目变量和数据库的正确流程。看来是时候学习了 :smiley:

项目变量:

1 个赞

非常感谢!比我想象的要容易得多

@Baz 好的,我已经折腾了一阵子了,尽管看起来一切都没问题,但它就是不工作。使用调试器时,系统正在统计收集到的所有硬币,并在场景切换时保持总数。我已经将变量从玩家切换到项目,并指向所有关联的脚本来反映这一更改。

对于 UI 计数器:

对于硬币本身:

唯一的改变是现在 UI 计数器完全不显示任何数值了。

而且不知为何,当我运行游戏时,你的状态跟踪器会抛出错误。

同样,任何帮助都将不胜感激。

看报错应该是没有连接上信号,这个要手动连接一下

1 个赞

这里可能有很多问题需要排查。能否将项目发送到 pgmmv-support@gotchagotcha.jp,以便我们进一步调查?

1 个赞

项目已发送。非常感谢您愿意查看。

感谢发送项目,我已经让计数器正常工作了。

你的硬币、coins 项目变量以及 Coin_counter 对象上的 Display Text 设置都是正确的。问题出在 Lvl_01_01_Ruined_City1 和 Lvl_01_01_Ruined_City2 中放置的 Coin_counter 上。这两个场景保存了你切换变量之前的 Display Text 设置副本,而那个副本仍然指向玩家身上的旧 Gold Coins 变量。现在那个变量已经不存在了,所以它们没有内容可显示。Lvl_01_Ghostwood_North 没有保存的副本,计数器在那里无需任何修改就能正常工作。

要在你的端修复这个问题,请打开两个 Ruined City 场景,从 UI 层中删除 Coin_counter,然后从 coin_counter.tscn 拖入一个新的。它们的位置都是 (187, 30)。如果其他场景也显示空白计数器,请在那些场景中也执行相同的操作。

为了避免将来再次出现这个问题,我建议保持“允许放置的对象更改动作设置”的选项处于关闭状态,除非其中一个确实需要不同。当该选项开启时,每个放置的对象都会保留自己的副本,后续对该对象所做的更改无法影响到它。我认为一旦关闭该选项,编辑器就不再显示这些旧副本,这也就是为什么你看起来一切正常的原因。

State Tracker 的错误来自我的插件,而不是你的项目。它在场景启动时抱怨一次,指出某个 GameObject 没有它所监听的信号。这不会影响任何功能,我会尽快修复该插件。

1 个赞

非常感谢!真的很感激您为此付出的时间。我迫不及待地希望将其部署并运行起来。

这解决了进入新区域时的问题,再次感谢!但是,当返回到已经探索过的区域时,金币计数又会消失。我似乎还是无法弄清楚原因。如果您有任何建议,我将不胜感激。

很抱歉我附上了 Lvl_01_Ghostwood 文件,该文件并不在当前问题范围内(它有自己的问题,哈哈)。

如果取消勾选“场景结束后保持状态”,即可正常工作:

1 个赞

你太棒了!再次感谢!:vulcan_salute:

1 个赞