Gogot 引擎错误问题:"body set shape disabled" 和 "body set shape as one-way collision"

Gogot Engine error issue: "body set shape disabled" and "body set shape as one-way collision"

我的引擎 Godot 有问题,出现错误“body set shape disabled”和“body set shape as one-way collision”。

在我的项目中我构建了四个场景:

另外我有两个脚本:一个在spaceship场景中,在Kinematicbody2D节点上;然后在 StaticBody2D 节点上的 platform 场景中。

基本上当我开始游戏时,在顶部中心有 platform,然后是 Area2D(用 CollisionShape2D 来检测 body进入该区域,然后还有我设置的 Position2D 位置,它应该在运行时实例化导弹。

当 body 进入 Area2D 时,platform 应该实例化一个 missile(目前什么都不做)。

当我将 spaceship 指向 Area2D 并且 platform 多次实例化导弹(每秒超过 200-300 次)时出现问题,这是游戏崩溃的瞬间。我收到上面写的错误,然后我必须关闭它。

飞船代码:

extends KinematicBody2D

var target
var click
var dir
var collision
var speed = 200

func _input(event):
    if event is InputEventMouseButton:
        target = get_global_mouse_position()
        click = true

func _physics_process(delta):
    if click:
        dir = position.direction_to(target)
        collision = move_and_collide(dir * speed * delta)
        if collision:
            pass

平台代码:

extends StaticBody2D

var trigger
var missileScene = preload("res://scenes/Missile.tscn")
var missile

func _on_DangerArea_body_entered(body):
    if body is KinematicBody2D:
        trigger = true
    while(trigger):
        missile = missileScene.instance()
        $SpawnPosition.add_child(missile)
        yield(get_tree().create_timer(3),"timeout")

func _on_DangerArea_body_exited(body):
    if body is KinematicBody2D:
        trigger = false

每个进入 Area2DPhysicsBody2DKinematicBody2DRigidBody2DStaticBody2D)都会发生信号 body_entered。这包括导弹。

是的,您正在检查 body 是否是 KinematicBody2D。但是当一个 KinematicBody2D 进入时,它将 trigger 设置为 true,允许所有主体进入循环。

首先,我建议通过返回来拒绝主体:

func _on_DangerArea_body_entered(body):
    if not body is KinematicBody2D:
        return

    # ...

其次,您可以使用常规计时器来生成导弹(这样,您也知道最多有一个计时器 运行):

extends StaticBody2D

var timer:Timer
var missileScene:PackedScene = preload("res://scenes/Missile.tscn")

func _ready():
    timer = Timer.new()
    add_child(timer)
    timer.set_wait_time(3)
    timer.connect("timeout", self, "instance_missile")

func _on_DangerArea_body_entered(body):
    if not body is KinematicBody2D:
        return

    timer.start()

func _on_DangerArea_body_exited(body):
    if not body is KinematicBody2D:
        return

    timer.stop()

func instance_missile():
    var missile := missileScene.instance()
    $SpawnPosition.add_child(missile)

以下内容可能对您的游戏有用,也可能没有用:您可以使用 node groups, or register classes,这样您就可以比 is KinematicBody2D 更具体。您可以做的另一件事是在他们进入时将您关心的机构添加到 Array,并在他们退出时将其删除,这样您就知道他们何时全部退出。


顺便说一句,我在抄写代码时注意到的第一件事是:您从未将 click 设置为 false(或其他非 true 的值)。

您似乎想要处理一个物理框架的点击。为此,您不需要 _input。在 _physics_process 中改用 Input.is_action_just_pressed事实上,我鼓励以这种方式开始,只有在需要时才转到 _input。很多时候你不会。