Lingara Lingara Τεκμηρίωση Οδηγοί API Βιβλιοθήκες Εφαρμογές Δημιουργία Ενσωμάτωση Διαδικτυακή εφαρμογή
Γλώσσα: Ελληνικά

Διάλογοι με NPC

Αυτή η σελίδα έχει μεταφραστεί από τα αγγλικά. Αν οι δύο διαφέρουν, η αγγλική σελίδα είναι η σωστή. Διαβάστε την αγγλική σελίδα

Ένας χαρακτήρας του παιχνιδιού σας μπορεί να κάνει συζήτηση με τον παίκτη στη γλώσσα που μαθαίνει, προσαρμοσμένη στο επίπεδό του. Κάθε φράση που λέει ο παίκτης είναι ένας γύρος: το κιτ παίκτη τη στέλνει και η απάντηση του χαρακτήρα επιστρέφει σε ροή, σε κομμάτια.

Τι μεταφέρει ένας γύρος

Κάθε γύρος στέλνει όλα όσα χρειάζεται ο χαρακτήρας, επειδή το Lingara δεν κρατά καμία συζήτηση μεταξύ των γύρων:

  • npc: ποιος μιλά. Το name του έχει 1 έως 32 χαρακτήρες, και το προαιρετικό persona του είναι μία γραμμή περιγραφής, 1 έως 120 χαρακτήρες, όπως “ένας πωλητής ντάμπλινγκ”.
  • scene: προαιρετικό, πού γίνεται η συζήτηση, 1 έως 160 χαρακτήρες.
  • source_lang και target_lang: η γλώσσα του ίδιου του παίκτη και αυτή που μαθαίνει. Πρέπει να διαφέρουν, και ο χαρακτήρας μιλά μόνο target_lang.
  • level: το επίπεδο του παίκτη, από 1 έως 9. Ο οδηγός του Lingara “Τι σημαίνει ένα επίπεδο” περιγράφει την κλίμακα.
  • line: ό,τι μόλις είπε ο παίκτης, 1 έως 500 χαρακτήρες.
  • history: η συζήτηση μέχρι τώρα, από την παλαιότερη, το πολύ 12 γραμμές. Κάθε γραμμή έχει έναν speaker, είτε player είτε npc, και το text της, 1 έως 500 χαρακτήρες.

Κάθε κείμενο είναι μία μόνο γραμμή. Το παιχνίδι σας κρατά τη συζήτηση: το κιτ παίκτη κρατά το παράθυρο για κάθε διάλογο που ανοίγετε, προσθέτει σε αυτό κάθε ολοκληρωμένο γύρο, περικόπτει κάθε απάντηση στους πρώτους 500 χαρακτήρες της και απορρίπτει τις παλαιότερες γραμμές πέρα από τις 12.

Το Lingara αντιμετωπίζει το persona και τη σκηνή ως μη αξιόπιστο κείμενο από το παιχνίδι σας. Διαμορφώνουν τον τρόπο που μιλά ο χαρακτήρας, ποτέ το τι του επιτρέπεται να κάνει.

Πώς φτάνει μια απάντηση

Η απάντηση φτάνει σε ροή ως κομμάτια κειμένου, τα οποία το παιχνίδι σας προσαρτά καθώς φτάνουν. Ανάμεσά τους μπορεί να έρθει μια ειδοποίηση, όπως μία που λέει ότι η απάντηση περικόπηκε. Ο γύρος τελειώνει με done όταν η απάντηση είναι πλήρης, ή με error όταν απέτυχε. Ένας γύρος δεν μπορεί να συνεχιστεί: αν η σύνδεση διακοπεί, ο παίκτης λέει ξανά τη φράση.

Λέτε μία φράση τη φορά σε κάθε χαρακτήρα. Μια φράση που λέγεται ενώ ο χαρακτήρας απαντά ακόμη απορρίπτεται αντί να μπει σε ουρά, επειδή κάθε γύρος χρεώνεται.

Ποιος πληρώνει

Μόνο οι παίκτες ενός πελάτη με χρέωση βάσει χρήσης μπορούν να κάνουν συζήτηση, και κάθε γύρος χρεώνεται σε αυτόν τον πελάτη. Το token ενός παίκτη χρειάζεται embed:play.

Γλώσσα παραδείγματος κώδικα

Bevy

fn spawn_seller(mut commands: Commands) {
    let mei = NpcDialogue::new("Mei", "zh", 2)
        .and_then(|npc| npc.with_persona("a dumpling seller"))
        .and_then(|npc| npc.with_scene("the night market"))
        .expect("within Lingara's bounds");
    commands.spawn(mei);
    commands.spawn(Player);
}

/// One turn at a time: a line said while the NPC is replying is a `Busy` error.
fn talk(keys: Res<ButtonInput<KeyCode>>, npcs: Query<Entity, With<NpcDialogue>>, mut say: MessageWriter<NpcSay>) {
    if keys.just_pressed(KeyCode::Digit1) {
        for entity in &npcs {
            say.write(NpcSay { entity, line: "饺子多少钱?".into() });
        }
    }
}

/// `streaming` grows as the reply arrives; `turns` holds the finished ones.
fn show_reply(transcripts: Query<&NpcTranscript, Changed<NpcTranscript>>) {
    for transcript in &transcripts {
        if let Some(partial) = &transcript.streaming {
            info!("…{partial}");
        }
    }
}

Unity

public DialogueId OpenDialogue(string npc, string sourceLang, string targetLang, byte level) =>
    Client.DialogueOpen(new DialogueConfig { Npc = new Npc { Name = npc }, SourceLang = sourceLang, TargetLang = targetLang, Level = level });

// The reply streams back as NpcTurn events: append each Fragment's text to your label.
public RequestId Say(DialogueId dialogue, string line) => Client.DialogueSay(dialogue, line);

Godot C#

public long OpenDialogue(string npc, string sourceLang, string targetLang, byte level) =>
    Client.DialogueOpen(new DialogueConfig { Npc = new Npc { Name = npc }, SourceLang = sourceLang, TargetLang = targetLang, Level = level }).Value;

// The reply streams back as NpcTurnFragment signals, then one NpcTurnFinished.
public long Say(long dialogue, string line) => Client.DialogueSay(new DialogueId(dialogue), line).Value;

GDScript

# A LingaraNpc child per character: npc_name, target_lang and level in the
# inspector. say() returns false while a turn is in flight (turns are never
# queued, because each one is billed).
func talk_to_mei(line: String) -> void:
	if mei.say(line):
		bubble.text = "…"


func _on_mei_replied(text: String) -> void:
	bubble.text = text

Unreal C++

void ALingaraEmbedSnippetActor::Say(const FString& Line)
{
	ELingaraCallResult Result;
	FLingaraEmbedError Error;
	if (Dialogue == 0)
	{
		FLingaraDialogueConfig Config;
		Config.Npc.Name = TEXT("Mei");
		Config.Npc.Persona = TEXT("a tea seller at the night market");
		Config.SourceLang = TEXT("en");
		Config.TargetLang = TEXT("zh");
		Config.Level = 2;
		Dialogue = Lingara()->DialogueOpen(Config, Result, Error);
	}
	Reply.Reset();
	Lingara()->DialogueSay(Dialogue, Line, Result, Error);
}

// The reply streams back as npc_turn events: append each fragment.
void ALingaraEmbedSnippetActor::HandleNpcTurn(const FLingaraNpcTurn& Turn)
{
	if (Turn.Dialogue == Dialogue && Turn.Update.Type == ELingaraNpcTurnUpdateType::Fragment)
	{
		Reply += Turn.Update.Text;
	}
}

Kotlin

fun talkToMei(line: String) {
    val dialogue = npc ?: lingara.dialogueOpen(DialogueConfig(Npc("Mei", "a tea seller"), "the tea house", "en", "zh", 2, emptyList()))
    npc = dialogue
    lingara.dialogueSay(dialogue, line)
}

private fun onNpcTurn(update: NpcTurnUpdate) {
    when (update) {
        is NpcTurnUpdate.Opened -> bubble = ""
        is NpcTurnUpdate.Fragment -> bubble += update.text
        is NpcTurnUpdate.Finished -> bubble = update.text
        else -> Unit
    }
}

Java

void talkToMei(String line) {
  if (npc < 0) {
    Npc mei = new Npc("Mei", "a tea seller");
    npc =
        lingara.dialogueOpen(new DialogueConfig(mei, "the tea house", "en", "zh", 2, List.of()));
  }
  lingara.dialogueSay(npc, line);
}

void onNpcTurn(EmbedEvent.NpcTurn turn) {
  if (turn.getUpdate() instanceof NpcTurnUpdate.Fragment fragment) {
    bubble.append(fragment.getText());
  } else if (turn.getUpdate() instanceof NpcTurnUpdate.Finished finished) {
    bubble.setLength(0);
    bubble.append(finished.getText());
  }
}

Δείτε επίσης