강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

김광호님의 프로필 이미지
김광호

작성한 질문수

고도 엔진(Godot Engine)을 통한 게임 개발 박치기!! - 기본 개념부터 실전 게임 제작까지 한방에!

21. Dictionary 활용 저장&로드

작성

·

33

·

수정됨

0

21. Dictionary 활용 저장&로드

섹션에서 게임 저장 로드 사용시 Dictionary 만 사용 하여 게임저장 및 로드 구현 가능 한지?

다른 자료구조형식( Array, Enum) 를 사용하여 게임 저장 로드를 구현 할수 있는지 궁금합니다..^^

답변 부탁드립니다..

 

추가 질문 😀

Array, Enum, Dictionary 를 단독 으로 사용시 언제 사용해야는지 궁금합니다..^^

답변 2

0

코드박치기님의 프로필 이미지
코드박치기
지식공유자

안녕하세요.

해당 강의 21.은 딕셔너리만 사용해서 저장/로드를 구현한 것입니다. ^^;

 

저장에 쓰인 store_var() 함수의 도움말 검색을 눌러보시면

딕셔너리를 포함한 모든 Variant를 저장할수 있는데

Variant는 딕셔너리, 어레이를 포함한 모든 데이터 타입을 뜻한다고 나와있습니다.

즉 save_data: Array 형태도 작성하여 얼마든지 저장 가능합니다.

enum도 내부적으로는 정수값(int)이므로 당연히 저장 가능합니다.

 

딕셔너리로 소개해드린 이유는

딕셔너리 저장이 godot 이외의 게임 개발에서도

널리 쓰이고 권장되는 방식이기 때문입니다. ("Json" 개념 참조)

 

추가 질문은 제가 잘 이해를 못한것 같습니다만,

섹션5. 슈터 게임 섹션에서 Array, Enum, Dictionary 모두 여기저기 활용을 합니다.

 

감사합니다!

김광호님의 프로필 이미지
김광호
질문자

답변 감사합니다..^^

코딩시 여러 가지 데이타 를 저장할때

Array, Enum, Dictionary 를 사용하는데, 이런 경우 Array 를 사용하는게 더 낫거나,

권장하는 경우를 예를 들어 설명해주시면 감사하겠습니다..^^

코드박치기님의 프로필 이미지
코드박치기
지식공유자

관습적으로 볼 때, 다음 특징을 참고하면 좋을 것 같습니다.

enum은 "고정"된 상태나 분류, 특성을 표현할 때 유용합니다.

enum State { IDLE, WALKING, RUNNING, JUMPING } (마리오 움직임)

enum DamageType { PHYSICAL, FIRE, ICE, LIGHTNING } (rpg 공격속성)

enum ItemRarity { COMMON, RARE, EPIC, LEGENDARY } (아이템 등급)

array는 "순서"가 중요한 데이터를 다룰 때, "숫자"를 다룰 때, "반복" 처리 (for문)을 다룰 때 유용합니다. 대표적으로 rpg 게임의 격자형 인벤토리 관리는 array가 적합합니다. 아이템 창을 관리하고, index를 통해 접근하고, 획득/삭제하는데 용이하기 때문입니다.

다른 쉬운 예로 여러 적들을 모아서 관리하는 것도 array가 편리해 보입니다.

var enemies: Array = [enemy1, enemy2, enemy3, enemy4, enemy5]

enemies.pop_front() (웨이브 시스템)

enemies.shuffle() (랜덤 적 선택)

enemies.has(boss_enemy) (특정 값이 있는지 확인)

for enemy in enemies: (모든 적 선택)

 

dictionary는 복잡한 데이터 관리에 적합합니다. (nested dictionary 덕분)

rpg게임의 아이템을 아무거나 한번 떠올려 보시면

관리할 데이터가 생각보다 많다는 걸 알 수 있습니다.

그러한 데이터들을 dictionary로 커버하기 적합합니다.

var item_database = {

"iron_sword": {

"name": "철검",

"type": ItemType.WEAPON,

"rarity": ItemRarity.COMMON,

"stats": {

"damage_type": DamageType.PHYSICAL,

"damage": 20,

"attack_speed": 1.0

},

"price": {

"buy": 100,

"sell": 50

},

},

"armor_leather": {

"name": "가죽 갑옷",

"type": ItemType.ARMOR,

"rarity": ItemRarity.COMMON,

"stats": {

"defense": 15,

"hp": 50

},

"price": {

"buy": 80,

"sell": 40

},

},

}

딕셔너리는 무한 중첩(nested)이 되어서 아래와 같이 깊은 접근이 가능한게 장점입니다.

item_database["iron_sword"]["stats"]["attack_speed"]

또한 강의에서 언급했듯이 Dictionary를 이용하여 이러한 복잡한 데이터베이스를 쉽게 저장/로드할 수 있습니다.

 

볼드체 색칠한 특징에 주목해서 숙지해 두면 도움이 될 것 같습니다.

감사합니다!

코드박치기님의 프로필 이미지
코드박치기
지식공유자

여기 사이트 답글 쓸때 들여쓰기가 안먹히네요.

item_database 읽기가 조금 불편하실텐데 양해 부탁드립니다.

김광호님의 프로필 이미지
김광호
질문자

답변 감사합니다..^^

0

안녕하세요, 인프런 AI 인턴입니다. 김광호님.

Godot 엔진에서 게임 데이터를 저장하고 로드하는 작업은 다양한 방식으로 구현할 수 있습니다. Dictionary 데이터 구조는 직렬화가 비교적 간편하고 직관적인 이유로 자주 사용되지만, 다른 방법들도 존재합니다.

  1. Custom Resource 활용: 고도 엔진에서는 Custom Resource를 활용해 데이터를 저장할 수 있습니다. 이는 유니티의 Scriptable Object와 비슷한 개념으로, 에디터에서 데이터를 편집하고 여러 장면 간에서 공유할 수 있는 방식입니다.

  2. JSON 직렬화: 데이터를 JSON 형식으로 직렬화하여 파일로 저장하는 방법도 흔히 사용됩니다. JSON은 텍스트 기반의 데이터 구조로, 인간에게 읽기 쉽고 다양한 언어에서 다루기 용이합니다.

  3. Binary 데이터 형식: 이진 데이터 포맷으로 저장하면, 저장된 데이터를 읽고 쓰는 속도가 빨라집니다. 게임의 성능 최적화에 도움이 될 수 있지만, 데이터의 가독성이 떨어질 수 있습니다.

각 방법은 목적과 프로젝트의 요구 사항에 따라 선택될 수 있으며, 데이터를 어떻게 구조화하고 사용하는지가 주요 고려 사항입니다. 추가적으로 Custom Resource를 사용한 저장 및 로드에 대한 업데이 역시 예정되어 있어 관심을 가질 만합니다.

관련하여 유사한 주제의 질문이 다음 URL에 있어 참고하시기 바랍니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김광호님의 프로필 이미지
김광호

작성한 질문수

질문하기