MultiMeshInstance2D
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — MultiMeshInstance2D
MultiMeshInstance2D
节点继承关系
继承链:Node → Node2D → CanvasItem → MultiMeshInstance2D
定义
MultiMeshInstance2D 用于高效批量渲染大量相同的 2D 网格。当你需要画 1000 棵草、10000 颗碎石时,如果每个都创建一个 MeshInstance2D,性能会很差。MultiMeshInstance2D 只用一个节点就能渲染成千上万个相同的网格,性能好得多。
一句话理解:MeshInstance2D 是"一个画框画一幅画",MultiMeshInstance2D 是"一个画师同时画 10000 幅相同的画"——只需一个节点。
使用频率:★★ 偶尔使用——只在需要大量相同物体时使用。
节点用途
- 高效批量渲染大量相同的 2D 网格
- 草地、树叶、碎石、粒子等大量重复物体
- 程序化生成的装饰物
- 替代大量独立 MeshInstance2D 以提升性能
使用场景
| 场景 | 说明 |
|---|---|
| 草地渲染 | 大量草叶的批量渲染 |
| 碎石散布 | 地面上随机分布的碎石 |
| 粒子替代 | 当 GPUParticles2D 不够用时,用 MultiMesh 实现自定义粒子 |
| 树叶/花瓣 | 随风飘散的树叶效果 |
常用节点搭配
| 搭配节点 | 搭配方式 | 用途 |
|---|---|---|
MeshInstance2D | 替代关系 | 物体数量少于 100 时用 MeshInstance2D 更简单 |
GPUParticles2D | 替代关系 | 标准粒子效果用 GPUParticles2D 更方便 |
生效必备素材/资源
| 资源类型 | 格式 | 说明 |
|---|---|---|
MultiMesh | .tres / .res | 核心资源!定义要渲染的网格、数量和变换信息 |
Mesh | 各种 2D Mesh | 基础网格形状(如 QuadMesh、ArrayMesh) |
Texture2D(可选) | .png、.webp | 网格的纹理贴图 |
节点属性与信号
MultiMesh 属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
Multimesh | MultiMesh | null | — | MultiMesh 资源,定义渲染的网格和实例数量 |
Texture | Texture2D | null | — | 覆盖纹理 |
继承自 CanvasItem 的常用属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
SelfModulate | Color | Color(1, 1, 1, 1) | CanvasItem | 颜色调制 |
Visible | bool | true | CanvasItem | 是否可见 |
Material | Material | null | CanvasItem | 自定义材质/着色器(Shader) |
信号
MultiMeshInstance2D 本身没有自定义信号,继承自 CanvasItem。
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
GetMultimesh() | MultiMesh | 获取 MultiMesh 资源 |
SetMultimesh(multimesh) | void | 设置 MultiMesh 资源 |
代码示例
基础用法:批量渲染 1000 个四边形
C
// 创建 MultiMesh 资源
var multiMesh = new MultiMesh();
multiMesh.Mesh = new QuadMesh(); // 基础网格:四边形
multiMesh.TransformFormat = MultiMesh.TransformFormatEnum.Transform3D;
multiMesh.UseColors = true;
multiMesh.InstanceCount = 1000;
// 随机设置每个实例的位置、旋转、缩放和颜色
var rng = new RandomNumberGenerator();
rng.Randomize();
for (int i = 0; i < multiMesh.InstanceCount; i++)
{
Transform3D transform = Transform3D.Identity;
transform.Origin = new Vector3(
rng.RandfRange(-500, 500),
rng.RandfRange(-300, 300),
0
);
transform = transform.RotatedLocal(
new Vector3(0, 0, 1),
rng.RandfRange(0, Mathf.Tau)
);
float scale = rng.RandfRange(0.5f, 2.0f);
transform = transform.ScaledLocal(new Vector3(scale, scale, 1));
multiMesh.SetInstanceTransform(i, transform);
multiMesh.SetInstanceColor(i, new Color(
rng.RandfRange(0.5f, 1.0f),
rng.RandfRange(0.3f, 0.6f),
rng.RandfRange(0.0f, 0.2f)
));
}
// 创建节点并挂载
var meshInst = new MultiMeshInstance2D();
meshInst.Multimesh = multiMesh;
AddChild(meshInst);GDScript
# 创建 MultiMesh 资源
var multi_mesh = MultiMesh.new()
multi_mesh.mesh = QuadMesh.new() # 基础网格:四边形
multi_mesh.transform_format = MultiMesh.TRANSFORM_3D
multi_mesh.use_colors = true
multi_mesh.instance_count = 1000
# 随机设置每个实例的位置、旋转、缩放和颜色
var rng = RandomNumberGenerator.new()
rng.randomize()
for i in range(multi_mesh.instance_count):
var transform = Transform3D.Identity
transform.origin = Vector3(
rng.randf_range(-500, 500),
rng.randf_range(-300, 300),
0
)
transform = transform.rotated_local(
Vector3(0, 0, 1),
rng.randf_range(0, TAU)
)
var scale = rng.randf_range(0.5, 2.0)
transform = transform.scaled_local(Vector3(scale, scale, 1))
multi_mesh.set_instance_transform(i, transform)
multi_mesh.set_instance_color(i, Color(
rng.randf_range(0.5, 1.0),
rng.randf_range(0.3, 0.6),
rng.randf_range(0.0, 0.2)
))
# 创建节点并挂载
var mesh_inst = MultiMeshInstance2D.new()
mesh_inst.multimesh = multi_mesh
add_child(mesh_inst)