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(适配后续动态更新矿脉的需求)
如果后续需要支持矿脉生成后动态修改位置、重新生成内容,可以手动触发生成逻辑:
- 先修改绿宝石矿脉脚本,删除
_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()调用
- 再修改主场景逻辑,设置完坐标后手动触发矿脉生成:
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
相关产品推荐
相关产品推荐

