Tutorial Godot: Leer y escribir archivos


Antes de comenzar el tutorial es necesario aclarar algunos puntos importantes para no confundir cuando se programe este tipo de cosas.
  1. El editor de Godot no reconoce archivos de texto.
  2. Aunque estés trabajando con archivos de texto como *.txt, *.md, *.json, *.xml, etc. No lo verás en el editor pero eso no significa que Godot no puede acceder a estos archivos.
  3. Para almacenar información del usuario, debes usar el directorio user:// (explicado mas adelante).
  4. Las pruebas directas desde el editor podrán leer cualquier archivo que desees, incluso fuera de la carpeta del proyecto, pero cuando exportes debes declarar que el archivo o la extensión del archivo debe ser importado, de lo contrario cuando exportes no funcionará.

Ahora sí, pasamos al tutorial.

Para poder acceder a los archivos Godot ofrece una clase llamada File, con ella tenemos todos los métodos necesarios para realizar tanto lectura como escritura de archivos.

Vea el siguiente código.

func write(dir, data):# dir seria la ubicacion del archivo y data el dato a guardar
    var file = File.new() # Instanciamos un File
    file.open(dir, File.WRITE) # Abrimos el archivo en modo escritura
    file.store_string(data) #Almacenamos el dato como texto si no:
    # file.store_var(data) en caso de querer almacenar una variable, como un dict o array
    file.close() # Siempre debemos cerrar el file 
Aparte de store_string y store_var hay mas métodos que se pueden usar, como store_line para almacenar solo una linea de texto, store_real para almacenar un número flotante, o store_64 para almacenar números.

Si quieres almacenar una cantidad de variables puedes poner el método store_*(lo que sea) varias veces y godot almacenará las variables en ese orden, lo que significa que cuando necesitemos leer estas variables tenemos que hacerlo también en el mismo orden exacto, para evitar problemas, yo te recomendaría almacenar un diccionario directamente.

Otro dato importante es que no se puede almacenar escenas completas de esta manera, tampoco es recomendado, lo mejor sería aplicar un patrón de Factory y almacenar los datos importantes de la escena. Creas un método de factory que instancie una escena prefabricada y con los datos almacenados modificas la escena para dejarla cómo la guardaste.

Ahora veamos cómo leer archivos:
func read(dir): # dir seria la ubicacion del archivo
    var file = File.new() # Instanciamos un File
    if not file.file_exists(dir): # Nos aseguramos que el archivo a leer existe
        return null # Retornamos null y no hacemos nada si no existe el archivo
    file.open(dir, File.READ) # Abrimos el archivo en modo lectura
    var data = file.get_as_text() # obtenemos el contenido en formato texto, sino:
    # var data = file.get_var() # en caso de haber almacenado una variable
    file.close()
    return data # Devolvemos el dato leido.
Siempre es importante consultar si el archivo a leer existe, porque si intentamos abrir un archivo que no existe nos dará un error.

Res y User


res:// es el directorio donde se almacena el código fuente del juego, user:// es el directorio que Godot te asegura para almacenar datos del usuario, la ubicación del directorio depende del sistema operativo.

En windows el directorio sería:%APPDATA%\Godot\app_userdata\Project Name
En linux el directorio sería:$HOME/.godot/app_userdata/Project Name
Con el método OS.get_user_data_dir() podemos obtener el directorio por defecto según el dispositivo.

Sí deseas almacenar datos como las puntuaciones, estado del jugador, nombre de jugador, inventario, etc. Debes usar el directorio user://, en caso de necesitar simplemente leer una lista o una base de datos entonces usar res://

No uses res:// si vas a necesitar escribir en el archivo.

Comprobando el código

Podemos hacer una escena sencilla con un nodo Control y de hijos un Button y un LineEdit y agregamos un script con lo siguiente:
Data es el script donde guardamos los métodos write y save, y lo cargamos como un autoload.
Así, podemos escribir algo en el LineEdit y dar clic en el botón Save, cerramos el juego y lo volvemos abrir y veremos lo que hemos guardado escrito en el LineEdit.

Comentarios

Publicar un comentario