学习空间/碰撞与 Area2D:阻挡不等于检测
玩家与交互 / LESSON 14

碰撞与 Area2D:阻挡不等于检测

分别安排角色、墙壁和交互范围的物理职责。

基础约 8 分钟阅读,实作另计7 节现在学
CONCEPT MAP先看一眼知识之间的联系
先看一眼知识之间的联系01图片轮廓02地面占用03阻挡形状04调查范围
高物件的视觉高度不等于占地;分别检查能否通行、能否靠近和能否调查。

01先分清两件事

墙壁需要阻挡角色,调查范围需要检测“角色靠近了”。本练习用 StaticBody2D 承担静态墙壁,Area2D 承担检测。两者都需要形状,但 Area2D 的存在不会自动把玩家挡在外面。美术轮廓、碰撞轮廓和可交互范围不必完全一样。

02碰撞层与掩码

Layer 可以理解为“我在哪些类别中”,Mask 是“我要检查哪些类别”。一个 Area 要检测玩家,其 Mask 应包含玩家所在 Layer,并开启 Monitoring;检测 body 用 body_entered,检测另一个 Area 则关注 area_entered。不要把所有层全部勾上来掩盖分类错误。

练习对象LayerMask / 用途
Player12:检测墙
Wall / StaticBody2D2按本练习设置保持简单
Probe / Area2D不必被其它对象检测1:检测 Player

03一个进入范围的检测脚本

area_practice.gd gdscript
extends Area2D

func _ready() -> void:
    body_entered.connect(_on_body_entered)
    body_exited.connect(_on_body_exited)

func _on_body_entered(body: Node2D) -> void:
    if body.is_in_group("player"):
        print("玩家进入范围")

func _on_body_exited(body: Node2D) -> void:
    if body.is_in_group("player"):
        print("玩家离开范围")
  1. 给 Player 添加名为 player 的组。
  2. 创建 Area2D 和它的 CollisionShape2D,设置 Mask 1,并挂脚本。
  3. 走入、走出范围,确认每次边界变化各输出一次,而不是每帧输出。
  4. 添加带碰撞形状的 StaticBody2D 墙,验证移动角色确实被挡住。

04为什么图片对了却碰撞不对

开启 Debug → Visible Collision Shapes 观察真实形状。核对形状有没有挂错父节点、是否被禁用、是否尺寸过大、是否只看见编辑器辅助框。碰撞调整要参考角色脚点和通过宽度,不能仅按漂亮图片的外接矩形随意定。

05先画地面占用,再画检测范围

想象一只高柜的图片,上半部很高,真正接触地面的区域却在下面。角色不应因为靠近柜顶在图片中的位置,就撞上一堵看不见的墙。做碰撞时,先在平面草图上画柜子占用的地面区域,再决定阻挡形状;另画一个稍大的区域表达能否调查。可见图像、地面占用和检测范围是三张不同的轮廓。

  1. 在练习场景使用一个简单高矩形作为物件外观。
  2. 把阻挡形状放在它底部,用 Visible Collision Shapes 检查运行中的真实位置。
  3. 在物件周围配置独立的 Area2D 检测范围,记录玩家什么时候收到提示。
  4. 让玩家绕一圈,分别观察身体是否被挡、是否仍能进入检测范围。能够调查不要求角色先撞到物件。

06用一次只改一个勾选项的方式理解层与掩码

把练习 Player 放在第一层,把 Wall 放在第二层,让 Player 的 Mask 检测第二层。先验证墙确实阻挡,再只取消 Player 对第二层的检测,观察变化,随后恢复。对于 Area2D,则固定玩家的 Layer,只切换 Area 的 Mask,观察进入日志是否变化。两项实验分开做,避免在三个对象上同时勾选后只能记住一套神秘配置。

每次修改都记录“谁属于哪类”和“谁主动检查哪类”。如果检测另一个 Area,不要继续等 body_entered;信号类型也必须匹配。若始终没有日志,先检查形状、Monitoring 和运行位置,再看层掩码。全勾选可以临时帮助判断是不是分类问题,但不能作为最终方案,否则以后加入非玩家对象时,它们可能意外触发同一段逻辑。

07把边缘情况当成空间设计反馈

沿墙直走通常很容易通过,真正暴露问题的是斜着挤进墙角、擦过门框和沿检测范围边缘来回移动。选一条窄通道,慢速和正常速度各走几次,记录是否需要频繁修正方向。如果角色总卡在某处,先观察碰撞轮廓与通道实际宽度;不要马上把角色速度调低来掩盖空间不合适的问题。

调查范围边缘的提示反复闪烁,也不一定是信号连接错误:玩家可能确实在范围边界两侧来回变化。先用可见形状确认事实,再决定是否扩大合理的可达范围,或者在后续交互控制中加入稳定的目标选择。完成证据要同时包含阻挡、进入、离开与墙角操作,而不是只写“碰撞开启”。这些尺寸用于验证教学关系,不替正式家具与角色比例定案。

动手后,再勾选

不是“我看懂了”,而是你在独立练习里做出并检查过。

CHECK YOUR UNDERSTANDING

换一个情景,你会怎么判断?

Area2D 主要在本练习中做什么?

用自己的话,留一条笔记

可以写“我之前以为……,现在发现……”,或者记录还没解决的问题。

仅保存在此浏览器0 / 20000

回到资料核对

本课是解释与练习,不替代对应版本的官方手册。网页实验不运行 Godot;未标明实机验证的代码,仍需在独立工程中检查。

把这课收进你的理解里。

标记已读不会自动勾选实作,也不代表游戏功能已经完成。

输入一个你想弄明白的问题。

按 Esc 关闭 · 标题、关键词和正文一起搜索