Lingara Lingara Dokumentasie Gidse API Biblioteke Apps Bou Inbed Webtoepassing
Taal: Afrikaans

NPC-dialoog

Hierdie bladsy is uit Engels vertaal. As die twee verskil, is die Engelse bladsy korrek. Lees die Engelse bladsy

‘n Karakter in jou speletjie kan ‘n gesprek met die speler voer in die taal wat hulle leer, op hul vlak. Elke reël wat die speler sê, is een beurt: die spelerkit stuur dit, en die karakter se antwoord stroom in stukke terug.

Wat ‘n beurt dra

Elke beurt stuur alles wat die karakter nodig het, want Lingara hou geen gesprek tussen beurte nie:

  • npc: wie praat. Sy name is 1 tot 32 karakters, en sy opsionele persona is een reël beskrywing, 1 tot 120 karakters, soos “‘n verkoper van kluitjies”.
  • scene: opsioneel, waar die gesprek plaasvind, 1 tot 160 karakters.
  • source_lang en target_lang: die speler se eie taal en die een wat hulle leer. Hulle moet verskil, en die karakter praat net target_lang.
  • level: die speler se vlak, van 1 tot 9. Lingara se gids “Wat ‘n vlak beteken” beskryf die skaal.
  • line: wat die speler pas gesê het, 1 tot 500 karakters.
  • history: die gesprek tot dusver, oudste eerste, hoogstens 12 reëls. Elke reël het ‘n speaker, óf player óf npc, en sy text, 1 tot 500 karakters.

Elke teks is ‘n enkele reël. Jou speletjie hou die gesprek: die spelerkit hou die venster vir elke dialoog wat jy oopmaak, voeg elke voltooide beurt daarby, kap elke antwoord af tot sy eerste 500 karakters, en laat die oudste reëls verby 12 val.

Lingara hanteer die persona en die toneel as onbetroubare teks van jou speletjie. Hulle vorm hoe die karakter praat, nooit wat dit toegelaat word om te doen nie.

Hoe ‘n antwoord aankom

Die antwoord stroom as stukke teks in, wat jou speletjie aanheg soos hulle aankom. ‘n Kennisgewing kan tussen hulle kom, soos een wat sê die antwoord is kortgeknip. Die beurt eindig met done wanneer die antwoord volledig is, of met error wanneer dit misluk het. ‘n Beurt kan nie hervat word nie: as die verbinding wegval, sê die speler die reël weer.

Sê een reël op ‘n slag vir elke karakter. ‘n Reël wat gesê word terwyl die karakter nog antwoord, word geweier eerder as in die tou gesit, want elke beurt word gefaktureer.

Wie betaal

Net ‘n betaal-per-gebruik-kliënt se spelers mag ‘n gesprek voer, en elke beurt word aan daardie kliënt gefaktureer. ‘n Speler se token het embed:play nodig.

Taal van die kodevoorbeeld

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());
  }
}

Sien ook