学习空间/场景与节点:先学会拆一个对象
Godot 核心 / LESSON 05

场景与节点:先学会拆一个对象

把“一个角色”看成几个各司其职的节点,而不是一张图片。

基础约 7 分钟阅读,实作另计7 节现在学
CONCEPT MAP先看一眼知识之间的联系
先看一眼知识之间的联系01确定职责02组织父子03保存场景04放入实例
先用职责决定树形结构,再观察同一场景产生的两个实例;不要按屏幕上的距离决定父子关系。

01核心心智模型

节点提供具体能力,场景把一组节点保存成可复用单元。图片只是数据;让图片出现的是 Sprite2D。角色需要移动和碰撞时,根节点可选 CharacterBody2D;它下面的可视节点负责外观,CollisionShape2D 描述碰撞形状。不要让每个子节点都各自决定整段流程。

02点击节点,理解职责

下图是独立练习的建议结构,不是你项目中已经存在的节点树。玩家碰撞形状以脚底附近为参考是一种俯视游戏实现建议,具体尺寸需要之后用实际比例验证。

03在编辑器中搭出来

  1. 建立 Node2D 场景并命名 PracticeRoom。添加 CharacterBody2D 子节点,命名 Player。
  2. 在 Player 下放 Sprite2D 和 CollisionShape2D。Sprite2D 临时使用工程自带的 icon.svg;适当缩小只是练习显示比例。
  3. 给 CollisionShape2D 新建 RectangleShape2D,并调整到能看清的尺寸。图形不显示时先确认纹理、缩放和相机,而不是先写移动代码。
  4. 把 Player 分支另存为 player.tscn,再拖入第二个实例。观察实例与原始场景之间的关系。

04最小节点图

建议节点结构 text
PracticeRoom (Node2D)       # 练习环境
└── Player (CharacterBody2D) # 移动与碰撞响应
    ├── Sprite2D            # 显示纹理
    └── CollisionShape2D    # 碰撞轮廓,必须有 Shape

05先判断谁拥有这个部件,再决定节点放在哪里

假设练习角色有身体图片、碰撞形状和头顶提示。一个好用的判断方法是:角色被移动、隐藏或删除时,这个部件是否应该跟着变化?身体图片和碰撞形状通常应该,因此放在 Player 下面。房间的地面不应该跟着角色移动,所以不要为了方便选中而把它拖进 Player。屏幕右上角的说明文字也未必属于角色,它更可能属于界面。

  1. 在练习场景给 Player、Sprite2D 和 CollisionShape2D 分别重命名,先在纸上写下每个节点的一句话职责。
  2. 选中 Player,改变位置,观察图片与形状是否一起移动。
  3. 只选中 Sprite2D,改变它的局部位置,观察碰撞形状是否仍停在原处。
  4. 撤回位移,解释这两次操作为什么不同。判断依据是父子关系,而不是它们看起来是否挨在一起。

06用两个实例理解:哪些修改会一起生效

把 Player 保存成单独场景后,在练习房间摆两个实例,分别叫 PlayerLeft 和 PlayerRight。先打开原始 player.tscn,把图片整体向上挪一点,保存,再回到房间查看两个实例。接着只在房间中改变 PlayerRight 的位置。你会看到:场景负责可复用结构,而实例仍然可以拥有自己的位置等属性。

如果两边表现不一致,不要立即重新制作场景。先确认修改的是源场景还是某个实例,再检查这个属性是否有本地覆盖。初学阶段只观察覆盖状态,不急着使用“使其唯一”或把整个分支打散;那可能改变后续维护方式。建议保留一张小表:修改对象、修改属性、左实例结果、右实例结果。预测与结果不一致的那一行,就是下一步应该调查的问题。

07看不见时,沿着显示链找原因

“运行后没有角色”至少有三种不同情况:节点根本没有进入运行场景;节点存在但没有图片;图片存在却在窗口之外。先在运行时的 Remote 树查找 Player。如果找不到,确认 F6 运行的是不是当前房间,而非另一个空场景;如果找得到,检查 Sprite2D 的纹理和可见性;仍无结果时,再查看节点位置与缩放。每次只改一项,避免同时挪位置、换图片、加相机后无法解释原因。

本课可以用一段具体结论收尾:“我能通过移动父节点带动角色部件;单独移动图片不会移动碰撞;两个实例保持各自位置。”这比截图上出现两个图标更能证明你理解了场景结构。它只是独立练习的证据,不代表正式游戏角色结构已经确定。

动手后,再勾选

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

CHECK YOUR UNDERSTANDING

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

只添加 Sprite2D,是否就会自动阻挡墙壁?

用自己的话,留一条笔记

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

仅保存在此浏览器0 / 20000

回到资料核对

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

把这课收进你的理解里。

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

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

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