파일 시스템(File system)

소개

파일 시스템은 하지만 엔진 개발에 있어 또 다른 주요 주제입니다. 파일 시스템은 어떻게 에셋이 저장되고 액세스 되는 지를 관리합니다. 잘 설계된 파일 시스템은 여러 개발자들에게도 또한 서로 협력하면서 같은 소스 파일과 에셋을 편집할 수 있게 합니다.

Godot 엔진의 초기 버전에는 (그리고 아직 Godot라는 이름이 붙기 전) 데이터베이스를 사용했습니다. 에셋은 그곳에 있었고 ID가 지정되었습니다. 다른 접근도 시도해보았습니다, 지역 데이터베이스나, 메타데이터가 있는 파일 등등을 말이죠. 결국 간단한 접근법을 얻게 되었고 지금 Godot는 모든 에셋을 파일 시스템에 저장합니다.

구현

파일 시스템은 리소스를 디스크에 저장합니다. 스크립트에서 씬이나 PNG 이미지까지 어떤 것이든, 엔진에게는 리소스 입니다. 리소스가 디스크 내 다른 리소스의 참조를 속성으로 갖고 있다면, 그 리소스로 가는 경로 또한 포함됩니다. 리소스가 내장 하위 리소스를 갖는다면, 그 리소스는 모든 묶인 하위 리소스들과 함께 단일 파일로 저장됩니다. 예를 들어, 폰트 리소스는 종종 폰트 텍스쳐와 묶여집니다.

일반적으로 Godot 파일 시스템은 메타데이터 파일 사용을 피합니다. 그 이유는 간단합니다, 기존 에셋 관리자와 버전 관리 시스템(VCS)은 우리가 구현할 수 있는 것보다 훨씬 더 뛰어나기 때문에, Godot는 SVN, Git, Mercurial, Perforce 등과 함께 최선을 다합니다.

파일 시스템 내용물 예시:

/project.godot
/enemy/enemy.tscn
/enemy/enemy.gd
/enemy/enemysprite.png
/player/player.gd

project.godot

project.godot 파일은 프로젝트 설명 파일이고, 항상 프로젝트의 루트에서 찾으실 수 있습니다. 사실 파일 위치가 루트의 위치를 정의합니다. 이 파일은 프로젝트를 열 때 Godot가 제일 먼저 찾는 파일입니다.

이 파일은 프로젝트 설정을 win.ini 형식을 사용해, 일반 텍스트로 갖습니다. 심지어 비어있는 project.godot도 비어있는 프로젝트의 기본 정의 기능을 할 수 있습니다.

경로 구분 기호

Godot는 오직 / 만을 경로 구분 기호로 지원합니다. 그 이유는 이식 능력 입니다. 모든 운영 시스템이, 심지어 윈도우까지, 이를 지원하기 때문에, c:\project\project.godot 같은 경로는 c:/project/project.godot 와 같은 타입이 되어야 합니다.

리소스 경로(Resource path)

리소스를 액세스 할 때, 호스트 OS 파일 시스템 레이아웃을 사용하는 것은 성가시고 휴대성이 떨어질 수 있습니다. 이 문제를 해결하기 위해, res:// 라는 특수 경로가 만들어졌습니다.

res:// 경로는 항상 프로젝트 루트를 향할 것입니다 (거기에는 project.godot이 있고, 그래서 사실 res://project.godot 경로가 항상 있습니다).

파일 시스템은 에디터에서 프로젝트를 로컬로 실행 중일 때만 읽고 씁니다. 내보내질 때나 아니면 다른 기기에서 실행 중일 때 (휴대전화나 콘솔, 혹은 DVD로 실행), 파일 시스템은 읽기만 하고 더 이상 쓰기가 용납되지 않습니다.

사용자 경로(User path)

디스크에 쓰기는 게임 상태를 저장하거나 콘텐츠 팩을 다운로드하는 등의 다양한 작업에 종종 필요합니다. 이를 위해, 엔진은 user:// 라는 항상 쓸 수 있는 경로를 보장합니다.

호스트 파일 시스템(Host file system)

또는 호스트 파일 시스템 경로도 사용될 수 있습니다, 하지만 이것이 모든 플랫폼에서 작동된다는 보장은 없으니 출시된 제품에 이 경로를 쓰는 것을 추천하지는 않습니다. 하지만, 호스트 파일 시스템 경로를 사용하면 Godot에서 개발 도구를 쓸 때 유용할 수 있습니다!

단점

이 간단한 파일 시스템 설계에는 몇 가지 단점이 있습니다. 첫 번째 문제는 에셋의 이동으로 (프로젝트 내에서 이름을 바꾸거나 한 경로를 다른 곳으로 옮기는 등) 이 에셋에 관해 존재하는 참조를 깨버릴 것입니다. 이 참조는 새 에셋 위치를 향하도록 다시 정의해야만 합니다.

이를 피하기 위해, Godot에서, 파일 시스템 독 내에서, 위치를 바꾸거나 이름을 바꾸거나 삭제하는 등의 모든 작업을 해야만 합니다. Godot 밖에서 에셋을 움직이지 마세요, 그렇지 않으면 종속 여부를 수동으로 설정해야만 합니다 (Godot는 이를 감지하고 당신이 고치는 것을 어쨌든 도울 것이지만, 왜 어려운 길로 가시나요?).

두 번째로 윈도우와 macOS에서는 파일과 경로 이름을 대소문자를 구별하지 않는 것입니다. 대소문자를 구분하지 않는 호스트 파일 시스템이 에셋을 "myfile.PNG"라고 저장하지만, "myfile.png" 로 참조됩니다, 그 플랫폼 내에서는 작동이 잘 될 것입니다, 하지만 리눅스, 안드로이드 등의 플랫폼에서는 작동하지 않습니다. 이는 압축된 패키지로 모든 파일을 저장하는 내보낸 바이너리에도 적용될 수 있습니다.

Godot로 작업할 때 팀이 명명 규칙을 분명하게 정의하는 것을 추천합니다! 간단히 바보 같은 규칙이라면 파일과 경로 이름을 소문자로만 허락하는 것입니다.