Godot gdnative Rust access 属性 在编辑器中定义

Godot gdnative Rust access property defined in the editor

为了了解引擎,我正在尝试一个非常简单的项目——使用编辑器和 gdnative Rust 绑定程序生成一个球体。 我正在尝试跟进使用 GDScript 的 this tutorial 并将 Rust 代码。

我无法弄清楚如何访问编辑器中定义的 属性。 我已经阅读文档并在网上搜索了一个星期,但是有 有些事情让我无法理解,我无法理解如何处理它。

我想做的是访问 ArrayMesh 类型的 mesh 属性,就像我在上面链接的教程中一样,并将我为顶点 - 基本上将这些数组绑定到 ArrayMesh。这是我的场景:

[gd_scene load_steps=4 format=2]

[ext_resource path="res://procedural_earth.gdnlib" type="GDNativeLibrary" id=1]

[sub_resource type="ArrayMesh" id=4]

[sub_resource type="NativeScript" id=3]
resource_name = "ProcEarth"
class_name = "ProcEarth"
library = ExtResource( 1 )

[node name="Earth" type="Spatial"]

[node name="Sphere" type="MeshInstance" parent="."]
mesh = SubResource( 4 )
script = SubResource( 3 )

[node name="Camera" type="Camera" parent="."]
transform = Transform( 0.572229, -0.327396, 0.751909, 0, 0.916856, 0.399217, -0.820094, -0.228443, 0.524651, 4.71648, 2.5, 3.45846 )
current = true

我感兴趣的ArrayMesh结构,在上面的场景中被称为mesh并且是名为“Sphere”的节点的一部分(为了清楚起见而提及)。

我有以下 Rust 代码:

#[derive(NativeClass)]
#[inherit(MeshInstance)]
#[register_with(register_properties)]
struct ProcEarth {
     // ...
}  

impl ProcEarth {

    // ...

   #[export]
   fn _ready(&mut self, owner: &MeshInstance) {

       let mut arr = VariantArray::new_shared();
       // ...
       let blend_shapes = VariantArray::new_shared();
       owner.add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, arr, blend_shapes, 0);
   }
}

但这不起作用,因为我得到的错误是:

no method named `add_surface_from_arrays` found for reference `&gdnative::gdnative_bindings::MeshInstance` in the current scope

method not found in `&gdnative::gdnative_bindings::MeshInstance`rustc(E0599)

有谁知道我如何从编辑器中访问 属性 的 Rust 代码,以便正确设置我的 ArrayMesh?有没有任何教程、文章、视频可以说明这一点?

非常感谢任何指点,因为我目前陷入了这个技术问题 无法进步我的学习。

我在 Linux.

上使用带有 gdnative 0.9.3 的 Godot v3.4.stable.official

方法 add_surface_from_arraysArrayMesh 中定义。鉴于您遇到的错误,您正试图在 MeshInstance.

上调用它

我们可以通过源代码确认这一点,因为您得到 owner: &MeshInstance 并且您正在调用 owner.add_surface_from_arrays(…)

通常你会创建一个 ArrayMesh 并在其上调用 add_surface_from_arrays 传递一个包含顶点数据的数组。之后,您应该可以在 MeshInstance 上调用 set_mesh 并传递 ArrayMesh

let mut am = ArrayMesh::new();
let mut arr = VariantArray::new_shared();
// …
let blend_shapes = VariantArray::new_shared();
am.add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, arr, blend_shapes, 0);
owner.set_mesh(am.cast::<Mesh>());

我相信你可以在 MeshInstance 上调用 mesh 来检索它。请注意,它可以是 MeshArrayMeshPrimitiveMesh)或 nil。 方法 mesh 记录在 return Option<Ref<Mesh, Shared>>