Acceder a las propiedades de Godot gdnative Rust definidas en el editor.
Como traductor de español que traduce documentos de TI, traduzca lo siguiente al español. No traduzca el código ni la salida en formato Markdown.
Para aprender sobre el motor, estoy intentando realizar un proyecto muy simple: generar de forma procedural una esfera utilizando el editor y los enlaces de Rust nativos GD. Estoy intentando seguir este tutorial que utiliza GDScript y convertir el código a Rust.
Tengo problemas para averiguar cómo acceder a una propiedad definida en el editor. Llevo una semana leyendo la documentación y buscando en la web, pero algo me escapa y no soy capaz de entender cómo proceder.
Lo que quiero hacer es acceder a la propiedad “mesh”, de tipo ArrayMesh, igual que en el tutorial que he enlazado antes, y unir a ella las matrices que he generado para los vértices, es decir, unir esas matrices a ArrayMesh. Aquí está mi escena:
[Escena cargada=4 formato=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
La estructura ArrayMesh que me interesa se llama “mesh” en la escena anterior y es parte del nodo llamado “Sphere” (mencionándolo solo por claridad).
Tengo el siguiente código 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);
}
}
Pero eso no funciona ya que el error que obtengo es: “No se encontró ningún método llamado ‘add_surface_from_arrays’ para la referencia ‘&gdnative::gdnative_bindings::MeshInstance’ en el alcance actual”.
¿Alguien sabe cómo podría acceder en el código Rust a esa propiedad del editor para establecer correctamente mi ArrayMesh? ¿Hay algún tutorial, artículo o video que lo ejemplifique?
Cualquier ayuda es altamente apreciada ya que actualmente estoy atascado en esta técnica y no puedo avanzar en mi aprendizaje.
Estoy usando la versión de Godot v3.4.stable.official con el gdnative 0.9.3 en Linux.
davy.ai
Para acceder a la propiedad
mesh
en el código Rust, se pueden usar los métodosget_node
yget
proporcionados por la claseNode
para recuperar el nodoMeshInstance
y el recursoArrayMesh
respectivamente. Aquí hay un ejemplo de código:En este ejemplo, se define una clase
ProcEarth
que almacena una referencia al nodoMeshInstance
y la usa para acceder a la propiedadmesh
. En el método_ready
, se recupera el nodoMeshInstance
usando el métodoget_node
y se almacena en el campomesh_instance
. En el métodoupdate_mesh
(no se muestra en el código), se recupera el recursoArrayMesh
usando el métodomesh
deMeshInstance
y se modifican los datos del array según sea necesario antes de vincularlos alArrayMesh
usando el métodoset_arrays
de la claseSurface
.Tenga en cuenta que el ejemplo de código asume que el nodo
Sphere
y el nodoMeshInstance
son hijos directos del nodoProcEarth
. Es posible que deba ajustar las cadenas de ruta de nodo para que coincidan con la jerarquía de su escena.