====== Godot Dialogue Manager 3 med C# ======
Denne guide viser et simpelt eksempel af brug af Dialogue Manager 3 i Godot 4 med C#.
* [[https://github.com/nathanhoad/godot_dialogue_manager/tree/main/docs|Dialog Manager 3 - Dokumentation]] (//**its pretty good actually**//)
* Video : https://www.youtube.com/watch?v=U3Mimia-904
* [[https://dialogue.nathanhoad.net/|Dialogue Manager 3]]
----
===== Installer Dialogue Manager 3 =====
(easy peasy, japanesee)
- Åbn AssetLib i Godot
- Søg efter “Dialogue Manager 3”
- Installer plugin
- Gå til: Project → Project Settings → Plugins
- Aktivér pluginet (se nedenstående)
{{ :images:dm3_plugin_enable.png |}}
----
===== Opret en dialogfil =====
{{ :images:dm3_createnewdialogue.png |}}
Indsæt følgende i filen:
~ start
NPC: Hej! Velkommen til [HTX|EUC Nord] 👋
- Hvem er du?
NPC: Jeg er skolens NPC.
=> END
- Farvel
NPC: Vi ses!
=> END
Begreber i ovenstående:
* Cues (labels)
* Dialogue Line
* Option
* Comment
* Jump END
* Random word
* Indentation (indryk/tabulering) - //indrykning er vigtigt.. ligesom i Python//
Gem filen. (opret en dedikeret folder til dine dialoger) som f.eks.:
res://dialogues/htx_dialog.dialogue
----
==== Test / Debugging af dialog ====
Test din dialog ved at klikke 'test dialogue file ..' i menuen.
{{ :images:dm3_test_dialogue.png |}}
----
==== Dialog Manager Syntax ====
^ Tegn ^ betydning ^
| Martin : Dingo ate me baby! | Martin says : Dingo ate me baby! |
| ''~'' | Cues (Label) |
| ''-'' | Option |
| ''=>'' | Jump to cue/label |
| ''=><'' | Jump to snippet, and return (sub-routine) |
| ''**[**sayA**%%|%%**sayB**%%|%%**sayC**]**'' | Skifter tilfældig mellem sayA, sayB og sayC |
| ''#'' | Kommentar |
----
==== Multiline ====
Man kan anvende multilines for at vise flere linjer dialog fra en enkelt NPC. Her bruger du enten '**\n**' til at adskille dem på en enkelt linje eller indryk hver yderligere linje.
Nathan: Prepare to duel me, coward!
I’ve studied the fine art of…
pointing a stick and looking angry.
Also, I’m really good at tripping over my own feet.
----
===== C# Script til at starte dialog =====
Tilføj først DialogManager som en Auto-load klasse.
{{ :images:dm3_add_dm_singleton.png |}}
Nu kan du henvise til den fra alle dine C# scripts.
Tilføj et C# i dit FileSystem:
using Godot;
using System;
using DialogueManagerRuntime;
public partial class DialogueTrigger : Area2D
{
[Export]
public Resource DialogueResource;
[Export]
public string DialogueStartLabel = "start"; //default er altid 'start'
public override void _Ready()
{
base._Ready();
if (this.DialogueResource == null) {
GD.Print("Error: You forgot to assign a dialogue resource..");
}
}
public void StartTheDialog() {
DialogueManager.ShowDialogueBalloon(DialogueResource, DialogueStartLabel );
}
public void OnBodyEnter(Node2D other) {
if (other.Name == "Player")
{
this.StartTheDialog();
}
}
}
----
===== Forbind dialogen i Inspector =====
- Find feltet "Dialogue Resource"
- Træk din dialog ressource f.eks ''htx_dialogue.dialogue'' ind i feltet
- Angiv evt. StartDialogLabel. (hvis den er forskellig fra ''start'')
----
===== Typiske fejl =====
^ Fejl ^ Årsag ^
| DialogueManager.Instance er null | Plugin ikke aktiveret |
| Intet sker | DialogueResource ikke sat |
| C# build fejl | .NET SDK mangler |
==== Random tekst ====
For at gøre dialogerne mindre ensformige kan vi indføre tilfældigheder i valget af linier & jumps i dialog scriptet.
Nathan: I will say this.
% Nathan: And then I might say this
% Nathan: Or maybe this
% Nathan: Or even this?
==== Random ord-valg ====
Nathan: Hi there partner, i hope you have a [wonderful|awesome] day.
==== Random Jumps ====
Combining the randomized line syntax with the jump syntax to randomly jump to a pool of titles.
Nathan: I am feeling lucky. I am gonna choose a random jump :)
% => first
% => second
% => third
----
==== Variable (global) ====
Opret en klasse du vil anvende som en global (Autoload).
using Godot;
using System;
public partial class MyGlobal : Node
{
public Boolean has_key = false;
public int gold = 5;
}
Tilføj dit script til Autoload, så det kan tilgåes fra alle scripts på tværs af scener.
{{ :images:dm3_add_global.png |}}
----
=== Brug global variabel ===
Som en del af en dialog
Nathan : I have {{ MyGlobal.gold }} gold nuggets in me pocket..
I en betinget option
- Buy sword [if MyGlobal.gold >= 8]
- Leave shop
* Buy option bliver 'ghosted' indtil guld når 8 eller mere.
Du kan også lave inline if/else statements, for fx. at få ental/flertal på plads ift. antal.
Nathan: I have {{MyGlobal.coins}} [if MyGlobal.coins == 1]coin[else]coins[/if], which is nice!
----
==== Interaktion med C# kode ====
^ Tegn ^ betydning ^
| ''do zelda.LookDown'' | Kalder funktion ''LookDown()'' på 'zelda' objekt |
| ''set State.hasAble = true'' | ændrer propertie i State klasse |
----