关于场景准备、GameObject加载和场景加载的问题

在开发过程中,我遇到了以下问题:

  1. 我注意到在场景切换后,游戏对象(GameObject)的动作加载滞后于场景的 ready 节点。具体来说,如果我在脚本的 ready 部分向游戏对象发送信号以触发其对应的动作,我发现这种方法在测试中不可行。因此,我改变了策略:让游戏对象发送信号通知场景完成初始化,然后脚本在动作执行完毕后返回。最初,我使用了相同的动作并将其链接到 AnyStat(以实现此功能),然后再返回到初始动作。但这触发了一个无限循环:信号发射 → 执行 → 信号接收 → 信号发射。后来,我通过创建一套全新的配置解决了这个问题——包括单独的动作和连接。虽然这种方法可行,但它使我的 VS(可视化脚本)动作系统变得笨重且冗余,我尚未找到优化方案。

  2. 还有另一个与场景加载相关的问题。如前所述,在场景切换过程中,游戏对象滞后于脚本的 ready 状态;但在加载过程中,顺序相反。当使用“执行加载”(Execute Load)动作时,游戏对象会先加载,这导致两个问题:

    • 首先,如果场景中的任何脚本使用了 get_tree() 等方法,在接收到 GameManager.on_load 信号时,会抛出错误,提示场景尚未完全加载。
    • 其次,在我尝试通过错开加载过程来防止游戏崩溃后,发现使用 config.load(SAVE_FILE) 等方法的脚本无法正确读取保存的数据。我之前保存的对话信息和进度也无法正确加载。
      我的解决方案是完全避免加载场景,而是仅加载游戏对象的状态、项目变量和开关。对于从标题屏幕加载游戏,我设置了一个额外的项目变量,退出当前场景,并让动作连接检查该变量——这确保了保存数据的加载只有在游戏对象和 ready 状态都完全初始化之后才会执行。由于目前我的游戏只有 2 个场景,这种方法可行,但感觉并不是一种理想的解决方案。

以上就是我在场景加载及相关流程中遇到的当前问题,以及我所采取的临时修复方案。如果您有更好的建议,欢迎随时分享,我们可以进一步讨论。

1 个赞