如何在Godot 2D编辑器中编辑嵌套于Area2D场景内的Polygon2D节点形状并实现实时预览?
如何在Godot 2D编辑器中编辑嵌套于Area2D场景内的Polygon2D节点形状并实现实时预览?
嘿,我明白你遇到的问题了——编辑器里看不到运行时才生成的形状,没法直观调整,确实挺头疼的。其实Godot里有个很实用的特性叫@tool脚本,能帮你解决这个问题,让你在编辑器里实时预览和编辑这些多边形形状。下面一步步来给你说怎么弄:
第一步:改造LandRegion脚本,让它支持编辑器实时更新
你的LandRegion场景是Area2D包含Polygon2D和CollisionPolygon2D,我们要给它的脚本加上@tool注解,这样脚本就能在编辑器环境里运行,修改导出变量时立刻同步到节点上。
具体代码示例如下:
@tool extends Area2D # 导出多边形形状变量,用PackedVector2Array比普通数组更高效,编辑器支持也更好 @export var region_shape: PackedVector2Array = PackedVector2Array() setget set_region_shape # 提前获取子节点引用,编辑器里也能正常访问 @onready var polygon_2d: Polygon2D = $Polygon2D @onready var collision_polygon: CollisionPolygon2D = $CollisionPolygon2D func _ready(): # 场景加载时同步形状,确保编辑器打开就能看到 update_shape() # 自定义setter函数,变量变化时自动同步形状 func set_region_shape(new_shape: PackedVector2Array): region_shape = new_shape update_shape() # 统一处理形状同步逻辑 func update_shape(): if polygon_2d: polygon_2d.polygon = region_shape if collision_polygon: collision_polygon.polygon = region_shape # 通知编辑器刷新视图 if Engine.is_editor_hint(): queue_redraw()
加了这个脚本后,你打开LandRegion场景,在编辑器的检查器面板里修改region_shape数组,就能实时看到Polygon2D和CollisionPolygon2D的形状变化了——不用运行游戏就能预览!
第二步:让LandMap也支持编辑器实时生成地图
如果你的LandMap是批量生成LandRegion的,同样可以给它加@tool脚本,让它在编辑器里就能生成所有区域并显示出来:
@tool extends Node2D # 导出所有区域的形状数组 @export var region_shapes: Array[PackedVector2Array] = [] setget set_region_shapes # 形状数组变化时重新生成所有区域 func set_region_shapes(new_shapes: Array[PackedVector2Array]): region_shapes = new_shapes regenerate_regions() # 批量生成LandRegion实例 func regenerate_regions(): # 先清理现有区域节点 for child in get_children(): if child is Area2D and child.name.begins_with("LandRegion"): child.queue_free() # 加载LandRegion场景并实例化 var region_scene = load("res://path/to/your/LandRegion.tscn") for i in range(region_shapes.size()): var region_instance = region_scene.instantiate() region_instance.name = "LandRegion_" + str(i) region_instance.region_shape = region_shapes[i] add_child(region_instance)
现在你打开LandMap场景,在检查器里修改region_shapes数组,编辑器会自动删除旧的区域,生成新的带形状的LandRegion,整个地图直接在编辑器里可视化出来了!
一些注意事项
- 节点路径要正确:确保
$Polygon2D和$CollisionPolygon2D的路径和你场景里的节点名称完全一致,不然编辑器里找不到节点就没法同步形状。 - 区分编辑器和运行时逻辑:如果你的脚本里有游戏运行时的逻辑(比如交互、AI之类的),要加上判断避免在编辑器里执行:
func _process(delta): if Engine.is_editor_hint(): return # 这里放你的运行时逻辑 - 清空默认形状:如果LandRegion里的Polygon2D或CollisionPolygon2D有默认形状,记得把它们的默认多边形清空,避免和脚本设置的形状冲突。
这样改造后,你就能在Godot的2D编辑器里直观地编辑每个区域的形状,实时预览整个地图的样子,不用每次都运行游戏来查看效果啦!
备注:内容来源于stack exchange,提问作者Luke Sills




