Usando Resources Personalizados

¿Alguna vez intentaste tener una forma de guardar/crear datos y usarlos en el juego?

Creando un Resource personalizado

Para crear un recurso personalizado primero debes crear un script quien se encargará de gestionar este recurso. Algo así como su alma:

<nombre_de_tu_script>.gd
extends Resource

En realidad lo que estamos haciendo es crear una clase que va a extender la funcionalidad de Resource, todos los scripts de Godot individualmente son una clase por si mismas. Así que cuando creas un nuevo recurso con este script, estas creando un nuevo objeto de la clase de tu script que añade funcionalidad aResource .

Si quieres usar este recurso en cualquier lugar de Godot, asígnale un nombre al class_name .

Intentemos crear un recurso encargado de guardar información sobre un personaje para un RPG, algo simple, no nos compliquemos las cosas. En este caso, todos los personajes deben tener, como mínimo, estas estadísticas:

  • Nombre del personaje ( character_name )

  • Vida máxima ( health_max )

  • Vida actual ( health_current)

  • Fuerza ( strength )

  • Velocidad de ataque ( attack_speed )

character_data.gd
extends Resource
class_name CharacterData

export(String) var character_name = ""
export(int) var health_max = 1
export(int) var health_current = 0
export(int) var strength = 0
export(int) var attack_speed = 0

Usar class_name hace que Godot registre tu clase en su editor, haciendo que puedas usarla en casi cualquier lugar. Lo necesitamos si queremos crear recursos de este tipo en nuestro sistema de archivos del proyecto.

Creando el recurso en el editor.
Creando el recurso en el código.

Usando un Resource personalizado

Puedes usar un recurso personalizado como cualquier otro recurso de Godot. Ya sea que quieras crear uno nuevo por medio de código para usarlo en ese instante, o crearlo en el editor para usarlo después.

Usemos la clase CharacterData como ejemplo, creemos un personaje en código, y asignemos algunas propiedades:

func _ready() -> void:
		var character := CharacterData.new()
		character.character_name = "Godot"
		character.health_max = 100
		character.strength = 10
		character.attack_speed = 4

Si lo quieres usar como una propiedad de un nodo, y verlo o modificarlo desde el editor puedes, en su lugar, exportar esa variable.

export(Resource) var un_recurso_cualquiera
Variable exportada del tipo Resource
El recurso personalizado

Debido a la naturaleza de como son tratados los recursos en Godot, no puedes exportar un recurso personalizado, solamente un Resource y de ahí escoges el recurso a usar. Sin embargo, existe una forma de exportar un recurso personalizado.

Guardando un Resource personalizado

Guardar un recurso personalizado es lo mas sencillo de la vida. Godot trae consigo una clase específicamente para guardar recursos en código, ResourceSaver, quien se encargará de guardarlo por ti.

Para guardarlo en el disco, solo escogemos la ubicación, el nombre y su extensión:


ResourceSaver.save(
    "ruta/donde/quieres/guardar/el/character.tres",
    character
    )

La extensión es muy importante, es el texto que viene después del ultimo punto (.) y determina de que forma quieres que el ResourceSaver guarde tu recurso.

Si quieres guardarlo con otra extensión, tendrás que decirle a Godot de que forma va a guardarlos, y se hace con una clase diferente, bajo otra implementación.

Cargando un Resource personalizado

Una vez que el recurso esté guardado en el disco, puedes cargarlo en cualquier momento con load( ) o ResourceLoader.load( ) que vienen siendo prácticamente lo mismo:

# En cualquier parte de tu codigo puedes escribir esto
# para cargar un recurso previamente guardado.

var un_recurso_cualquiera = load("/ruta/al/recurso.tres")
# O puedes hacer tambien esto si quieres crear un nuevo
# recurso de tu tipo personalizado en lugar de cargarlo.
# Usaremos "CharacterData" como ejemplo:

var un_recurso_cualquierda = CharacterData.new()

Mas información

Enfrentémoslo, en algún momento de tu desarrollo dijiste "¿como se supone que vaya a guardar esto?", te fuiste por las ramas y por alguna razón terminaste escribiendo un complejo formato para guardarlo en un archivo de texto con una extensión rara, o de lleno usaste JSON, para luego enfrentarte a la realidad de que, una vez guardados los datos, tendrás que acomodarlos de nuevo cuando abras ese archivo y quieras usar los datos.

Quizás alguien te dijo que podías usar la clase Resource y te dio un enlace a la documentación y al tutorial de recursos personalizados, pero luego de echarle una mirada y tantear un poco con el código, decidiste que era mejor seguir usando el rudimentario formato que venias usando.

¿Por que usar recursos si ya tengo una forma de guardar mis datos?

Si tienes una forma de guardar tus datos, y los datos son usados por otras aplicaciones además de Godot, perfecto, mantenlo así; si funciona, para que cambiarlo ¿no? De todas formas, puedes usar recursos para guardar tus datos y exportarlos en otro formato después, los recursos pueden ser escritos en un archivo de una forma especial al ser guardados, así que obtienes lo mejor de ambos mundos.

Si tus datos son solamente usados en Godot, o apenas te estas preguntando como vas a guardar tus datos, te pido que reconsideres usar recursos. A medida que tu proyecto crezca, tu forma de guardar datos probablemente también aumente en complejidad, al punto en que podrías caer en una especie de abismo de espagueti.

El tutorial de recursos personalizados de Godot enumera las ventajas de usarlos, en las que destaco:

  • Posee todas las propiedades de Resource,Reference y Object por lo que puede ser serializado y usado en el editor, u obtener ayudas al momento de referenciar este tipo de objetos en código.

  • Al ser un objeto, sus propiedades están definidas. Tu dato va a existir, si o si, así su valor sea null .

  • Puedes definir y emitir señales.

  • Godot va a encargarse de la tarea de guardar tu recurso como un archivo en el disco. Es algo que viene integrado en el motor y no debes preocuparte por eso. Nunca más sufrirás de la compleja tarea de organizar tus datos antes de guardarlos como archivo.

¿No hay algo mas sencillo que usar Resource para guardar datos?

¡Claro que lo hay!

Puedes usar archivos de configuración ConfigFiles o guardar tus variables, una por una, con el método store_var de la clase File .

En lo personal, prefiero usar ConfigFile cuando quiero guardar datos y no quiero usar la clase Resource, es más sencillo, rápido y estable a largo plazo, siempre que no sé te olvide las propiedades que ahí mismo guardas.

Last updated

Was this helpful?