在Godot中, 直接調用方法去 修改secne_tree (添加、刪除子節(jié)點), 處理圖形碰撞等都會造成線程不安全,以至報錯: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() 調用想要執(zhí)行的內容。如:
# 變更場景
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.