You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:45:08