원클릭으로
godot-sync-static-positions
当 Godot 节点的位置同时在 .tscn(编辑器)和 _ready()(代码)中设置时使用, 这会导致实际运行时位置产生混乱。检测与编辑器值冲突的静态位置赋值。 同步到单一事实来源,使编辑器预览与游戏行为一致(所见即所得)。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
当 Godot 节点的位置同时在 .tscn(编辑器)和 _ready()(代码)中设置时使用, 这会导致实际运行时位置产生混乱。检测与编辑器值冲突的静态位置赋值。 同步到单一事实来源,使编辑器预览与游戏行为一致(所见即所得)。
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-static-positions |
| version | 3.0.0 |
| displayName | 同步静态位置 |
| description | 当 Godot 节点的位置同时在 .tscn(编辑器)和 _ready()(代码)中设置时使用, 这会导致实际运行时位置产生混乱。检测与编辑器值冲突的静态位置赋值。 同步到单一事实来源,使编辑器预览与游戏行为一致(所见即所得)。 |
| author | Asreonn |
| license | MIT |
| category | game-development |
| type | tool |
| difficulty | beginner |
| audience | ["developers"] |
| keywords | ["godot","position-sync","editor-preview","wysiwyg","static-positions","node-position","level-design","tscn-files"] |
| 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":[".gd",".tscn"]},"git":true} |
| behavior | {"auto_rollback":true,"validation":true,"git_commits":true} |
| outputs | 同步后的位置、更新的 .tscn 或 .gd 文件、清晰的归属文档、git 提交 |
| requirements | Git 仓库、Godot 4.x |
| execution | 自动检测,用户审批同步策略 |
| integration | godot-fix-positions 编排器的一部分,与 godot-clean-conflicts 协作 |
所见即所得。 对于静态位置,编辑器预览应与游戏行为一致。
查找如下冲突:
# enemy.gd
func _ready():
position = Vector2(500, 300) # 代码设置在这里
# enemy.tscn
[node name="Enemy" type="CharacterBody2D"]
position = Vector2(100, 100) # 编辑器设置在这里
# 结果:令人困惑!编辑器显示错误的位置
解决为:
# enemy.gd
func _ready():
# 位置已在场景文件中设置,以便在编辑器中可见
pass
# enemy.tscn
[node name="Enemy" type="CharacterBody2D"]
position = Vector2(500, 300) # 更新为匹配预期位置
# 结果:编辑器预览与游戏一致
识别以下情况:
func _ready():
position = Vector2(100, 150) # 静态冲突
global_position = Vector2(500, 300) # 静态冲突
func _ready():
$Sprite.position = Vector2(10, 20) # 子节点位置冲突
get_node("CollisionShape2D").position = Vector2(0, 0)
func _ready():
position = Vector2(100, 100)
rotation = deg_to_rad(45) # 也是位置相关的
scale = Vector2(2, 2)
在编辑器中放置物体,但代码覆盖了位置。
"为什么这个节点在错误的位置?"
希望编辑器预览是准确的。
关卡设计师需要准确的编辑器预览。
将代码中的值移到 .tscn,从代码中移除。
何时使用:
示例:
# 修改前
func _ready():
position = Vector2(500, 300)
# 修改后
func _ready():
# 位置已在场景文件中设置
pass
# enemy.tscn 已更新
position = Vector2(500, 300)
移除编辑器中的值,保留代码赋值。
何时使用:
示例:
# 修改前
func _ready():
position = spawn_point.position + offset # 动态的!
# 修改后
func _ready():
# 位置是动态计算的(参见 spawn_point)
position = spawn_point.position + offset
# enemy.tscn - 位置已移除或设置为 (0,0) 作为占位符
保留两者,但添加清晰的注释。
何时使用:
示例:
# 修改前
func _ready():
position = start_position
# 修改后
func _ready():
# 编辑器位置是默认出生点,被覆盖为 start_position
position = start_position
识别静态冲突(修复这些):
func _ready():
position = Vector2(100, 100) # 字面量常数 - 静态
position = Vector2(CONSTANT_X, CONSTANT_Y) # 常量 - 静态
$Child.position = Vector2(10, 10) # 字面量 - 静态
跳过动态定位(属于有意设计):
func _ready():
position = player.position # 变量引用 - 动态
position = get_spawn_point() # 函数调用 - 动态
if some_condition:
position = Vector2(100, 100) # 条件性 - 动态
func _process(delta):
position = target # 每帧 - 动态(跳过)
关键区别:静态 = 每次都相同,动态 = 运行时变化
# 修改前:代码设置 (500, 300),编辑器设置 (0, 0)
func _ready():
position = Vector2(500, 300)
# 修改后:编辑器已更新,代码已移除
# enemy.tscn: position = Vector2(500, 300)
# 修改前:子节点偏移在代码中,不在编辑器中
func _ready():
$Sprite.position = Vector2(0, -10)
# 修改后:Sprite 位置已移入 .tscn
# enemy.tscn: [node name="Sprite"] position = Vector2(0, -10)
# 修改前:位置、旋转、缩放都在代码中
func _ready():
position = Vector2(100, 100)
rotation = deg_to_rad(45)
scale = Vector2(1.5, 1.5)
# 修改后:所有属性都在 .tscn 中,代码干净
# enemy.tscn 已设置所有三个属性
与以下技能协作:
以下情况不要同步:
合法的代码控制位置:
# 这些不应该同步到 .tscn
func _ready():
position = get_spawn_location_from_data() # 数据驱动
position = player.position + offset # 相对于玩家
position = area.get_random_point() # 程序化
同步后,清晰的模式会浮现:
| 位置类型 | 归属方 | 示例 |
|---|---|---|
| 静态出生点 | 编辑器 (.tscn) | 敌人出生位置 |
| 子节点偏移 | 编辑器 (.tscn) | Sprite 相对于父节点 |
| 动态位置 | 代码 (_ready, _process) | 跟随玩家、程序化 |
| 动画位置 | AnimationPlayer | 动画运动 |
| 物理位置 | 物理引擎 | RigidBody2D |
同步后验证:
# 位置在场景文件中设置为 (500, 300)
# 旋转由 AnimationPlayer "rotate" 控制
# 缩放由代码控制(基于生命值的动态缩放)
清晰的归属 = 清晰的代码 = 更少的 bug。