Defold zawiera zintegrowany debugger Lua z narzędziem do inspekcji. Razem z wbudowanymi narzędziami profilowania stanowi potężne narzędzie, które może pomóc w znalezieniu przyczyny błędów w logice gry lub analizie problemów wydajnościowych.
Najprostszym sposobem debugowania w Defold jest korzystanie z debugowania za pomocą wydruków. Używaj funkcji print()
lub pprint()
do monitorowania zmiennych lub wskazywania przepływu wykonania. Jeśli obiekt gry bez skryptu działa dziwnie, możesz dołączyć do niego skrypt wyłącznie w celu debugowania. Korzystanie z dowolnej z funkcji drukowania spowoduje wydruk na panelu Console (konsola) w Edytorze oraz w logach gry.
Oprócz drukowania/wyświetlania, silnik może również rysować teksty debugowania i proste linie na ekranie. To jest realizowane poprzez przesyłanie wiadomości do gniazda (socket) @render
:
-- Draw value of "my_val" with debug text on the screen
msg.post("@render:", "draw_text", { text = "My value: " .. my_val, position = vmath.vector3(200, 200, 0) })
-- Draw colored text on the screen
local color_green = vmath.vector4(0, 1, 0, 1)
msg.post("@render:", "draw_debug_text", { text = "Custom color", position = vmath.vector3(200, 180, 0), color = color_green })
-- Draw debug line between player and enemy on the screen
local start_p = go.get_position("player")
local end_p = go.get_position("enemy")
local color_red = vmath.vector4(1, 0, 0, 1)
msg.post("@render:", "draw_line", { start_point = start_p, end_point = end_p, color = color_red })
Wizualne komunikaty debugowania dodają dane do potoku (pipeline) renderowania i są rysowane jako część standardowego potoku renderowania, czyli wyświetlane.
"draw_line"
dodaje dane, które są renderowane za pomocą funkcji render.draw_debug3d()
w skrypcie renderowania (render script)."draw_text"
jest renderowany z użyciem "/builtins/fonts/system_font.font"
, który wykorzystuje materiał "/builtins/fonts/system_font.material"
."draw_debug_text"
jest to to samo co "draw_text"
, ale jest renderowany w kolorze niestandardowym.
Zauważ, że prawdopodobnie chcesz aktualizować te dane co klatkę, więc przesyłanie wiadomości do skryptu renderowania w funkcji update()
jest dobrym pomysłem.Aby uruchomić wbudowany debugger wraz z grą klkinij menu Debug ▸ Run with Debugger lub wybierz Debug ▸ Attach Debugger, aby dołączyć debugger do aktualnie uruchomionej gry.
Gdy debugger jest podłączony, masz kontrolę nad wykonaniem gry za pomocą przycisków sterowania debugerem w konsoli lub za pomocą menu Debug:
end
poniżej linii z wywołaniem funkcji nextspawn()
:
Jedna linia kodu Lua nie odpowiada jednemu wyrażeniu. Krok w debuggerze przesuwa się o jedno wyrażenie naraz, co oznacza, że obecnie możesz musieć nacisnąć przycisk kroku więcej niż raz, aby przejść do następnej linii.
nextspawn()
:
Aby ustawić lub usunąć punkt przerwania, kliknij w kolumnie tuż po prawej stronie numerów wierszy w edytorze kodu. Możesz także wybrać opcję Edit ▸ Toggle Breakpoint z menu.
Aby edytować warunek punktu przerwania, kliknij prawym przyciskiem myszy w kolumnie tuż po prawej stronie numerów wierszy w edytorze kodu lub wybierz opcję Edit ▸ Edit Breakpoint z menu.
Obecnie nie można modyfikować zmiennych za pomocą ewaluatora.
Lua zawiera bibliotekę debugowania przydatną w niektórych sytuacjach, szczególnie jeśli potrzebujesz zbadać wewnętrzne aspekty swojego środowiska Lua. Więcej informacji na ten temat znajdziesz tutaj.
Jeśli napotkasz błąd lub gra nie działa zgodnie z oczekiwaniami, oto lista kontrolna debugowania:
Sprawdź wyświetlenia w konsoli (Console) i zweryfikuj, czy nie ma błędów czasu wykonania.
Dodaj instrukcje print
do swojego kodu, aby sprawdzić, czy kod faktycznie się wykonuje.
Jeśli kod nie jest wykonywany, sprawdź, czy w edytorze została dokonana właściwa konfiguracja niezbędna do uruchomienia kodu. Czy skrypt został dodany do odpowiedniego obiektu gry? Czy skrypt uzyskał focus wejścia (acquired input focus), jeśli chcesz obsługiwać wejścia sterowania? Czy wejścia są zdefiniowane poprawnie? Czy kod shadera został dodany do materiału? I tak dalej.
Jeśli twój kod zależy od wartości zmiennych (na przykład w instrukcji warunkowej), użyj instrukcji print
w miejscach, gdzie są używane lub sprawdzane, lub zbadaj je za pomocą debuggera.
Czasem znalezienie błędu może być trudnym i czasochłonnym procesem, który wymaga przeglądania kodu kawałek po kawałku, sprawdzania wszystkiego i zawężania błędnego kodu oraz eliminowania źródeł błędów. Najlepiej jest to robić za pomocą metody “dziel i rządź”:
Udanego polowania!
Jeśli masz problemy z fizyką i kolizje nie działają zgodnie z oczekiwaniami, zaleca się włączenie debugowania fizyki. Zaznacz pole wyboru “Debug” w sekcji “Physics” pliku "game.project"
:
Gdy to pole jest zaznaczone, Defold będzie rysował wszystkie kształty kolizji i punkty kontaktu kolizji:
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB