Polygon2D
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Polygon2D
Polygon2D
节点继承关系
继承链:Node → Node2D → CanvasItem → Polygon2D
定义
Polygon2D 绘制自定义的 2D 多边形——你可以通过指定一组顶点来画出任意形状。三角形、五角星、盾牌、激光、地形块……只要你能说出顶点坐标,它就能画出来。它还能填充颜色、贴纹理,功能非常灵活。
一句话理解:Sprite2D 是显示一张现成的图片,Polygon2D 是你自己用"连接点"的方式画出一个形状,就像用钉子和大头针在软木板上围出一个图形。
使用频率:★★★ 一般常用——需要自定义形状或程序化生成图形时使用。
节点用途
- 绘制任意 2D 多边形形状
- 填充纯色或纹理
- 程序化生成形状(如随机地形、雷达扫描区域)
- 实现不规则遮挡效果(配合 VisibilityNotifier)
- 绘制扇形、弧形等数学图形
使用场景
| 场景 | 说明 |
|---|---|
| 自定义形状 | 盾牌、激光束、扇形攻击范围等 |
| 程序化地形 | 动态生成的地形多边形 |
| 雷达/扫描效果 | 扇形扫描区域 |
| 阴影/遮罩 | 不规则形状的阴影遮罩 |
| 地图区域 | 在地图上标示特定区域 |
常用节点搭配
| 搭配节点 | 搭配方式 | 用途 |
|---|---|---|
CollisionPolygon2D | 作为兄弟子节点 | 给多边形加上碰撞体 |
Line2D | 配合使用 | Line2D 画边框,Polygon2D 填充内部 |
Area2D | 作为父节点 | 检测区域内的物体 |
生效必备素材/资源
| 资源类型 | 格式 | 说明 |
|---|---|---|
Texture2D(可选) | .png、.webp | 填充纹理。不设置则使用纯色填充 |
节点属性与信号
多边形属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
Polygon | PackedVector2Array | [] | — | 多边形顶点数组。至少需要 3 个点才能形成形状 |
Polygons | PackedInt32Array[] | [] | — | 多个多边形索引数组(用于"带洞"的多边形) |
InternalVertices | int | 0 | — | 内部顶点数(高级用法) |
外观属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
Color | Color | Color(1, 1, 1, 1) | — | 填充颜色 |
Texture | Texture2D | null | — | 填充纹理 |
TextureRotation | float | 0.0 | — | 纹理旋转角度(度) |
TextureOffset | Vector2 | Vector2(0, 0) | — | 纹理偏移量 |
TextureScale | Vector2 | Vector2(1, 1) | — | 纹理缩放 |
Uv | PackedVector2Array | [] | — | 自定义 UV 映射坐标 |
VertexColors | PackedColorArray | [] | — | 每个顶点的颜色(可做渐变效果) |
Antialiased | bool | false | — | 是否启用抗锯齿(边缘更平滑) |
继承自 CanvasItem 的常用属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
SelfModulate | Color | Color(1, 1, 1, 1) | CanvasItem | 颜色调制 |
Visible | bool | true | CanvasItem | 是否可见 |
Material | Material | null | CanvasItem | 自定义材质 |
信号
Polygon2D 本身没有自定义信号,继承自 CanvasItem。
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
GetPolygon() | PackedVector2Array | 获取多边形顶点数组 |
SetPolygon(polygon) | void | 设置多边形顶点数组 |
代码示例
基础用法:画一个三角形
C
var poly = new Polygon2D();
// 定义三角形的三个顶点
poly.Polygon = new Vector2[]
{
new(0, -50), // 顶部
new(-50, 50), // 左下
new(50, 50) // 右下
};
poly.Color = Colors.Cyan;
AddChild(poly);GDScript
var poly = Polygon2D.new()
# 定义三角形的三个顶点
poly.polygon = PackedVector2Array([
Vector2(0, -50), # 顶部
Vector2(-50, 50), # 左下
Vector2(50, 50) # 右下
])
poly.color = Color.CYAN
add_child(poly)画一个扇形(攻击范围指示)
C
// 生成扇形多边形顶点
private Vector2[] GenerateFanShape(float radius, float angleDegrees, int segments)
{
var points = new Vector2[segments + 2];
points[0] = Vector2.Zero; // 圆心
float startAngle = -Mathf.DegToRad(angleDegrees / 2);
float endAngle = Mathf.DegToRad(angleDegrees / 2);
float step = (endAngle - startAngle) / segments;
for (int i = 0; i <= segments; i++)
{
float angle = startAngle + step * i;
points[i + 1] = new Vector2(
Mathf.Cos(angle) * radius,
Mathf.Sin(angle) * radius
);
}
return points;
}
// 使用:创建 90 度扇形
var fan = new Polygon2D();
fan.Polygon = GenerateFanShape(80, 90, 16);
fan.Color = new Color(1, 0, 0, 0.3f); // 半透明红色
AddChild(fan);GDScript
# 生成扇形多边形顶点
func generate_fan_shape(radius: float, angle_degrees: float, segments: int) -> PackedVector2Array:
var points = PackedVector2Array()
points.append(Vector2.ZERO) # 圆心
var start_angle = -deg_to_rad(angle_degrees / 2)
var end_angle = deg_to_rad(angle_degrees / 2)
var step = (end_angle - start_angle) / segments
for i in range(segments + 1):
var angle = start_angle + step * i
points.append(Vector2(
cos(angle) * radius,
sin(angle) * radius
))
return points
# 使用:创建 90 度扇形
var fan = Polygon2D.new()
fan.polygon = generate_fan_shape(80, 90, 16)
fan.color = Color(1, 0, 0, 0.3) # 半透明红色
add_child(fan)顶点渐变效果
C
// 创建一个带顶点颜色渐变的矩形
var poly = new Polygon2D();
poly.Polygon = new Vector2[]
{
new(-50, -50),
new(50, -50),
new(50, 50),
new(-50, 50)
};
// 每个顶点设置不同颜色
poly.VertexColors = new Color[]
{
Colors.Red, // 左上:红色
Colors.Yellow, // 右上:黄色
Colors.Blue, // 右下:蓝色
Colors.Green // 左下:绿色
};
AddChild(poly);GDScript
# 创建一个带顶点颜色渐变的矩形
var poly = Polygon2D.new()
poly.polygon = PackedVector2Array([
Vector2(-50, -50),
Vector2(50, -50),
Vector2(50, 50),
Vector2(-50, 50)
])
# 每个顶点设置不同颜色
poly.vertex_colors = PackedColorArray([
Color.RED, # 左上:红色
Color.YELLOW, # 右上:黄色
Color.BLUE, # 右下:蓝色
Color.GREEN # 左下:绿色
])
add_child(poly)