원클릭으로
godot-split-scripts
用于 Godot 脚本超过 150 行或承担多个职责时。 检测做了太多事情的脚本(玩家移动 + 战斗 + 背包 + UI)。 自动按照单一职责原则拆分为专注的脚本, 精确保留原有行为,并为每次拆分创建 git 提交。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
用于 Godot 脚本超过 150 行或承担多个职责时。 检测做了太多事情的脚本(玩家移动 + 战斗 + 背包 + UI)。 自动按照单一职责原则拆分为专注的脚本, 精确保留原有行为,并为每次拆分创建 git 提交。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | godot-split-scripts |
| version | 3.0.0 |
| displayName | 拆分臃肿脚本 |
| description | 用于 Godot 脚本超过 150 行或承担多个职责时。 检测做了太多事情的脚本(玩家移动 + 战斗 + 背包 + UI)。 自动按照单一职责原则拆分为专注的脚本, 精确保留原有行为,并为每次拆分创建 git 提交。 |
| author | Asreonn |
| license | MIT |
| category | game-development |
| type | tool |
| difficulty | intermediate |
| audience | ["developers"] |
| keywords | ["godot","script-splitting","refactoring","single-responsibility","component-pattern","gdscript","code-organization","monolithic-scripts"] |
| 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 | 拆分后的单一职责脚本、保留的原有行为、每次拆分的 git 提交 |
| requirements | Git 仓库、Godot 4.x |
| execution | 全自动,包含行为验证 |
| integration | 属于 godot-refactor 编排器的一部分,可与 godot-add-signals 配合使用 |
一个脚本,一个职责。 超过 150 行的脚本通常承担了太多事情。
找到类似这样的脚本:
# player.gd - 500 行
class_name Player
extends CharacterBody2D
# 移动(第 1-100 行)
func _physics_process(delta): ...
func handle_input(): ...
func move(): ...
# 战斗(第 101-200 行)
func take_damage(amount): ...
func attack(): ...
func die(): ...
# 背包(第 201-350 行)
func add_item(item): ...
func remove_item(item): ...
func use_item(item): ...
# UI(第 351-500 行)
func update_health_bar(): ...
func show_inventory(): ...
转换为:
# player.gd - 50 行(协调器)
class_name Player
extends CharacterBody2D
@onready var movement = $MovementComponent
@onready var combat = $CombatComponent
@onready var inventory = $InventoryComponent
@onready var ui = $UIComponent
# 委托给各组件
识别以下特征的脚本:
向已经很大的脚本中添加新功能只会让情况更糟。
大型脚本难以理解和测试。
更小的脚本减少合并冲突,改善代码审查体验。
单一职责的脚本更容易进行隔离测试。
之前(player.gd - 300 行):
extends CharacterBody2D
const SPEED = 300.0
const JUMP_VELOCITY = -400.0
var health = 100
var max_health = 100
var inventory = []
func _physics_process(delta):
# 移动逻辑(50 行)
...
func take_damage(amount):
# 战斗逻辑(30 行)
...
func add_item(item):
# 背包逻辑(40 行)
...
func update_ui():
# UI 逻辑(30 行)
...
之后(player.gd - 30 行):
extends CharacterBody2D
@onready var movement: MovementComponent = $MovementComponent
@onready var combat: CombatComponent = $CombatComponent
@onready var inventory: InventoryComponent = $InventoryComponent
@onready var ui: UIComponent = $UIComponent
func _ready():
combat.health_changed.connect(ui.update_health_bar)
inventory.item_added.connect(ui.update_inventory)
创建的新文件:
movement_component.gd - 处理 SPEED、JUMP_VELOCITY、_physics_processcombat_component.gd - 处理 health、take_damage、dieinventory_component.gd - 处理 inventory 数组、add_item、remove_itemui_component.gd - 处理 update_health_bar、show_inventory按游戏概念拆分(移动、战斗、背包)。
按抽象层级拆分(输入处理、状态管理、渲染)。
按变更原因不同来拆分。
识别清晰的边界:
保留集成:
可搭配使用:
以下情况不要拆分:
保持简单的事情简单。
默认值:150 行(Godot 最佳实践)
可根据以下因素调整:
低于阈值的脚本会被跳过,除非它们明显承担了多个职责。
当 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。 每个操作针对特定的位置冲突类型。