This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
파일을 생성하거나 액세스하는 방법은 다양합니다. 파일 경로와 파일에 액세스하는 방식은 파일의 종류와 파일 위치에 따라 달라집니다.
Defold는 파일을 다루기 위한 여러 함수를 제공합니다:
io.* 함수를 사용해 파일을 읽고 쓸 수 있습니다. 이 함수들은 전체 I/O 과정에 대해 매우 세밀한 제어를 제공합니다.-- myfile.txt를 바이너리 모드로 쓰기 위해 엽니다
-- 실패하면 nil과 오류 메세지를 반환합니다
local f, err = io.open("path/to/myfile.txt", "wb")
if not f then
print("Something went wrong while opening the file", err)
return
end
-- 파일에 쓰고, 디스크로 flush한 다음 파일을 닫습니다
f:write("Foobar")
f:flush()
f:close()
-- myfile.txt를 바이너리 모드로 읽기 위해 엽니다
-- 실패하면 nil과 오류 메세지를 반환합니다
local f, err = io.open("path/to/myfile.txt", "rb")
if not f then
print("Something went wrong while opening the file", err)
return
end
-- 전체 파일을 문자열로 읽습니다
-- 실패하면 nil을 반환합니다
local s = f:read("*a")
if not s then
print("Error while reading file")
return
end
print(s) -- Foobar
os.rename()과 os.remove()를 사용해 파일 이름을 변경하고 파일을 삭제할 수 있습니다.
sys.save()와 sys.load()를 사용해 Lua 테이블을 읽고 쓸 수 있습니다. 플랫폼과 무관한 파일 경로 해석을 돕기 위한 추가 sys.* 함수들도 있습니다.
-- 어플리케이션 "mygame"의 파일 "highscore"에 대한 플랫폼 독립적인 경로를 얻습니다
local path = sys.get_save_file("mygame", "highscore")
-- 데이터가 담긴 Lua 테이블을 저장합니다
local ok = sys.save(path, { highscore = 100 })
if not ok then
print("Failed to save", path)
return
end
-- 데이터를 로드합니다
local data = sys.load(path)
print(data.highscore) -- 100
파일 및 폴더 위치는 세 가지 범주로 나눌 수 있습니다:
하이스코어, 사용자 설정, 게임 상태 같은 어플리케이션별 파일을 저장하고 로드할 때는 운영체제가 이 목적을 위해 제공하는 위치를 사용하는 것이 좋습니다. sys.get_save_file()을 사용하면 파일에 대한 OS별 절대 경로를 얻을 수 있습니다. 절대 경로를 얻은 뒤에는 sys.*, io.*, os.* 함수를 사용할 수 있습니다(위 내용 참고).
sys.save()와 sys.load() 사용 방법을 보여주는 예제를 확인하세요.
번들 리소스와 커스텀 리소스를 사용해 파일을 어플리케이션에 포함할 수 있습니다.
커스텀 리소스는 game.project의 Custom Resources 필드를 사용해 메인 게임 아카이브에 번들됩니다.
Custom Resources 필드에는 메인 게임 아카이브에 포함할 리소스의 쉼표로 구분된 목록을 넣어야 합니다. 디렉토리를 지정하면 해당 디렉토리 안의 모든 파일과 디렉토리가 재귀적으로 포함됩니다. 파일은 sys.load_resource()를 사용해 읽을 수 있습니다.
-- 레벨 데이터를 문자열로 로드합니다
local data, error = sys.load_resource("/assets/level_data.json")
-- JSON 문자열을 Lua 테이블로 디코드합니다
if data then
local data_table = json.decode(data)
pprint(data_table)
else
print(error)
end
번들 리소스는 game.project의 Bundle Resources 필드를 사용해 어플리케이션 번들의 일부로 배치되는 추가 파일과 폴더입니다.
Bundle Resources 필드에는 번들링할 때 결과 패키지에 그대로 복사해야 하는 리소스 파일과 폴더가 들어 있는 디렉토리의 쉼표로 구분된 목록을 입력해야 합니다. 디렉토리는 프로젝트 루트 기준의 절대 경로로 지정해야 하며, 예를 들면 /res입니다. 리소스 디렉토리에는 platform 또는 architecture-platform 이름의 서브폴더가 있어야 합니다.
지원되는 플랫폼은 ios, android, osx, win32, linux, web, switch입니다. 모든 플랫폼에 공통으로 쓰이는 리소스 파일을 담는 common이라는 이름의 서브폴더도 허용됩니다. 예:
res
├── win32
│ └── mywin32file.txt
├── common
│ └── mycommonfile.txt
└── android
├── myandroidfile.txt
└── res
└── xml
└── filepaths.xml
어플리케이션이 저장된 위치의 경로를 얻으려면 sys.get_application_path()를 사용할 수 있습니다. 이 어플리케이션 기본 경로를 사용해 액세스해야 하는 파일의 최종 절대 경로를 만드세요. 이 파일들의 절대 경로를 얻은 뒤에는 io.*와 os.* 함수를 사용해 파일에 액세스할 수 있습니다.
local path = sys.get_application_path()
local f = io.open(path .. "/mycommonfile.txt", "rb")
local txt, err = f:read("*a")
if not txt then
print(err)
return
end
print(txt)
보안상의 이유로 브라우저(그리고 확장하면 브라우저에서 실행되는 모든 JavaScript)는 시스템 파일에 액세스할 수 없습니다. Defold의 HTML5 빌드에서도 파일 작업은 동작하지만, 브라우저의 IndexedDB API를 사용하는 “가상 파일 시스템”에서만 동작합니다. 따라서 io.* 또는 os.* 함수로 번들 리소스에 액세스할 방법은 없습니다. 하지만 http.request()를 사용하면 번들 리소스에 액세스할 수 있습니다.
| 특성 | 커스텀 리소스 | 번들 리소스 |
|---|---|---|
| 로딩 속도 | 더 빠름 - 바이너리 아카이브에서 파일 로드 | 더 느림 - 파일 시스템에서 파일 로드 |
| 파일 일부 로드 | 아니요 - 전체 파일만 가능 | 예 - 파일에서 임의 바이트 읽기 |
| 번들링 후 파일 수정 | 아니요 - 파일이 바이너리 아카이브 안에 저장됨 | 예 - 파일이 로컬 파일 시스템에 저장됨 |
| HTML5 지원 | 예 | 예 - 하지만 파일 I/O가 아닌 http를 통해 액세스 |
시스템 파일 액세스는 보안상의 이유로 운영체제에 의해 제한될 수 있습니다. extension-directories 네이티브 익스텐션을 사용하면 일반적인 일부 시스템 디렉토리(예: documents, resource, temp)의 절대 경로를 얻을 수 있습니다. 이 파일들의 절대 경로를 얻은 뒤에는 io.*와 os.* 함수를 사용해 파일에 액세스할 수 있습니다(위 내용 참고).
보안상의 이유로 브라우저(그리고 확장하면 브라우저에서 실행되는 모든 JavaScript)는 시스템 파일에 액세스할 수 없습니다. Defold의 HTML5 빌드에서도 파일 작업은 동작하지만, 브라우저의 IndexedDB API를 사용하는 “가상 파일 시스템”에서만 동작합니다. 즉, HTML5 빌드에서는 시스템 파일에 액세스할 방법이 없습니다.
Asset Portal에는 파일 및 폴더 액세스를 단순화하는 여러 에셋이 있습니다. 예: