Godot GDNative Rust如何访问编辑器中定义的ArrayMesh属性
问题解决思路
错误原因
add_surface_from_arrays是ArrayMesh类型的成员方法,不属于MeshInstance,你直接在MeshInstance实例上调用该方法自然会报错。你需要先从MeshInstance节点中获取到编辑器中绑定的mesh属性,转换为ArrayMesh类型后再操作。
正确实现代码
修改你的_ready方法逻辑如下:
#[export] fn _ready(&mut self, owner: &MeshInstance) { // 1. 获取MeshInstance上绑定的mesh资源,转为ArrayMesh类型 let mesh = owner.mesh() .expect("请先在编辑器中为Sphere节点的mesh属性绑定ArrayMesh资源") .cast::<ArrayMesh>() .expect("绑定的mesh资源类型不为ArrayMesh,请检查场景配置"); // 2. 获取ArrayMesh的可变访问权限 let mut mesh = mesh.write() .expect("ArrayMesh资源被占用,无法获取可变访问权限"); // 3. 清除已有surface(可选,避免编辑器预设的空数据残留) mesh.clear_surfaces(); // 4. 填充顶点数组,严格遵循Godot的Mesh数组顺序要求 let mut arr = VariantArray::new_shared(); arr.resize(Mesh::ARRAY_MAX as usize); // 示例:添加顶点数据,替换为你自己生成的顶点数组 // let vertices = Vector3Array::from_vec(vec![Vector3::new(0.0, 1.0, 0.0), Vector3::new(-1.0, -1.0, 0.0), Vector3::new(1.0, -1.0, 0.0)]); // arr.set(Mesh::ARRAY_VERTEX as usize, vertices.to_variant()); let blend_shapes = VariantArray::new_shared(); // 5. 为ArrayMesh添加表面 mesh.add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, arr, blend_shapes, 0); }
注意事项
- 顶点数组的填充顺序必须严格匹配Godot定义的
Mesh::ArrayType枚举顺序,依次为顶点、法线、切向量、颜色、UV0、UV1、UV2、UV3、骨骼权重、骨骼索引,缺少的项可以留空,不能错位 - 如果你不需要在编辑器提前绑定ArrayMesh,也可以在代码中直接创建新的ArrayMesh实例,通过
owner.set_mesh(new_mesh.upcast::<Mesh>())赋值给MeshInstance即可,效果完全一致
参考资料方向
- 官方gdnative-rust仓库的examples目录,包含网格生成的完整示例
- Godot官方文档中ArrayMesh的API说明,GDScript的API与Rust绑定的API命名逻辑完全一致,可以对照使用
内容的提问来源于stack exchange,提问作者celavek
相关产品推荐
相关产品推荐

