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에서는 리소스를 핫 리로드할 수 있습니다. 게임을 개발할 때 이 기능은 특정 작업 속도를 크게 높여 줍니다. 실행 중인 게임의 코드와 컨텐츠를 변경할 수 있습니다. 일반적인 사용 사례는 다음과 같습니다:
에디터에서 게임을 시작합니다(Project ▸ Build).
업데이트된 리소스를 다시 로드하려면 메뉴 항목 File ▸ Hot Reload를 선택하거나 키보드의 해당 단축키를 누르면 됩니다:

핫 리로드는 데스크톱뿐 아니라 기기에서도 동작합니다. 기기에서 사용하려면 모바일 기기에서 게임의 디버그 빌드나 개발용 앱을 실행한 다음, 에디터에서 해당 기기를 타겟으로 선택합니다:

이제 빌드하고 실행하면 에디터가 모든 에셋을 기기에서 실행 중인 앱으로 업로드하고 게임을 시작합니다. 이후부터 핫 리로드하는 모든 파일은 기기에서도 업데이트됩니다.
예를 들어 휴대폰에서 실행 중인 게임에 표시되고 있는 GUI에 버튼 몇 개를 추가하려면, GUI 파일을 열면 됩니다:

새 버튼을 추가하고 저장한 뒤 GUI 파일을 핫 리로드합니다. 이제 휴대폰 화면에서 새 버튼을 볼 수 있습니다:

파일을 핫 리로드하면 엔진은 다시 로드된 각 리소스 파일을 콘솔에 출력합니다.
핫 리로드된 Lua 스크립트 파일은 실행 중인 Lua 환경에서 다시 실행됩니다.
local my_value = 10
function update(self, dt)
print(my_value)
end
my_value를 11로 변경하고 파일을 핫 리로드하면 즉시 효과가 반영됩니다:
...
DEBUG:SCRIPT: 10
DEBUG:SCRIPT: 10
DEBUG:SCRIPT: 10
INFO:RESOURCE: /main/hunter.scriptc was successfully reloaded.
DEBUG:SCRIPT: 11
DEBUG:SCRIPT: 11
DEBUG:SCRIPT: 11
...
핫 리로드는 라이프사이클 함수의 실행을 변경하지 않습니다. 예를 들어 핫 리로드 시 init()은 호출되지 않습니다. 하지만 라이프사이클 함수를 재정의하면 새 버전이 사용됩니다.
모듈 파일에서 전역 범위에 변수를 추가하는 한, 파일을 다시 로드하면 이러한 전역 변수가 변경됩니다:
--- my_module.lua
my_module = {}
my_module.val = 10
-- user.script
require "my_module"
function update(self, dt)
print(my_module.val) -- "my_module.lua"를 핫 리로드하면 새 값이 출력됩니다
end
일반적인 Lua 모듈 패턴은 로컬 테이블을 만들고 값을 채운 다음 반환하는 방식입니다:
--- my_module.lua
local M = {} -- 여기서 새 테이블 오브젝트가 생성됩니다
M.val = 10
return M
-- user.script
local mm = require "my_module"
function update(self, dt)
print(mm.val) -- "my_module.lua"를 변경하고 핫 리로드해도 10이 출력됩니다
end
“my_module.lua”를 변경하고 다시 로드해도 “user.script”의 동작은 변경되지 않습니다. 왜 그런지와 이 함정을 피하는 방법은 모듈 매뉴얼을 참고하세요.
on_reload() 함수
모든 스크립트 컴포넌트는 on_reload() 함수를 정의할 수 있습니다. 이 함수가 있으면 스크립트가 리로드될 때마다 호출됩니다. 데이터 검사나 변경, 메세지 보내기 등에 유용합니다:
function on_reload(self)
print(self.velocity)
msg.post("/level#controller", "setup")
end
버텍스 쉐이더와 프래그먼트 쉐이더를 리로드하면 GLSL 코드는 그래픽 드라이버에 의해 다시 컴파일되고 GPU에 업로드됩니다. GLSL은 매우 낮은 수준에서 작성되므로 쉐이더 코드가 크래시를 일으키기 쉽고, 그렇게 되면 엔진도 함께 종료됩니다.