게임/고도엔진 문법

19. [고도 엔진] 파일 입출력(FileAccess): 게임 데이터 저장하고 불러오기

밀감감 2026. 7. 7. 12:00
반응형

 

이 카테고리는 고도 엔진(Godot Engine) 관련 문법을 기록하고 저장하기 위해 만든 공간입니다.

 

이번에는 '파일 입출력(FileAccess): 게임 데이터 저장하고 불러오기'입니다.

예를 들면 플레이어가 열심히 모은 골드, 현재 레벨, 인벤토리 아이템 등은 게임을 종료하면 메모리에서 전부 사라집니다. 다음번에 게임을 다시 켰을 때 기존 데이터를 안전하게 이어서 플레이할 수 있도록 하려면 데이터를 하드디스크나 스마트폰 저장소에 '파일'로 저장하고 다시 읽어와야 합니다. 고도 4에서는 FileAccess 객체를 사용해 이를 매우 쉽게 처리할 수 있습니다.

1. user:// 경로와 데이터 저장하기 (WRITE)

고도 엔진에서 게임 데이터를 저장할 때는 보안과 운영체제별 권한 문제를 피하기 위해 반드시 user://로 시작하는 경로를 사용해야 합니다. 이는 고도 엔진이 각 OS에 맞춰 자동으로 지정해 주는 안전한 전역 저장 공간입니다.

GDScript
 
extends Node

var save_path = "user://save_data.dat"

func save_game():
    # 1. 쓰기(WRITE) 모드로 파일을 엽니다. (파일이 없으면 새로 생성됨)
    var file = FileAccess.open(save_path, FileAccess.WRITE)
    
    if file:
        # 2. 저장할 데이터를 딕셔너리 형태로 묶어줍니다.
        var game_data = {
            "player_level": 12,
            "gold": 5000,
            "player_name": "아더"
        }
        # 3. store_var() 함수로 데이터 구조를 통째로 저장합니다.
        file.store_var(game_data)
        print("게임 데이터 저장 완료!")

2. 안전하게 데이터 불러오기 (READ)

데이터를 불러올 때는 파일이 진짜 존재하는지 file_exists() 함수로 먼저 확인하는 것이 필수입니다. 파일이 없는데 읽으려고 하면 에러가 발생해 게임이 강제 종료될 수 있습니다.

GDScript
 
func load_game():
    # 1. 파일이 존재하는지 검사합니다.
    if not FileAccess.file_exists(save_path):
        print("저장된 파일이 없습니다. 새로 시작합니다.")
        return

    # 2. 읽기(READ) 모드로 파일을 엽니다.
    var file = FileAccess.open(save_path, FileAccess.READ)
    
    if file:
        # 3. get_var()로 저장했던 데이터를 그대로 복원합니다.
        var loaded_data = file.get_var()
        
        # 4. 불러온 데이터를 변수에 대입합니다.
        var level = loaded_data["player_level"]
        var gold = loaded_data["gold"]
        print("불러오기 성공! 레벨: ", level, ", 골드: ", gold)

한눈에 보는 파일 입출력 핵심 요약

함수 / 키워드 기능 설명 게임 속 사용 예시
user:// 고도 엔진 전용의 안전한 사용자 데이터 저장 경로 모바일, PC 등 OS에 구애받지 않고 세이브 파일을 저장할 때
FileAccess.open(경로, 모드) 파일을 읽거나 쓰기 위해 여는 함수 세이브 데이터를 새로 기록하거나 불러오기 직전에 호출
FileAccess.WRITE / READ 파일을 열 때 설정하는 쓰기 / 읽기 권한 모드 데이터를 저장할 때는 WRITE, 불러올 때는 READ 사용
FileAccess.file_exists(경로) 지정한 경로에 파일이 실제로 존재하는지 체크 타이틀 화면에서 유저에게 '이어하기' 버튼을 활성화할지 판단할 때
store_var() / get_var() 딕셔너리, 배열 등 고도의 데이터 구조를 통째로 쓰고 읽음 캐릭터 능력치, 퀘스트 진행도 등 복잡한 데이터를 한 번에 관리할 때
반응형