Godot 学习笔记 #region折叠代码 插件
Shary的布丁
2025年08月27日 16:34
Godot游戏开发

代码如下:

@tool

extends EditorPlugin

#region 变量名

var region_panel : VBoxContainer

var tree : Tree

var scroll_container : ScrollContainer

var refresh_button : Button

var vbox : VBoxContainer # 新增的垂直布局容器

#endregion

#region 界面设置

func _enter_tree():

# 创建主容器

region_panel = VBoxContainer.new()

region_panel.name = "#Region导航器"

region_panel.size_flags_vertical = Control.SIZE_EXPAND_FILL

# 创建垂直布局容器

vbox = VBoxContainer.new()

vbox.size_flags_vertical = Control.SIZE_EXPAND_FILL

region_panel.add_child(vbox)

# 创建刷新按钮

refresh_button = Button.new()

refresh_button.text = "刷新"

refresh_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL

refresh_button.pressed.connect(_update_regions)

vbox.add_child(refresh_button)

# 创建滚动容器

scroll_container = ScrollContainer.new()

scroll_container.size_flags_vertical = Control.SIZE_EXPAND_FILL

vbox.add_child(scroll_container)

# 创建Tree控件

tree = Tree.new()

tree.size_flags_vertical = Control.SIZE_EXPAND_FILL

tree.size_flags_horizontal = Control.SIZE_EXPAND_FILL

tree.custom_minimum_size = Vector2(200, 300)

tree.item_selected.connect(_on_item_selected)

scroll_container.add_child(tree)

# 添加到编辑器停靠栏

add_control_to_dock(DOCK_SLOT_LEFT_UR, region_panel)

EditorInterface.get_script_editor().editor_script_changed.connect(_update_regions)

func _exit_tree():

remove_control_from_docks(region_panel)

region_panel.queue_free()

#endregion

#region #​region更新

func _update_regions(script: Script = null):

tree.clear()

var current_editor = EditorInterface.get_script_editor().get_current_editor()

if current_editor and current_editor.get_base_editor() is TextEdit:

var text_edit : TextEdit = current_editor.get_base_editor()

var root = tree.create_item()

for i in text_edit.get_line_count():

var line = text_edit.get_line(i).strip_edges()

if line.begins_with("#region"):

var item = tree.create_item(root)

item.set_text(0, "%d: %s" % [i+1, line.replace("#region", "").strip_edges()])

item.set_meta("line_number", i)

#endregion

#region 跳转行

func _on_item_selected():

var selected = tree.get_selected()

if not selected or not selected.has_meta("line_number"):

return

var line = selected.get_meta("line_number")

_jump_to_line(line)

func _jump_to_line(line: int):

var script_editor = EditorInterface.get_script_editor()

var current_editor = script_editor.get_current_editor()

if current_editor and current_editor.get_base_editor() is TextEdit:

var text_edit : TextEdit = current_editor.get_base_editor()

text_edit.set_caret_line(line)

text_edit.center_viewport_to_caret()

tree.deselect_all()

#endregion

添加方法

1.项目——项目设置——插件,点击 “创建新插件” 按钮

2.“插件名” 改成需要的名字(已abc为例),“现在激活吗” 不勾选

3.点击 “创建” 按钮,删除abc.gd中的所有内容,粘贴上面的代码,并保存

4.项目——项目设置——插件,选择“abc”,启用

5关闭 “项目设置”

注:

1.插件在左上角 “场景面板” 的 右侧

2.手动点击“刷新” 按钮-更新,或 在 “Script编辑器” 中切换脚本-更新

PS:

问:为什么不选择实时更新? 答:因为手动更新性能消耗非常小。