Contents

Een dialoogsysteem maken in Godot met GDScript

Bij het ontwikkelen van games zijn boeiende gameplay en een boeiend verhaal essentieel voor het creëren van gedenkwaardige ervaringen. Een krachtig hulpmiddel om dit te bereiken is een dialoogsysteem.

Met een goed uitgevoerd dialoogmechanisme kunnen personages met elkaar praten, gegevens uitwisselen en contact maken met spelers, waardoor de spelervaring rijker en meeslepender wordt.

Je Godot-spel opzetten

Start het ontwikkelingsproces door de fundamentele structuur van je spel op te zetten. In dit geval maak je een tweedimensionale basisomgeving met een avatar die kan navigeren met de pijltjestoetsen.

De broncode die in deze publicatie is gebruikt, is toegankelijk via een openbare repository op GitHub, die deze gratis aanbiedt onder de voorwaarden van de algemeen geaccepteerde MIT-licentie.

Integreer het gegeven codefragment in Unity door een nieuwe instelling te starten voor de aanwezigheid van het spelerspersonage. Introduceer een instantie van CharacterBody2D object en verbind het met de scène. Voeg daarna een component CollisionShape2D toe met een rechthoekige vorm om de grenzen te bepalen waarbinnen de speler interageert met andere objecten in de spelwereld.

Integreer mobiliteit en interactiviteit van personages met platformgebaseerde objecten door GDScript te gebruiken om het standaardscript van het CharacterBody2D component te vervangen. De meegeleverde code is als volgt:

 extends CharacterBody2D

var speed = 300

func _physics_process(delta):
    var input_dir = Vector2.ZERO

    if Input.is_action_pressed("ui_left"):
        input_dir.x -= 1

    if Input.is_action_pressed("ui_right"):
        input_dir.x \\+= 1

    if Input.is_action_pressed("ui_up"):
        input_dir.y -= 1

    if Input.is_action_pressed("ui_down"):
        input_dir.y \\+= 1

    velocity = input_dir.normalized() * speed
    move_and_collide(velocity * delta)

Met deze code kan de protagonist navigeren door middel van commando’s met pijltjestoetsen, waardoor hij gemakkelijker door verschillende platforms kan bewegen terwijl er rekening wordt gehouden met eventuele interacties of botsingen.

/nl/images/simple-game-in-godot.jpg

Dialoogvenster toevoegen

Als je begint met het ontwikkelen van een dialoogsysteem, moet je in de beginfase een interface maken voor het weergeven van tekst bij interactie tussen het personage van de speler en bepaalde objecten of niet-spelerpersonages (NPC’s).

Om de functionaliteit van ons script CharacterBody2D te verbeteren, moeten we extra variabelen opnemen waarmee we het dialoogvenster en de inhoud ervan effectief kunnen beheren. Dit kan worden bereikt door nieuwe variabelen te introduceren zoals _dialogBox , _previousLine en _currentLine . De eerste bevat de verwijzing naar het dialoogvensterobject, terwijl de laatste twee respectievelijk de huidige regel weergeven die in het tekstveld wordt getypt en de vorige regel. Door gebruik te maken van deze variabelen, kunnen we functies implementeren zoals geschiedenis oproepen en real-time bijwerken van het invoertekstveld tijdens het typen.

 var dialogue_box: Label
var close_button: Button
var dialogue_lines: Array = ["Hello, adventurer!", "Welcome to our village."]

var current_line: int = 0
var line_timer: float = 0 

De dialogue_box is ontworpen om de gespreksinhoud weer te geven en de close_button dient als middel voor gebruikers om het dialoogvenster te sluiten wanneer zij dat nodig achten.

In de functie ready maak en initialiseer ik een dialoogvenster voor onze toepassing. Dit dialoogvenster is essentieel om een interface te bieden tussen de gebruiker en het programma, zodat ze er op een zinvolle manier mee kunnen interageren. Het dialoogvenster kan verschillende berichten of prompts weergeven, afhankelijk van de acties die door de gebruiker of het programma worden uitgevoerd. Bovendien dient dit dialoogvenster als container voor andere componenten die we later zullen toevoegen, zoals knoppen of tekstvelden, waarmee gebruikers gegevens kunnen invoeren of specifieke taken kunnen uitvoeren binnen de applicatie.

 func _ready():
    dialogue_box = Label.new()
    dialogue_box.visible = false
    add_child(dialogue_box) 

Dialoogtekst weergeven

Je kunt je nu concentreren op het weergeven van de inhoud van het dialoogvenster. Het is mogelijk om de tekst uit te breiden over meerdere regels en scrollen in te schakelen, zodat slechts één regel tegelijk wordt weergegeven.

Volg deze stappen om de fysicaprocesfunctie aan te passen voor de weergave van dialoogregels:1. Voeg een nieuwe variabele genaamd “dialogueLines” toe om de tekstgegevens voor elke dialoogregel op te slaan. Dit kan gedaan worden door een lege array aan te maken en deze toe te wijzen aan de “dialogueLines” sleutel binnen het gewenste object of script.2. Werk de simulatielus bij om de afhandeling van dialoogregels op te nemen. Haal binnen deze lus de tekstgegevens op uit de “dialogueLines” array met de indexwaarde als identifier. Werk vervolgens de positionering en weergave van de tekstballon bij op basis van de eigenschappen die zijn gedefinieerd in het oorspronkelijke ontwerpdocument.

 if line_timer > 0:
    line_timer -= delta
elif current_line < dialogue_lines.size():
    show_next_dialogue_line() 

Het gegeven stukje code evalueert of de waarde van de variabele line\_timer een bepaalde drempel overschrijdt. Als deze voorwaarde waar is, wordt de waarde van de timer verminderd met de gespecificeerde deltawaarde. Als de timer op dat moment inactief is en er nog meer dialooginhoud moet worden weergegeven, wordt de subroutine show_next_dialogue\_line aangeroepen.

Implementeer de show_next_dialogue_linefunctie als volgt:

 func show_next_dialogue_line():
    dialogue_box.text = dialogue_lines[current_line]
    current_line \\+= 1

   # Display each line for 3 seconds
    line_timer = 3.0 

De huidige-dag functie wijzigt de tekst in de tekstballon met de meest recente uiting en verhoogt de waarde van de huidige lijnteller. Een timer, de “lijntimer”, regelt de tijdsduur dat elke uitspraak zichtbaar blijft op het scherm voordat wordt doorgegaan met het volgende bericht.

/nl/images/text-in-godot.jpg

Een sluitknop toevoegen

Je kunt gamers nu de optie geven om het gespreksvenster te sluiten en verder te gaan met de gameplay. Dit kun je doen door een “sluit”-knop in het dialoogvenster te plaatsen. Als je die indrukt, wordt het venster verborgen en kan de deelnemer weer verder met het spel.

Wijzig de bestaande ready functie om een sluitknop met bijbehorende functionaliteit te genereren door de benodigde HTML-code voor de sluitknop op te nemen in de event listener-functie waarmee het modale venster wordt geopend.

 func _ready():
    dialogue_box = Label.new()
    dialogue_box.visible = false
    add_child(dialogue_box)

    close_button = Button.new()
    close_button.text = "Close"
    close_button.position = Vector2(50, 30)
    close_button.visible = false
    close_button.pressed.connect(_on_close_button_pressed)
    add_child(close_button) 

De meegeleverde code genereert een knopobject, past de visuele presentatie en plaatsing aan en maakt een verbinding tussen het signaal van de drukgebeurtenis en de functie sluit_knop_ingedrukt.

Neem een nieuwe methode op met de naam _on_close_button_pressed in de klasse GameUIManager . Zorg er in deze functie voor dat zowel de zichtbaarheid van het dialoogvenster als de sluitknop worden ingesteld op false . Hierdoor kan de gebruiker de dialooginterface niet meer zien of ermee interageren.

Om opnieuw te beginnen is het verstandig om de huidige regelindex terug te zetten naar de oorspronkelijke nulstand om te garanderen dat ons gesprek opnieuw begint bij elke keer dat de deelnemer om communicatie vraagt:

 func _on_close_button_pressed():
    dialogue_box.visible = false
    close_button.visible = false
    current_line = 0 

Door deze aanpassing hebben deelnemers de mogelijkheid om deel te nemen aan een gesprek en het dialoogvenster naar eigen inzicht te verlaten, zodat ze naar wens verder kunnen navigeren of interageren met de digitale omgeving.

/nl/images/buttons-in-godot.jpg

Best Practices voor je Dialoogsysteem

Als je je blijft richten op deze aanbevolen richtlijnen terwijl je je gespreksmodel verbetert en bijschaaft, kun je de narratieve diepgang en onderdompeling voor je spelers optimaal verrijken.

Consistentie is de sleutel

Het handhaven van een uniforme taalkundige aanpak is cruciaal voor het stimuleren van een authentieke band tussen de speler en de personages in de game, terwijl het een samenhangende sfeer bevordert binnen de virtuele omgeving. Deze onwrikbare consistentie zorgt voor een goede verstandhouding tussen de gamer en het verhaal, waardoor de algehele ervaring wordt verbeterd door te zorgen voor een soepel en meeslepend avontuur.

Creëer karakterstemmen

Om authentieke en meeslepende personages te creëren, is het belangrijk om elk individu een unieke stem en temperament te geven dat voortkomt uit hun achtergrondverhaal, doelstellingen en gevoelens. Hierdoor kunnen lezers of kijkers hen beter begrijpen en zich op een emotioneel niveau met hen verbinden.

Het opnemen van kenmerkende spraakpatronen en maniertjes voor elk personage versterkt niet alleen hun individualiteit, maar draagt ook bij aan memorabele uitwisselingen tussen hen, omdat het een unieke identificatie geeft die de ene persoonlijkheid van de andere onderscheidt. Gelukkig is het implementeren van deze variaties eenvoudig binnen het raamwerk van Godot, waardoor ontwikkelaars diverse audiocues kunnen maken met minimale inspanning.

Betekenisvolle keuzes

Maak keuzes die belangrijke gevolgen hebben voor zowel de verhaallijn als de interacties tussen speler en personage. Door aspecten als plotontwikkeling, interpersoonlijke dynamiek of kernregels van het spel te beïnvloeden, motiveren deze keuzes gebruikers om actief deel te nemen aan conversaties en stimuleren ze emotionele betrokkenheid bij hun keuzes.

Testen en herhalen

Voer een uitgebreide evaluatie uit van je dialoogsequenties door ze grondig te controleren op spelfouten, grammaticale inconsistenties en onevenwichtigheden in de pacing. Gebruik speltesttechnieken om inzichten van spelers te verzamelen en implementeer waar nodig aanpassingen om naadloze interactie en een verbeterde spelervaring via het dialoogsysteem te garanderen.

UI-consistentie

Als je een dialoogsysteem voor een videogame ontwerpt, is het belangrijk om ervoor te zorgen dat het uiterlijk en de lay-out aansluiten bij het bredere gebruikersinterfaceontwerp van de game. Consistentie in termen van visuele componenten zoals lettertypes, kleurenschema’s en andere grafische elementen kan bijdragen aan een meeslepende spelomgeving door een uniforme look te bevorderen voor alle aspecten van het spel.

Als je deze aanbevolen benaderingen volgt, kun je een dialoogsysteem ontwikkelen dat niet alleen het verhaal in je spel verbetert, maar ook een onvergetelijke en meeslepende ervaring voor spelers creëert.

Je Godot-games verbeteren met dialoogsystemen

De integratie van een dialoogsysteem in je Godot-games kan de betrokkenheid van spelers vergroten en narratieve technieken transformeren. Door de communicatie tussen personages, de expressie van emoties en de reactie op de keuzes van spelers te vergemakkelijken, wordt een steeds meeslepender en meer verbonden spelomgeving gecreëerd.

Door gebruik te maken van het intuïtieve platform van Godot en de mogelijkheden van de scripttaal GDScript te benutten, beschikken ontwikkelaars over de middelen om boeiende dialoogsystemen te creëren die spelers effectief onderdompelen in een meeslepend verhaal en hun algehele spelervaring verbeteren.