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 では、リソース(resource)のホットリロード(hot reload)ができます。この機能は、ゲーム開発時の特定の作業を大幅に高速化するのに役立ちます。ゲームを実行したまま、そのコードやコンテンツを変更できます。主な用途は次のとおりです。
エディターからゲームを起動します(Project ▸ Build)。
その後、更新したリソースをリロードするには、メニュー項目の File ▸ Hot Reload を選択するか、対応するキーボードショートカットを押します。

ホットリロードは、デスクトップだけでなくデバイス上でも動作します。デバイス上で使用するには、モバイルデバイスでゲームのデバッグビルドまたは開発用アプリを実行し、エディターでそのデバイスをターゲットとして選択します。

ここでビルドして実行すると、エディターはデバイス上で動作しているアプリにすべてのアセットをアップロードし、ゲームを起動します。それ以降、ホットリロードしたファイルはすべてデバイス上で更新されます。
たとえば、スマートフォンで実行中のゲームに表示されている GUI にボタンを2つ追加するには、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) -- hot reload "my_module.lua" and the new value will print
end
Lua モジュール(Lua module)でよく使われるパターンは、ローカルテーブルを作成し、値を設定してから返す方法です。
--- my_module.lua
local M = {} -- a new table object is created here
M.val = 10
return M
-- user.script
local mm = require "my_module"
function update(self, dt)
print(mm.val) -- will print 10 even if you change and hot reload "my_module.lua"
end
my_module.lua を変更してリロードしても、user.script の動作は 変わりません。その理由と、この落とし穴を避ける方法については、モジュールのマニュアルを参照してください。
すべてのスクリプトコンポーネント(script component)で on_reload() 関数を定義できます。この関数が存在する場合、スクリプトがリロードされるたびに呼び出されます。これは、データの確認や変更、メッセージの送信などに役立ちます。
function on_reload(self)
print(self.velocity)
msg.post("/level#controller", "setup")
end
頂点シェーダーとフラグメントシェーダーをリロードすると、GLSL コードがグラフィックスドライバーによって再コンパイルされ、GPU にアップロードされます。GLSL は非常に低水準で記述されるため、シェーダーコードによるクラッシュは起こりやすく、その場合はエンジンも停止します。