You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Godot中实现跨场景运行代码?多场景代码方案问询

Godot跨场景持续运行代码的可行方案(除嵌套主场景外)

针对你开发农场游戏时,需要跨场景持续运行代码(比如蔬菜生长逻辑)的需求,除了嵌套主场景的方式,还有以下几种实用方案:

1. 基于Autoload单例承载后台逻辑

Autoload不止能存全局变量,还可以把核心的持续运行逻辑写在里面。把农场数据(蔬菜状态、生长进度等)存在单例里,再在单例的_process或_physics_process方法中处理数据更新,这样不管切换到哪个场景,逻辑都会一直执行。

示例代码:

# globals.gd(已设置为Autoload)
var farm_data = {
    "vegetables": [] # 存储每株蔬菜的生长进度、状态等信息
}

func _process(delta):
    # 遍历蔬菜数据,实时更新生长状态
    for veg in farm_data["vegetables"]:
        if veg.state == "growing":
            veg.growth_progress += delta * 0.1
            if veg.growth_progress >= 100:
                veg.state = "mature"

回到农场场景时,直接读取farm_data里的最新数据刷新UI即可。

2. 保留场景实例在内存中

切换场景时不卸载农场场景,而是把它的实例从场景树移除但保留在内存里,等需要返回时再重新添加到场景树。这样农场场景的所有节点、脚本都会保持运行状态,数据和逻辑都不会中断。

示例代码:

# 农场场景的根节点脚本
func switch_to_shop():
    # 将农场节点从当前场景树移除,保留实例
    get_parent().remove_child(self)
    # 把实例存到Autoload的单例中
    globals.persistent_farm = self
    # 切换到购物场景
    get_tree().change_scene_to_file("res://shop.tscn")

# 购物场景的返回按钮脚本
func on_back_button_pressed():
    # 将保存的农场实例重新添加到场景树
    get_tree().root.add_child(globals.persistent_farm)
    # 切换回农场场景
    get_tree().current_scene = globals.persistent_farm

3. 逻辑与显示分离:独立后台逻辑节点

创建一个专门处理农场逻辑的节点(比如FarmLogic),设置为Autoload或者在游戏启动时添加到场景树根节点。农场场景只负责UI显示,所有数据更新、状态变化逻辑都放在这个独立节点里,通过信号和场景交互。

示例代码:

# FarmLogic.gd(设置为Autoload)
signal vegetable_updated(veg_id, new_state)
var vegetables = {} # key为蔬菜ID,value为状态、进度数据

func _process(delta):
    for veg_id in vegetables:
        var veg = vegetables[veg_id]
        if veg.is_growing:
            veg.growth_progress += delta
            if veg.growth_progress >= 10:
                veg.is_growing = false
                emit_signal("vegetable_updated", veg_id, "mature")

# 农场场景中蔬菜节点的脚本
func _ready():
    FarmLogic.connect("vegetable_updated", self, "_on_veg_updated")

func _on_veg_updated(veg_id, new_state):
    if veg_id == self.veg_id:
        # 根据新状态更新UI
        $Sprite.texture = load("res://mature_veg.png")

切换场景后,FarmLogic会在后台持续运行,返回农场场景时只需重新连接信号就能同步最新状态。

4. 使用线程处理后台任务

对于不需要频繁和场景树交互的逻辑(比如定时更新蔬菜生长进度),可以用Godot的Thread类在后台运行。注意线程中不能直接操作场景节点,只能处理数据,通过信号把结果传回主线程更新UI。

示例代码:

# globals.gd(Autoload)
var farm_thread:Thread
var farm_data = {"vegetables": []}
var should_stop = false

func _ready():
    # 启动后台线程
    farm_thread = Thread.new()
    farm_thread.start(self, "_run_farm_update")

func _run_farm_update():
    while not should_stop:
        # 每0.5秒更新一次数据
        OS.delay_msec(500)
        for veg in farm_data["vegetables"]:
            if veg.state == "growing":
                veg.progress += 5
                if veg.progress >= 100:
                    veg.state = "mature"
                    emit_signal("farm_data_refreshed")

func _exit_tree():
    # 退出游戏时停止线程
    should_stop = true
    farm_thread.wait_to_finish()

这种方式适合低频次的后台任务,能减轻主线程压力,且不受场景切换影响。

内容的提问来源于stack exchange,提问作者Sina R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:28:14