Camera2D
2026/4/14大约 5 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Camera2D
Camera2D
节点继承关系
继承链:Node → CanvasItem → Node2D → Camera2D
继承自 Node2D
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Position | 本地位置(相对于父节点) |
| 属性 | GlobalPosition | 全局位置 |
| 属性 | Rotation | 旋转角度(弧度) |
| 属性 | Scale | 缩放比例 |
| 属性 | Skew | 倾斜角度(弧度) |
| 方法 | Rotate() | 旋转指定弧度 |
| 方法 | ToGlobal() | 本地坐标转全局坐标 |
| 方法 | ToLocal() | 全局坐标转本地坐标 |
继承自 CanvasItem
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Visible | 是否可见 |
| 属性 | Modulate | 整体颜色叠加(乘法) |
| 属性 | SelfModulate | 自身颜色叠加(不影响子节点) |
| 属性 | ZIndex | 绘制层级(Z 轴排序) |
| 信号 | visibility_changed | 可见性变化时触发 |
| 方法 | GetGlobalMousePosition() | 获取鼠标全局坐标 |
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
2D 摄像机,决定玩家在 2D 游戏中看到画面的哪个区域。
想象你用手机拍一长条画卷。Camera2D 就是你的手机镜头,你可以控制镜头往左往右移(跟随角色),也可以放大缩小(zoom)。画布很大,但手机屏幕只能看到一部分——这一部分就是 Camera2D 决定的。
使用频率:★★★★ 维度专用常用——几乎每个 2D 游戏都会用到。
节点用途
- 让摄像机自动跟随玩家角色移动
- 控制画面的缩放(放大看清细节、缩小看到更多)
- 限制摄像机不超出地图边界(防止看到地图外的空白区域)
- 实现平滑跟随(让镜头移动不那么突兀)
- 实现摄像机震动效果(受伤、爆炸等反馈)
使用场景
典型场景
- 横版平台跳跃:摄像机跟随角色左右移动
- 俯视角 RPG:摄像机跟随角色在地图上行走
- 2D 射击游戏:摄像机跟随玩家并限制边界
不适用场景
- 3D 游戏中观察场景 → 使用 Camera3D
- 固定不动的画面 → 不需要摄像机
常用节点搭配
| 搭配节点 | 用途 | 必需? |
|---|---|---|
| CharacterBody2D | 玩家角色(Camera2D 作为其子节点自动跟随) | 推荐 |
| TileMap / TileMapLayer | 2D 关卡地图 | 可选 |
| ParallaxBackground | 视差滚动背景,配合 Camera2D 实现远近层次感 | 推荐 |
典型节点树:
Player (CharacterBody2D)
├── Camera2D ← 挂在玩家下面,自动跟随
├── Sprite2D
└── CollisionShape2D生效必备素材/资源
| 资源 | 类型 | 说明 |
|---|---|---|
| 无特殊资源 | — | Camera2D 本身不需要额外资源,直接添加即可使用 |
节点属性与信号
跟随与平滑
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
position_smoothing_enabled | bool | false | — | 是否开启平滑移动。开启后摄像机会"软着陆"而不是瞬间跳到目标位置 |
position_smoothing_speed | float | 5.0 | — | 平滑移动的速度。值越大跟随越快,值越小越"慵懒" |
offset | Vector2 | (0, 0) | — | 额外偏移量。可以用来让摄像机不居中,比如偏上看一点 |
anchor_mode | 枚举 | DragCenter | — | 锚点模式。FixedTopLeft(固定左上角)或 DragCenter(拖拽中心) |
process_callback | 枚举 | Physics | — | 在 _process 还是 _physics_process 中更新。一般用默认值即可 |
缩放
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
zoom | Vector2 | (1, 1) | — | 缩放倍数。(2, 2) 表示放大 2 倍,(0.5, 0.5) 表示缩小到一半 |
边界限制
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
limit_left | int | -10000000 | — | 摄像机左边界的最大范围(像素) |
limit_top | int | -10000000 | — | 摄像机上边界的最大范围 |
limit_right | int | 10000000 | — | 摄像机右边界的最大范围 |
limit_bottom | int | 10000000 | — | 摄像机下边界的最大范围 |
信号
| 信号 | 触发时机 | 继承自 | 说明 |
|---|---|---|---|
| 无自有信号 | — | — | Camera2D 自身不发出信号 |
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
ForceUpdateScroll() | void | 强制更新摄像机滚动位置 |
Align() | void | 将摄像机位置对齐到像素网格,避免画面模糊 |
GetCameraScreenCenter() | Vector2 | 获取摄像机当前屏幕中心的世界坐标 |
GetCameraTransform() | Transform2D | 获取摄像机的变换矩阵 |
IsPositionSmoothingEnabled() | bool | 是否启用了平滑跟随 |
SetLimit(Side, Value) | void | 设置指定方向的边界限制 |
GetLimit(Side) | int | 获取指定方向的边界限制值 |
MakeCurrent() | void | 将此摄像机设为当前激活的摄像机 |
代码示例
C
using Godot;
public partial class PlayerCamera : Camera2D
{
public override void _Ready()
{
// 开启平滑跟随
PositionSmoothingEnabled = true;
PositionSmoothingSpeed = 8.0f;
// 设置缩放(1.5 倍放大,让角色看起来更大)
Zoom = new Vector2(1.5f, 1.5f);
// 设置地图边界,防止摄像机看到地图外面的空白
// 假设地图从 (0,0) 开始,宽 2000,高 600
LimitLeft = 0;
LimitTop = 0;
LimitRight = 2000;
LimitBottom = 600;
// 使用拖拽中心模式(摄像机中心跟随)
AnchorMode = Camera2D.AnchorModeEnum.DragCenter;
}
// 如果需要动态调整缩放(比如角色受伤时震动效果)
public void ShakeCamera(float intensity, float duration)
{
// 创建一个 Tween 来做摄像机震动
var tween = CreateTween();
for (int i = 0; i < 5; i++)
{
var offset = new Vector2(
(float)GD.RandRange(-intensity, intensity),
(float)GD.RandRange(-intensity, intensity)
);
tween.TweenProperty(this, "offset", offset, duration / 5);
}
tween.TweenProperty(this, "offset", Vector2.Zero, duration / 5);
}
}GDScript
extends Camera2D
func _ready():
# 开启平滑跟随
position_smoothing_enabled = true
position_smoothing_speed = 8.0
# 设置缩放(1.5 倍放大,让角色看起来更大)
zoom = Vector2(1.5, 1.5)
# 设置地图边界,防止摄像机看到地图外面的空白
# 假设地图从 (0,0) 开始,宽 2000,高 600
limit_left = 0
limit_top = 0
limit_right = 2000
limit_bottom = 600
# 使用拖拽中心模式(摄像机中心跟随)
anchor_mode = Camera2D.ANCHOR_MODE_DRAG_CENTER
# 如果需要动态调整缩放(比如角色受伤时震动效果)
func shake_camera(intensity: float, duration: float):
# 创建一个 Tween 来做摄像机震动
var tween = create_tween()
for i in range(5):
var offset = Vector2(
randf_range(-intensity, intensity),
randf_range(-intensity, intensity)
)
tween.tween_property(self, "offset", offset, duration / 5)
tween.tween_property(self, "offset", Vector2.ZERO, duration / 5)小技巧
zoom 值大于 1 是放大(看得更少但更清晰),小于 1 是缩小(看到更多但更小)。2D 游戏中通常把 zoom 设在 2~4 之间,因为像素画本身分辨率很低,放大后才能看清楚。
