LINUX.ORG.RU

Некритические ошибки при спавне сцены в Godot

 


0

1

Здравствуйте.

Есть Area2D (сцена EnemySpawner) к которой прикреплен скрипт:

extends Area2D

export(Vector2) var spawn_position

func _on_EnemySpawner_body_entered(body):
	if body.name == "Player":
		var enemy = load("res://Scenes/Enemy.tscn").instance() # Enemy - KinematicBody2D
		enemy.position = spawn_position
		$"../../Enemies".add_child(enemy) # Тут выдает ошибки

и главная сцена, в которой есть экземпляр EnemySpawner.

И вот, при входе игрока в область враг спавнится, но выдает:

body_set_shape_disabled: Can't change this state while flushing queries. Use call_deferred() or set_deferred() to change monitoring state instead.
body_set_shape_as_one_way_collision: Can't change this state while flushing queries. Use call_deferred() or set_deferred() to change monitoring state instead.
body_set_shape_as_one_way_collision: Can't change this state while flushing queries. Use call_deferred() or set_deferred() to change monitoring state instead.

ЧЯДНТ?

Ну так там же написано как надо: некоторые произвольные изменения (не из _process и physics_process) нужно ставить в очередь на следующий тик через call_deferred() для методов и set_deferred() для полей.

$"../../Enemies".call_deffered("add_child", enemy)

Кстати, потом не забывай удалять через queue_free() и вообще поглядывай в отладчик.

if body.name == "Player":

Это сойдёт конечно, но лучше добавить группу и вызывать is_in_group("player").

И почему enemy это KinematicBody2D? Если он управляется только скриптом, правильнее было бы использовать RigidBody2D с нужным mode или вообще StaticBody2D.

InterVi ★★★★
()

И вот что:

  • body_set_shape_disabled
  • body_set_shape_as_one_way_collision

Похоже что-то делается в _ready, оно исправится при правильном добавлении на сцену через call_deffered. Но также можно использовать call_deferred и set_deffered в том коде.

InterVi ★★★★
()