节点与场景
节点与场景
节点 (Node)
节点是 Godot 中游戏对象的基本单位,每个节点都有特定的功能。
常用节点类型
基础节点
Node:所有节点的基类,无渲染能力Node2D:2D 节点基类,有位置、旋转、缩放Node3D:3D 节点基类,有 3D 变换
渲染节点
Sprite2D:2D 精灵渲染Sprite3D:3D 精灵/面片渲染MeshInstance3D:3D 网格渲染AnimatedSprite2D:动画精灵
物理/碰撞节点
CharacterBody2D/3D:角色物理体RigidBody2D/3D:刚体Area2D/3D:检测区域CollisionShape2D/3D:碰撞形状CollisionPolygon2D:多边形碰撞
UI 节点
Control:所有 UI 节点的基类Label:文本标签Button:按钮LineEdit:文本输入框Panel:面板容器
功能节点
Camera2D/3D:摄像机AudioStreamPlayer2D/3D:音频播放器Timer:计时器AnimationPlayer:动画播放器
节点树结构
# 获取子节点
var child = get_node("ChildName")
var child2 = get_node("Parent/Child/Grandchild")
var child3 = $ChildName # 语法糖
# 获取所有子节点
var children = get_children()
# 获取父节点
var parent = get_parent()
# 添加/移除子节点
add_child(new_node)
remove_child(node)
节点生命周期
# 当节点进入场景树时调用
func _enter_tree() -> void:
pass
# 当节点及其子节点都 ready 后调用(常用)
func _ready() -> void:
pass
# 当节点离开场景树时调用
func _exit_tree() -> void:
pass
# 每帧调用(处理逻辑)
func _process(delta: float) -> void:
pass
# 物理帧调用(固定时间步长)
func _physics_process(delta: float) -> void:
pass
# 输入事件
func _input(event: InputEvent) -> void:
pass
场景 (Scene)
场景是节点树的保存,是 Godot 的组织方式。
创建场景
- 新建场景
- 选择根节点类型
- 添加子节点
- 配置节点属性
- 保存场景 (Ctrl+S)
场景实例化
# 加载场景
var enemy_scene = preload("res://scenes/Enemy.tscn")
# 实例化场景
var enemy = enemy_scene.instantiate()
# 添加到场景树
add_child(enemy)
enemy.position = Vector2(100, 100)
场景树 (SceneTree)
Main (Scene)
├── Player (Scene)
│ ├── Sprite2D
│ ├── CollisionShape2D
│ └── Camera2D
├── Enemy (Scene)
│ ├── Sprite2D
│ └── CollisionShape2D
└── UI (Scene)
├── HealthBar
└── ScoreLabel
场景组织原则
- 单一职责:每个场景做一件事
- 可重用:将通用功能做成独立场景
- 层次清晰:保持场景树结构简单
- 模块化:通过实例化组合复杂场景
场景继承
# 子场景可以继承父场景并添加内容
# 在编辑器中:New Inherited Scene
场景变换 (Transform)
# 2D 变换
position = Vector2(100, 50) # 位置
rotation_degrees = 45.0 # 旋转(度)
scale = Vector2(2, 2) # 缩放
# 3D 变换
position = Vector3(0, 1, 0)
rotation_degrees = Vector3(0, 90, 0)
scale = Vector3(1, 1, 1)
常用节点属性
# 可见性
visible = true
# Z 轴顺序(2D)
z_index = 1
z_as_relative = true
# 分组(用于批量管理)
add_to_group("enemies")
is_in_group("enemies")
get_tree().call_group("enemies", "take_damage")