You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot(C#)碰撞检测实现及KinematicBody2D触发Area2D消失方法咨询

实现KinematicBody2D进入时Area2D消失的步骤

1. 配置Area2D的信号

选中场景中的Area2D节点,在右侧「信号」面板找到body_entered信号——该信号会在物理实体进入Area区域时触发。将此信号连接到Area2D自身的C#脚本,或你指定的处理脚本。

2. 编写C#回调逻辑

给Area2D添加C#脚本,实现信号的处理方法:

using Godot;

public class TriggerArea : Area2D
{
    // 编辑器自动绑定信号时,方法名需与连接时指定的一致
    private void _OnBodyEntered(Node body)
    {
        // 仅响应KinematicBody2D的进入事件
        if (body is KinematicBody2D)
        {
            // 隐藏Area(保留节点,可后续恢复显示)
            Visible = false;
            // 若需彻底移除节点,使用QueueFree():
            // QueueFree();
        }
    }

    // 若手动绑定信号,需在Ready中添加以下代码
    public override void _Ready()
    {
        Connect("body_entered", this, nameof(_OnBodyEntered));
    }
}

Godot(C#)中的碰撞检测方式

Area2D被动检测(信号驱动)

  • body_entered/body_exited:检测KinematicBody2D、RigidBody2D等物理实体进入/离开Area时触发。
  • area_entered/area_exited:检测其他Area2D进入/离开当前Area时触发。
  • 可通过Area2D的Monitoring(是否检测其他实体)和Monitorable(是否被其他实体检测)属性控制检测开关。

KinematicBody2D主动检测(移动时触发)

1. MoveAndCollide

移动时直接检测碰撞,返回KinematicCollision2D对象获取碰撞细节:

public override void _PhysicsProcess(float delta)
{
    Vector2 moveDir = new Vector2(150, 0) * delta;
    KinematicCollision2D collision = MoveAndCollide(moveDir);
    
    if (collision != null)
    {
        Node collider = collision.GetCollider();
        if (collider is Area2D triggerArea)
        {
            triggerArea.Visible = false;
        }
    }
}

2. MoveAndSlide

适合角色移动场景,自动处理斜坡和碰撞响应,通过滑动次数获取碰撞信息:

public override void _PhysicsProcess(float delta)
{
    Vector2 velocity = new Vector2(200, 0);
    velocity = MoveAndSlide(velocity);
    
    for (int i = 0; i < GetSlideCount(); i++)
    {
        KinematicCollision2D collision = GetSlideCollision(i);
        if (collision.GetCollider() is Area2D triggerArea)
        {
            triggerArea.Visible = false;
        }
    }
}

静态重叠检测

直接获取当前节点的重叠对象列表:

// 获取与Area2D重叠的所有物理实体
public void CheckOverlappingBodies()
{
    foreach (Node body in GetOverlappingBodies())
    {
        if (body is KinematicBody2D)
        {
            Visible = false;
        }
    }
}

// 获取与Area2D重叠的其他Area节点
public void CheckOverlappingAreas()
{
    foreach (Node area in GetOverlappingAreas())
    {
        // 处理重叠逻辑
    }
}

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:31:05