Skriptaus

Johdanto

Ennen Godotin versiota 3.0 ainoa vaihtoehto pelin skriptaukseen oli käyttää GDScript kieltä. Nykyään Godotissa on neljä (kyllä, neljä!) virallista kieltä sekä mahdollisuus lisätä ylimääräisiä skriptikieliä dynaamisesti!

Tämä on erinomaista, pääasiassa sen tarjoaman suuren joustavuuden vuoksi, mutta se tekee myös työstämme kielien tukemiseksi vaikeampaa.

Godotin "pääkielet" ovat kuitenkin GDScript ja VisualScript. Tärkein syy valita ne on niiden integroitumisaste Godotiin, sillä se tekee kokemuksesta sutjakkaamman; molemmilla on näppärä integraatio editoriin, kun taas C# ja C++ tarvitsevat erillisen kehitysympäristön editointia varten. Jos olet suuri staattisesti tyypitettyjen kielten kannattaja, valitse sen sijaan silloin C# ja C++.

GDScript

GDScript on, kuten yllä mainittu, Godotin pääkieli. Sen käytöllä on joitakin myönteisiä näkökohtia muihin kieliin nähden johtuen sen korkeasta integraatiosta Godotiin:

  • Se on yksinkertainen, elegantti ja suunniteltu olemaan tuttu sellaisten kielten, kuten Lua, Python, Squirrel, jne. käyttäjille.
  • Latautuu ja kääntyy huikean nopeasti.
  • Solmujen, signaalien ja monien muiden skeneen liittyvien juttujen kooditäydennyksen sisältävän editori-integraation kanssa on miellyttävä työskennellä.
  • Sisältää sisäänrakennetut vektorityypit (kuten Vector-luokat, transformaatiot, jne.), tehden kovasta lineaarialgebran käytöstä tehokasta.
  • Tukee useita säikeitä yhtä tehokkaasti kuin staattisesti tyypitetyt kielet - yksi niistä rajoituksista, jotka saivat meidät välttämään sellaisia virtuaalikoneita kuten Lua, Squirrel, jne.
  • Ei käytä roskienkeruuta, joten pieni määrä automaatiota (useimpien objektien viittauksista pidetään joka tapauksessa kirjaa) on korvattu determinismillä.
  • Jos parempaa suorituskykyä tarvitaan, sen dynaaminen luonne tekee koodiosioiden korvaamisesta C++:lla helppoa (GDNativen kautta), ilman että koko pelimoottori täytyy kääntää uudelleen.

Jos olet epävarma ja sinulla on kokemusta ohjelmoinnista, eritoten dynaamisesti tyypitetyistä kielistä, valitse GDScript!

VisualScript

Alkaen versiosta 3.0, Godot tarjoaa Visuaalisen skriptauksen. Tämä on tyypillinen toteutus "lohkot ja yhteydet" kielestä, mutta mukautettu Godotin toimintatapoihin.

Visuaalinen skriptaus on mainio työkalu ei-ohjelmoijille ja jopa kokeneemmille kehittäjille, jotka haluavat tehdä osasta koodia helpommin lähestyttävää muille, kuten pelisuunnittelijoille ja artisteille.

Ohjelmoijat voivat myös käyttää sitä tilakoneiden tai mukautettujen visuaalisten solmutyönkulkujen, kuten dialogijärjestelmien, rakentamiseen.

.NET / C#

Koska Microsoftin C# on suosikki pelikehittäjien keskuudessa, olemme lisänneet sille virallisen tuen. C# on kehittynyt kieli, jolle on kirjoitettu läjäpäin koodia, ja tuki lisättiin kiitos Microsoftin runsaan lahjoituksen.

Se on erinomainen kompromissi suorituskykyä ja helppokäyttöisyyttä, vaikkakin sen roskienkerääjästä on syytä olla tietoinen.

Koska Godot käyttää Mono .NET ajoympäristöä, teoriassa mitä tahansa kolmannen osapuolen .NET kirjastoa tai kehysympäristöä voidaan käyttää Godotin skriptaamiseen, kuten myös mitä tahansa Common Language Infrastructure yhteensopivaa ohjelmointikieltä, kuten F#, Boo tai ClojureCLR. Käytännössä C# on kuitenkin ainoa virallisesti tuettu .NET vaihtoehto.

GDNative / C++

Viimein, yksi loistavimmista lisäyksistämme 3.0 julkaisuun: GDNative mahdollistaa C++ skriptauksen ilman että Godotia tarvitsee kääntää uudelleen (tai edes käynnistää uudelleen).

Mitä tahansa C++ versiota voidaan käyttää, ja eri kääntäjien ja versioiden sekoittaminen jaettujen kirjastojen luomiseksi toimii täydellisesti käyttämämme sisäisen C API sillan ansiosta.

This language is the best choice for performance and does not need to be used throughout an entire game, as other parts can be written in GDScript or Visual Script. However, the API is clear and easy to use as it resembles, mostly, Godot's actual C++ API.

Useampia kieliä voidaan tehdä saataville GDNative-rajapinnan kautta, mutta pidä mielessä, että niille ei ole virallista tukea.

Skenen skriptaus

Oppaan jäljellä olevassa osassa rakennamme GUI-skenen, joka koostuu painikkeesta ja selitteestä, ja jossa painikkeen painaminen päivittää selitettä. Tämä havainnollistaa:

  • Skriptin kirjoittamista ja sen liittämistä solmuun.
  • Käyttöliittymäelementtien kytkemisen signaaleilla.
  • Muita skenen solmuja käsittelevän skriptin kirjoittamista.

Ennen jatkamista, varmista, että olet lukenut GDScript lähdeaineiston. Se on yksinkertaiseksi suunniteltu kieli ja lähdeaineisto on lyhyt, joten käsitteistä saa yleiskuvan muutamassa minuutissa.

Skenen järjestely

Use the "Add Child Node" dialogue accessed from the Scene tab (or by pressing Ctrl + A) to create a hierarchy with the following nodes:

  • Panel
    • Label
    • Button

Skenepuun pitäisi näyttää tältä:

../../_images/scripting_scene_tree.png

Käytä 2D-editoria asemoidaksesi ja muuttaaksesi Button ja Label solmujen koot niin, että ne näyttävät samalta kuin alla olevassa kuvassa. Voit asettaa tekstin Tarkastelu-välilehdellä.

../../_images/label_button_example.png

Lopuksi tallenna skene nimellä kuten esimerkiksi sayhello.tscn.

Skriptin lisäys

Napsauta oikealla Panel solmusta ja valitse "Liitä skripti" pikavalikosta:

../../_images/add_script.png

Skriptinluonti-ikkuna aukeaa. Tässä ikkunassa voit asettaa skriptin kielien, luokan nimen ja muita oleellisia asetuksia.

GDScriptissä tiedosto itse edustaa luokkaa, joten luokan nimikenttä ei ole muokattavissa.

Solmu, johon olemme liittämässä skriptiä, on paneeli, joten Perii-kenttään täytetään automaattisesti "Panel". Näin haluammekin, sillä skriptin tavoite on laajentaa paneelisolmumme toiminnallisuutta.

Lopuksi, syötä skriptille polun nimi ja valitse Lataa:

../../_images/script_create.png

Tämän jälkeen skripti luodaan ja liitetään solmuun. Voit nähdä tämän solmun vieressä olevana "avoimen käärön" ikonina Skene-välilehdellä, kuten myös Script-ominaisuutena Tarkastelussa:

../../_images/script_added.png

Skriptin muokkaamiseksi käytä jompaa kumpaa näistä painikkeista, jotka on esitetty korostettuna yllä olevassa kuvassa. Tämä vie sinut skriptieditoriin, johon on lisätty valmis skriptipohja:

../../_images/script_template.png

Siinä ei ole paljoakaan valmiina. _ready() funktiota kutsutaan, kun solmu ja kaikki sen alisolmut lisätään aktiiviseen skeneen. Huom: _ready() ei ole luokan konstruktori; konstruktori on sen sijaan _init().

Skriptin rooli

Skripti lisää solmulle toiminnallisuutta. Sitä käytetään ohjaamaan sitä kuinka solmu toimii, sekä myös sitä kuinka se kommunikoi muiden solmujen kanssa: alisolmujen, yläsolmun, rinnakkaisten solmujen, ja niin edelleen. Skriptin paikallinen näkyvyysalue on solmu itse. Toisin sanoen, skripti perii solmun tarjoamat funktiot.

../../_images/brainslug.jpg

Signaalin käsittely

Signaaleja "lähetetään", kun jokin tietyn tyyppinen toiminto tapahtuu, ja ne voidaan yhdistää minkä tahansa skriptin mihin tahansa funktioon. Signaaleja käytetään pääasiassa käyttöliittymäsolmuissa, joskin muillakin solmuilla on niitä, ja voit jopa määritellä omia signaaleja omissa skripteissäsi.

Tässä vaiheessa kytkemme "pressed" signaalin itse luotuun funktioon. Kytkentöjen tekeminen on ensimmäinen osio ja funktion luominen on toinen osio. Ensimmäistä varten Godot tarjoaa kaksi tapaa luoda kytkennän: editorin visuaalisen rajapinnan tai koodin kautta.

Vaikkakin käytämme koodimenetelmää tämän oppaan loppuajan, käydään silti vastaisuuden varalle läpi kuinka editorin käyttöliittymä toimii.

Valitse Button solmu skenepuusta ja valitse sitten "Solmu"-välilehti. Varmista seuraavaksi, että "Signaalit" on valittuna.

../../_images/signals.png

Jos siten valitset "pressed()" kohdan "BaseButton" osiosta ja napsautat "Yhdistä..." painiketta oikeassa alakulmassa, avaat kytkennänluonti-ikkunan.

../../_images/connect_dialogue.png

The top of the dialogue displays a list of your scene's nodes with the emitting node's name highlighted in blue. Select the "Panel" node here.

The bottom of the dialogue shows the name of the method that will be created. By default, the method name will contain the emitting node's name ("Button" in this case), resulting in _on_[EmitterNode]_[signal_name].

Ja siihen päättyy opastus visuaalisesta kytkennän luonnista. Tämä on kuitenkin skriptausopas, joten oppimisen nimissä, uppoutukaamme manuaaliseen prosessiin!

Päämäärän saavuttamiseksi esittelemme funktion, joka on todennäköisesti Godot-ohjelmoijien eniten käyttämä funktio: Node.get_node(). Tämä funktio käyttää polkuja noutaakseen solmuja mistä tahansa skenestä, suhteessa solmuun joka omistaa skriptin.

Homman helpottamiseksi, poista kaikki extends Panel alapuolella oleva. Tulet täyttämään loput skriptistä käsin.

Koska Button ja Label ovat naapurisolmuja Panel-solmun, johon skripti on liitetty, alla, voit noutaa Button solmun kirjoittamalla seuraavan _ready() funktion alle:

func _ready():
    get_node("Button")
public override void _Ready()
{
    GetNode("Button");
}

Seuraavaksi, kirjoita funktio, jota kutsutaan, kun painiketta on painettu:

func _on_Button_pressed():
    get_node("Label").text = "HELLO!"
public void _OnButtonPressed()
{
    GetNode<Label>("Label").Text = "HELLO!";
}

Finally, connect the button's "pressed" signal to _on_Button_pressed() by using Object.connect().

func _ready():
    get_node("Button").connect("pressed", self, "_on_Button_pressed")
public override void _Ready()
{
    GetNode("Button").Connect("pressed", this, nameof(_OnButtonPressed));
}

Lopullisen skriptin pitäisi näyttää tältä:

extends Panel

func _ready():
    get_node("Button").connect("pressed", self, "_on_Button_pressed")

func _on_Button_pressed():
    get_node("Label").text = "HELLO!"
using Godot;

// IMPORTANT: the name of the class MUST match the filename exactly.
// this is case sensitive!
public class sayhello : Panel
{
    public override void _Ready()
    {
        GetNode("Button").Connect("pressed", this, nameof(_OnButtonPressed));
    }

    public void _OnButtonPressed()
    {
        GetNode<Label>("Label").Text = "HELLO!";
    }
}

Aja skene ja paina painiketta. Sinun pitäisi saada seuraava tulos:

../../_images/scripting_hello.png

No mutta, terve! Onnittelut ensimmäisen skenesi skriptaamisesta.

Muista

Yleinen väärinkäsitys tätä opasta koskien on, että kuinka get_node(path) toimii. Mille tahansa annetulle solmulle, get_node(path) etsii sen välittömistä alisolmuista. Yllä olevassa koodissa tämä tarkoittaa, että Button solmun on oltava Panel solmun alisolmu. Jos Button olisi sen sijaan Label solmun alisolmu, koodi, jolla se noudetaan, olisi:

# Not for this case,
# but just in case.
get_node("Label/Button")
// Not for this case,
// but just in case.
GetNode("Label/Button")

Muista myös, että solmuihin viitataan nimellä, ei tyypillä.

Muista

Kytkentäikkunan oikeanpuoleinen paneeli on olemassa tiettyjen arvojen liittämiseksi funktion parametreihin. Voit lisätä ja poistaa erityyppisiä arvoja.

Koodilähestymistapa mahdollistaa tämän myös neljännelle Array parametrille, joka on oletusarvoisesti tyhjä. Ole hyvä ja lukaise Object.connect metodin ohje lisätietoja varten.