ワンクリックで
godot-sync-camera-positions
用于 Godot 中背景图层或元素在运行时跟随摄像机,但在编辑器中显示错误位置的情况。 检测摄像机跟随模式,并将编辑器位置同步为典型的运行时状态。 使编辑器预览准确显示玩家在游戏中看到的画面。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
用于 Godot 中背景图层或元素在运行时跟随摄像机,但在编辑器中显示错误位置的情况。 检测摄像机跟随模式,并将编辑器位置同步为典型的运行时状态。 使编辑器预览准确显示玩家在游戏中看到的画面。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
当 Godot 代码中存在通过 get_node()、get_parent() 或直接引用产生的紧耦合依赖时使用。 检测耦合模式并将其转换为基于 Signal 的通信方式。组件变得独立、可测试且可复用。 在改进架构的同时精确保留原有行为。
当 Godot 代码中存在相互冲突的操作导致未定义行为时使用。检测同一属性在多处设置 (_ready、_process、代码+编辑器)、同一 Signal 多次连接、冲突的物理模式、 竞争的动画等问题。自动通过明确的所有权归属解决冲突。
用于创建带有自定义面板、停靠栏和工具的 Godot 编辑器插件。生成 plugin.cfg 配置、 EditorPlugin 脚本模板、自定义编辑器 UI 组件,并集成 ProjectSettings。按照 Godot 4.x 最佳实践创建完整的插件结构。
当 Godot 代码中存在硬编码的游戏数据(如 const 数组、字典或内嵌值)时使用。检测内联数据 如敌人属性、物品定义、关卡配置等。自动提取为 .tres Resource 文件,使数据在编辑器中 可见、易于修改,并支持数据驱动的设计。
当构建 Godot 功能时,代码使用 .new() 创建节点而非使用场景时触发。 检测 Timer.new()、Area2D.new()、Sprite2D.new() 等代码创建的对象。 自动生成 .tscn 场景文件,更新父脚本使用 @onready 引用,并创建可复用的组件库。
当 Godot 项目在编辑器(.tscn)和代码(.gd)之间存在位置冲突、相机跟随背景、 或运行时位置与编辑器预览不匹配时使用。编排所有 3 个位置同步子技能: sync-static-positions、sync-camera-positions 和 sync-parallax。 每个操作针对特定的位置冲突类型。
| name | godot-sync-camera-positions |
| version | 3.0.0 |
| displayName | 同步摄像机跟随位置 |
| description | 用于 Godot 中背景图层或元素在运行时跟随摄像机,但在编辑器中显示错误位置的情况。 检测摄像机跟随模式,并将编辑器位置同步为典型的运行时状态。 使编辑器预览准确显示玩家在游戏中看到的画面。 |
| author | Asreonn |
| license | MIT |
| category | game-development |
| type | tool |
| difficulty | intermediate |
| audience | ["developers"] |
| keywords | ["godot","camera-follow","editor-preview","background-layers","runtime-position","camera2d","level-design","wysiwyg"] |
| platforms | ["macos","linux","windows"] |
| repository | https://github.com/asreonn/godot-superpowers |
| homepage | https://github.com/asreonn/godot-superpowers#readme |
| permissions | {"filesystem":{"read":[".gd",".tscn"],"write":[".tscn"]},"git":true} |
| behavior | {"auto_rollback":true,"validation":true,"git_commits":true} |
| outputs | 同步后的摄像机感知位置、更新的 .tscn 文件、运行时注释、git 提交 |
| requirements | Git 仓库、Godot 4.x |
| execution | 自动检测并计算编辑器位置 |
| integration | 属于 godot-fix-positions 编排器的一部分,可与 godot-sync-parallax 配合使用 |
编辑器预览应展示真实的游戏画面。 跟随摄像机的元素需要特殊处理。
找到类似这样的模式:
# background.gd
extends Sprite2D
func _process(delta):
position = camera.position # 运行时跟随摄像机
# background.tscn
[node name="Background" type="Sprite2D"]
position = Vector2(0, 0) # 编辑器中显示在原点
# 结果:编辑器中背景在 (0,0)
# 但在游戏中,背景在摄像机位置(例如 500, 300)
# 关卡设计师看到的是错误的画面!
解决为:
# background.gd(未修改 - 运行时行为相同)
func _process(delta):
position = camera.position
# background.tscn(更新为显示典型的摄像机位置)
[node name="Background" type="Sprite2D"]
position = Vector2(500, 300) # 摄像机起始位置
# 结果:编辑器预览现在显示真实的游戏画面
识别摄像机跟随代码:
func _process(delta):
position = camera.position # 摄像机跟随
position = camera.global_position
position = get_viewport().get_camera_2d().position
func _process(delta):
position = player.position # 玩家跟随摄像机
# 背景跟随玩家 → 实际上跟随摄像机
func _process(delta):
position = camera.position + offset # 带偏移的摄像机跟随
position = player.position + Vector2(0, -100)
func _process(delta):
position = position.lerp(camera.position, 0.1) # 平滑摄像机跟随
跟随摄像机以实现无限滚动效果的背景。
停留在摄像机位置的世界空间 UI。
想要看到游戏过程中区域的实际外观。
任何相对于摄像机定位的元素。
将编辑器位置设为摄像机的起始位置。
最适用于: 大多数摄像机跟随元素。
# background.gd
func _process(delta):
position = camera.position
# 确定摄像机起始位置(从关卡场景或项目设置)
# 将 background.tscn 的 position 更新为 camera_start_position
将编辑器位置设为玩家出生点 + 偏移。
最适用于: 带偏移跟随玩家的元素。
# cloud.gd
func _process(delta):
position = player.position + Vector2(0, -200) # 在玩家上方
# 找到玩家出生点
# 将 cloud.tscn 的 position 更新为 player_spawn + Vector2(0, -200)
在场景中添加元数据说明运行时行为。
最适用于: 复杂的摄像机跟随逻辑。
# .tscn 中的元数据
[node name="Background"]
metadata/_editor_note = "Runtime: follows camera at camera.position"
识别摄像机跟随模式:
# 摄像机跟随(会同步这些)
position = camera.position
position = $"/root/Main/Camera".position
position = player.position # 如果玩家有摄像机
position.x = camera.position.x # 水平跟随
跳过非摄像机模式:
# 非摄像机跟随(跳过这些)
position = target_position # 通用目标
position = waypoints[index] # 路径点跟随
position = mouse_position # 鼠标跟随
之前:
# background.gd
extends Sprite2D
@onready var camera = $"/root/Main/Camera2D"
func _process(delta):
position = camera.position
# background.tscn
[node name="Background" type="Sprite2D"]
position = Vector2(0, 0)
texture = preload("res://assets/sky.png")
编辑器视图: 背景在原点 (0, 0) - 错误! 游戏视图: 背景在摄像机位置 (640, 360) - 正确!
同步后:
# background.gd(未修改)
extends Sprite2D
@onready var camera = $"/root/Main/Camera2D"
func _process(delta):
# 运行时:跟随摄像机位置
position = camera.position
# background.tscn(已更新)
[node name="Background" type="Sprite2D"]
position = Vector2(640, 360) # 摄像机起始位置
texture = preload("res://assets/sky.png")
编辑器视图: 背景在 (640, 360) - 与游戏画面一致! 游戏视图: 背景在摄像机位置 - 与之前相同!
之前:
# cloud.gd
extends Sprite2D
func _process(delta):
position = player.position + Vector2(0, -200)
# cloud.tscn
[node name="Cloud" type="Sprite2D"]
position = Vector2(0, 0)
同步后:
# cloud.gd(未修改)
func _process(delta):
# 运行时:在玩家上方 200 像素
position = player.position + Vector2(0, -200)
# cloud.tscn(更新为显示在玩家出生点上方)
[node name="Cloud" type="Sprite2D"]
position = Vector2(320, -20) # 玩家出生在 (320, 180)
# 搜索 Camera2D 节点
grep -r "type=\"Camera2D\"" scenes/
# 在摄像机的父场景中查找位置值
# 检查视口大小(摄像机通常从中心开始)
# 默认:1280x720 → 摄像机在 (640, 360)
如果检测不确定,询问: "你的摄像机从哪里开始?(例如,视口中心、玩家位置)"
可搭配使用:
以下情况不要同步:
func _process(delta):
position.x = camera.position.x
# 垂直位置固定,水平跟随摄像机
同步:将编辑器 x 设为摄像机起始 x,保持 y 不变。
func _process(delta):
position = position.lerp(camera.position, smoothness)
同步:将编辑器位置设为摄像机起始位置(最终位置)。
func _process(delta):
position = camera.position.clamp(min_bounds, max_bounds)
同步:将编辑器位置设为限制后的摄像机起始位置。
同步后验证:
# 运行时行为:
# - 在 _process 中跟随 camera.position
# - 编辑器位置设为摄像机起始位置:(640, 360)
# - 游戏过程中,位置将完全匹配摄像机
清晰的文档可以避免代码和编辑器位置有意不同时的困惑。
智能检测最大限度地减少所需的用户输入。