You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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,整个地图直接在编辑器里可视化出来了!

一些注意事项

  1. 节点路径要正确:确保$Polygon2D$CollisionPolygon2D的路径和你场景里的节点名称完全一致,不然编辑器里找不到节点就没法同步形状。
  2. 区分编辑器和运行时逻辑:如果你的脚本里有游戏运行时的逻辑(比如交互、AI之类的),要加上判断避免在编辑器里执行:
    func _process(delta):
        if Engine.is_editor_hint():
            return
        # 这里放你的运行时逻辑
    
  3. 清空默认形状:如果LandRegion里的Polygon2D或CollisionPolygon2D有默认形状,记得把它们的默认多边形清空,避免和脚本设置的形状冲突。

这样改造后,你就能在Godot的2D编辑器里直观地编辑每个区域的形状,实时预览整个地图的样子,不用每次都运行游戏来查看效果啦!

备注:内容来源于stack exchange,提问作者Luke Sills

火山引擎 最新活动