Lingara Lingara Dokumentasi Panduan API Pustaka Aplikasi Bina Benam Apl web
Bahasa: Bahasa Melayu

Dialog NPC

Halaman ini diterjemahkan daripada bahasa Inggeris. Jika kedua-duanya berbeza, halaman bahasa Inggeris adalah yang betul. Baca halaman bahasa Inggeris

Watak dalam permainan anda boleh bercakap dengan pemain dalam bahasa yang sedang mereka pelajari, disesuaikan dengan tahap mereka. Setiap baris yang diucapkan pemain ialah satu giliran: kit pemain menghantarnya, dan balasan watak distrim kembali secara berperingkat.

Apa yang dibawa oleh satu giliran

Setiap giliran menghantar semua yang diperlukan oleh watak, kerana Lingara tidak menyimpan perbualan antara giliran:

  • npc: siapa yang bercakap. name baginya ialah 1 hingga 32 aksara, dan persona pilihannya ialah satu baris penerangan, 1 hingga 120 aksara, seperti “penjual ladu”.
  • scene: pilihan, tempat perbualan berlaku, 1 hingga 160 aksara.
  • source_lang dan target_lang: bahasa pemain sendiri dan bahasa yang sedang mereka pelajari. Kedua-duanya mesti berbeza, dan watak hanya bertutur dalam target_lang.
  • level: tahap pemain, daripada 1 hingga 9. Panduan Lingara “Maksud sesuatu tahap” menerangkan skala itu.
  • line: apa yang baru diucapkan pemain, 1 hingga 500 aksara.
  • history: perbualan setakat ini, yang terlama dahulu, paling banyak 12 baris. Setiap baris mempunyai speaker, sama ada player atau npc, dan text baris itu, 1 hingga 500 aksara.

Setiap teks ialah satu baris. Permainan anda menyimpan perbualan: kit pemain memegang tetingkap bagi setiap dialog yang anda buka, menambah setiap giliran yang selesai padanya, memotong setiap balasan kepada 500 aksara pertamanya, dan membuang baris terlama selepas 12.

Lingara menganggap persona dan adegan sebagai teks yang tidak dipercayai daripada permainan anda. Kedua-duanya membentuk cara watak bertutur, tidak pernah apa yang dibenarkan untuk dilakukannya.

Cara balasan tiba

Balasan distrim sebagai cebisan teks, yang ditambah oleh permainan anda sebaik sahaja ia tiba. Satu notis mungkin datang di antaranya, seperti notis yang menyatakan balasan telah dipotong. Giliran berakhir dengan done apabila balasan lengkap, atau dengan error apabila ia gagal. Giliran tidak boleh disambung semula: jika sambungan terputus, pemain mengucapkan baris itu sekali lagi.

Ucapkan satu baris pada satu masa kepada setiap watak. Baris yang diucapkan semasa watak masih membalas akan ditolak dan bukannya dibariskan, kerana setiap giliran dibilkan.

Siapa yang membayar

Hanya pemain bagi klien bermeter boleh bercakap dengan watak, dan setiap giliran dibilkan kepada klien itu. Token pemain memerlukan embed:play.

Bahasa contoh kod

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

Lihat juga