[Godot] 저장과 불러오기 구현

STOVE Store

커뮤니티 게시판 글상세

Amateur Indie Creator

글상세

Amateur Indie Creator

[Sparkle] [Godot] 저장과 불러오기 구현 [14]

대부분의 게임 제작 입문서에서는 일부러라도 저장과 불러오기를 잘 알려주지 않습니다.
이유는 간단합니다. 저장 파일을 만들고, 읽어들이고, 덮어씌우는 과정은, 게임 개발툴을 벗어나는 OS에 대한 지식도 요구하는 상당히 귀찮은 과정이거든요.

고도 엔진의 경우, 이 과정을 쉽게 만들어주는 configFile이라는 빌트인 함수를 제공하고 있습니다.



도움말 검색에서 configFile을 찾아보시면 정말 상세한 사용방법이 나와 있습니다.
제가 적는 글은 결국 이 내용의 반복이긴 한데... 그래도 한글과 과정을 보여주는 편이 좋겠죠? ㅎㅎㅎ


■ configFile 생성과 저장하기



configFile 빌트인 함수입니다. 지난번에 RandomNumberGenerator 에서 한번 보신 것처럼,
우선 인스턴스로 생성해 줄 필요가 있습니다. 앞으로도 계속 볼 녀석이지만, 벌써 익숙해 지시죠? new() 함수입니다.

var save = configFile.new()

그리고 필요한 위치에서 함수 호출 만으로 저장을 할 수 있게, saveGame() 함수도 만들어 줍시다.

이 함수를 버튼에 할당하면 “저장 버튼”이 되는 거고,
일정 시간마다 저장하게 만들면 오토세이브가 되고,
특정 물체에 할당하면 그게 세이브 포인트가 될 겁니다.


우리가 저장해야 하는 변수는 3종류입니다.

현재 가지고 있는 코인, 클릭 효율, 그리고 효율 업그레이드 가격입니다.
각각을  set_value(”분류”,”이름”,값) 의 방식으로 입력하시면 됩니다.


그리고 자습을 통해 변수를 추가하신 분들은 저장할 변수는 늘어나지만

같은 형태의 반복이니 쉽게 늘어난 변수에 대응하실 수 있을 겁니다.





save 라는 녀석에게 3개의 변수를 각각 설정해 줍시다. 임의로 “main”과 “변수명”으로 정했지만,
여기는 여러분의 마음껏 정하셔도 상관 없습니다.

save.set_value("main","coin", coin)
save.set_value("main","coinEff", coinEff)
save.set_value("main","effPrice", effPrice)

그리고 마지막으로, 이렇게 설정한 값을 저장하라고 명령 내려주면 됩니다.

save.save(”저장할 위치와 파일명”)

현재 게임이 있는 위치는

res://

이렇게 설정할 수 있습니다.

파일명은 .cfg라는 확장자를 사용했습니다만, 확장자 없이도 만들어지고, txt나 자신만의 확장자로도 만들 수 있습니다만,
일관성과 조회성을 높혀주기 위해서 .cfg 파일로 만들어주도록 합시다.

마지막으로 새로운 버튼을 하나 만들어서, 클릭시 saveGame() 함수를 실행 하도록 해 봅시다.
이건 이제 설명 필요 없겠죠? ㅎㅎㅎ

여기까지 했으면 일단 실행해서 조금 플레이 한 뒤, 앞에서 설정한 저장 버튼을 사용해 봅시다.




좌측 하단에 우리가 설정한 save.cfg 파일을 열어보면,
우리가 플레이 했던 값이 [분류], 이름=값의 형태로 잘 저장된 것을 볼 수 있습니다.



■ 로드를 구현해 봅시다.


일단 로딩을 하려먼 파일을 불러와야 합니다.
여기서 load는 이미 godot에서 사용하고 있는 함수가 있기에,
변수이름을 지을 때 'load'는 피해주세요! (오류를 반환할 것입니다.)


var loadstate = save.load(”저장된 파일”)


그리고 게임을 로드하는 것도 함수로 만들어 줍시다.


func loadGame():


이 함수를 버튼에 할당하면 로딩 버튼이 될 것이고,

우리는 게임이 시작하면 1번 강제로 수행하는 “_ready()” 함수에 할당해서,
게임을 시작하면 바로 로딩이 되게 구현할 것입니다.




이를 통해 데이터를 불러올  수 있습니다.
도움말에는 “세이브 파일이 없는 경우는 그냥 무시하라는 코딩 예시가 적혀 있는 걸 볼 수 있습니다.



도움말에 나온 것 처럼 처리하셔도 됩니다만,
저는 디폴트 값을 이용하는 방법을 이용하려 합니다.

저장할 때는 set_value (값 설정하기)을 이용했으니, 불러올 때는 get_value (값 가져오기) 를 이용합니다.




default: Variant = null

(기본 값 : 변수 = 없음)으로써, 만일 불러올 값이 없다면(또는 불러올 파일이 없다면) 여기의 디폴트 값을 사용하게 됩니다.
그리고 저장된 값이 있다면, 여기에 입력된 값을 무시하고, 저장된 값을 변수에 할당하는 기능입니다.

각 변수에, get_value를 통해 얻은 값을 할당해 주시면 됩니다.

coin = save.get_value("main","coin", 0)
coinEff = save.get_value("main","coinEff", 1)
effPrice = save.get_value("main","effPrice", 10)

그리고 이렇게 만든 loadGame():을 게임이 시작될 때 즉시 실행하도록 _ready(): 함수에 호출하도록 넣어 줍시다.



이제 게임을 시작하기만 해도, 지난 저장 값에서 즉시 불러와,
이어서 플레이 할 수 있는 것을 볼 수 있습니다.


■ 저장 버튼은 트렌드가 아니다! 종료할 때 저장하도록 해보자!

우선 저장 버튼은 자비없이 날려버립시다!
이 부분에 한해서는 godot 이상의 지식이 필요합니다.

윈도우에서 프로그램 종료 버튼 (우측 상단의 X 버튼과 같은)을 누른 경우,
윈도우에서는 창에게 “너는 프로그램을 종료해라!” 라는 명령을 내리게 됩니다.


이런 류의 신호는 “_notification(what)” 을 통해서 잡아낼 수 있습니다.


 이 _notification에 종료하라는 신호가 왔을 때, 위에서 만든 saveGame 함수를 호출하도록 할당만 하면 될 뿐입니다.




이제 함수의 형태가 조금씩은 보이실 겁니다.

_notification 의 what 이라는 변수에는 윈도우에서 보내는 다양한 신호를 캐치하고 있는데,

만약 그 신호가 == (같다) “NOTIFICATION_WM_CLOSE_REQUEST” 창을 종료하라는 요청이 온다면


saveGame() 함수를 호출하라는 명령을 내린 뒤,
get_tree().quit() 프로그램을 종료 하라고 순차적으로 명령하게 됩니다.




이제 게임을 종료할 때, 자동으로 저장되고
게임을 실행하면 이전에 플레이하던 정보가 즉시 로딩되는 것을 볼 수 있습니다.

여기서 사용하는 _notification에서 받을 수 있는 신호들은 도움말 > node > 상수에서 확인하실 수 있습니다만,
그냥 필요할 때만 찾아보시고, 미리 가서 공부하거나 하실 필요는 없습니다.




정말 다양한 알람 신호가 있지만, 필요할 때 찾아보는 식으로 지식을 늘려가시는 것을 추천 드립니다.

여기까지, 종료될 때 자동으로 저장을 하고
실행할 때 이전 데이터를 즉시 불러오는 클리커 게임이 완성되었습니다.
이걸로 정말 고도 엔진의 기초적인 이해 과정을 마쳤습니다.


다음편부터는 조금은 쉬어가는 느낌과 더불어, 지금까지 배운 기반 위에서
조금은 새롭고 조금은 정석적이고, 조금 많이 어려워진 새 프로젝트를 시작하려 합니다.

하지만 이번 휴일 기간 동안 고향집에 다녀와야 해서, 다음 시리즈 연재는 조금 쉬었다가 올라오게 되겠네요 ㅎㅎㅎㅎ
다들 즐거운 연휴 되세요!


《 고도 엔진 입문글 모음 - https://page.onstove.com/indie/global/view/10204130


#godot #고도엔진 #입문 #튜토리얼 #게임만들기


촉촉한감자칩

🫡🫡🫡 즐겜을 위해 하루하루 살아가고 있습니다.

미소녀 게임, 건설 경영 게임을 사랑합니다!


Reply 14
Notification has been disabled.

오 감사합니다 지금 세이브까지 배워서 계속 세이브중 로드배우면 바로 로또사러 가겠습니다...

로또 ㅋㅋㅋㅋㅋㅋㅋ


헙 웹 기획자이신데 개발을 이정도로...

대단하심.



감자칩님도 게임 개발하신 적 있거나 게임개발자신거죠? 혹은 프로그래머? 쨋든 멋지십니다!



업무는 웹 기획자입니다 ㅎㅎㅎ 프로그래밍은 정말 취미일 뿐입니다.

다만 언젠간 자신만의 게임을 만들고 싶어서, 취미치곤 열심히 공부하긴 했습니다 ㅎㅎㅎ


profile image

촉촉한감자칩



이게 기초?!


기초가 맞습니다 ㅠㅠ 내용이 엄청 장황해보이지만, 차근차근 따라오면 생각보다 별 내용은 없을 정도입니다.

다음부터 연재할 내용부터는 외부 내용까지 들여와서 적을거라, 숨이 턱턱 막힐텐데, 그럼에도 현재까지 배운 내용의 연장선일 겁니다..

profile image

촉촉한감자칩이래서 저처럼 헷갈리기 시작하면 스파게티 코드가 되는거겠군요.

쉽지 않네요.




Amateur Indie Creator's post

List
작성 시간 06.06.2024
image
+23

스토브 게임 순위 툰 14) 올드 월드의 저력, 비홀더 시리즈 발매 예정! [8]

06.06.2024
2024.06.06 14:18
작성 시간 06.05.2024
image
+5

[린, 퍼즐에 그려진 소녀 이야기] 플레이 후기 및 장,단점 [12]

06.05.2024
2024.06.05 14:57
작성 시간 06.05.2024
image
+10

[Godot] 저장과 불러오기 구현 [14]

06.05.2024
2024.06.05 10:41
작성 시간 06.05.2024
image
+21

'정령없는 정령사' 플레이 후기 [8]

06.05.2024
2024.06.05 06:18
작성 시간 06.04.2024
image
+11

돔돔 아재의 게임 겉핥기 - 21. 일진녀가 옆집에 이사왔다 [14]

06.04.2024
2024.06.04 15:50