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

Godot开发挖矿游戏时已设置矿脉位置仍生成在(0,0)如何解决

问题根源

  • 节点_ready执行顺序错误:Godot中节点被加入场景树(执行add_child)时就会触发自身的_ready函数,你当前的代码逻辑是先把矿脉实例加入场景树,再修改它的坐标,这时候gen_vein在坐标修改前就已经执行完毕,读取到的global_position自然是默认值(0,0)
  • 冗余坐标设置:你同时修改了矿脉实例自身的global_position和它内部Position2D子节点的坐标,但矿脉生成逻辑里用的是矿脉节点自身的全局坐标,修改内部Position2D的坐标不会对生成逻辑产生任何作用,属于无效代码。

解决方案

方案1(最简便,适配当前需求)

调整实例化逻辑顺序,先设置坐标再把节点加入场景树,保证_ready触发时坐标已经配置完成,修改后主场景的循环逻辑如下:

func _ready():
    for x in load_x:
        for y in load_y:
            var emerald_vein_inst = emerald_vein.instance()
            # 先设置坐标,再加到场景树
            emerald_vein_inst.global_position = Vector2(x * offset, y * offset)
            add_child(emerald_vein_inst)
            # 原来修改内部position2d的两行代码无效,可以直接删除

方案2(适配后续动态更新矿脉的需求)

如果后续需要支持矿脉生成后动态修改位置、重新生成内容,可以手动触发生成逻辑:

  1. 先修改绿宝石矿脉脚本,删除_ready中对gen_vein的调用:
func _ready():
    selfnoise.seed = chunksettings.noise.seed
    selfnoise.octaves = chunksettings.noise.octaves
    selfnoise.persistence = chunksettings.noise.persistence
    selfnoise.lacunarity = chunksettings.noise.lacunarity
    # 删掉这里原有的gen_vein()调用
  1. 再修改主场景逻辑,设置完坐标后手动触发矿脉生成:
func _ready():
    for x in load_x:
        for y in load_y:
            var emerald_vein_inst = emerald_vein.instance()
            add_child(emerald_vein_inst)
            emerald_vein_inst.global_position = Vector2(x * offset, y * offset)
            # 延迟调用确保节点初始化完成后再执行生成逻辑
            emerald_vein_inst.call_deferred("gen_vein")

内容的提问来源于stack exchange,提问作者Blue Robin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:09:05