错误 area_set_shape_disabled: Can't change this state while flushing queries. Use call_deferred() o...

在Godot中, 直接调用方法去 修改secne_tree (添加、删除子节点), 处理图形碰撞等都会造成线程不安全,以至报错:area_set_shape_disabled: Can't change this state while flushing queries. Use call_deferred() or set_deferred() to change monitoring state instead.

简单的处理办法就是使用 call_deferred() 调用想要执行的内容。如:

# 变更场景
func changeLevel():
    var curScene = get_tree().get_current_scene()
    remove_child(curScene.gsLttleWitch)
    curScene.remove_child(curScene.gsCurLevelScene)
    curScene.gsCurLevelScene.queue_free()

    curScene.gsCurLevelScene = LevelScene_0102.instance()
    curScene.gsCurLevelScene.add_child(curScene.gsLttleWitch)
    curScene.gsLttleWitch.global_position = Vector2(100, 260)
    curScene.add_child(curScene.gsCurLevelScene)
    
    pass


func _on_Area2D_body_entered(body):
    # 如果碰撞体棋子类
    if body is Pawn :
        # 转场
        # get_tree().change_scene("res://assets/scenes/levels/LevelScene_0102.tscn")
        # 为了线程安全 使用call_deferred调用
        call_deferred("changeLevel")
    pass # Replace with function body.
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。