

代码如下:
@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:
问:为什么不选择实时更新? 答:因为手动更新性能消耗非常小。