Lingara Lingara Belgeler Rehberler API Kütüphaneler Uygulamalar Oluştur Gömme Web uygulaması
Dil: Türkçe

NPC diyaloğu

Bu sayfa İngilizceden çevrilmiştir. İkisi arasında fark varsa İngilizce sayfa doğrudur. İngilizce sayfayı oku

Oyununuzdaki bir karakter, oyuncuyla öğrendiği dilde, onun seviyesine göre ayarlanmış bir sohbet sürdürebilir. Oyuncunun söylediği her satır bir turdur: oyuncu kiti onu gönderir ve karakterin yanıtı parça parça akarak geri gelir.

Bir tur neler taşır

Her tur, karakterin ihtiyaç duyduğu her şeyi eksiksiz gönderir, çünkü Lingara turlar arasında hiçbir sohbet saklamaz:

  • npc: konuşan kişi. name alanı 1 ile 32 karakter arasındadır; isteğe bağlı persona alanı ise 1 ile 120 karakter arasında, tek satırlık bir açıklamadır, örneğin “bir mantı satıcısı”.
  • scene: isteğe bağlı; sohbetin geçtiği yer, 1 ile 160 karakter arasında.
  • source_lang ve target_lang: oyuncunun kendi dili ve öğrendiği dil. Farklı olmaları gerekir ve karakter yalnızca target_lang dilini konuşur.
  • level: oyuncunun seviyesi, 1 ile 9 arasında. Lingara’nın “Bir seviye ne anlama gelir” rehberi ölçeği açıklar.
  • line: oyuncunun az önce söylediği, 1 ile 500 karakter arasında.
  • history: şimdiye kadarki sohbet, en eskisi önce, en fazla 12 satır. Her satırın bir speaker alanı (player veya npc) ve 1 ile 500 karakter arasında bir text alanı vardır.

Her metin tek bir satırdır. Sohbeti oyununuz tutar: oyuncu kiti açtığınız her diyalog için pencereyi tutar, biten her turu ona ekler, her yanıtı ilk 500 karakterine kırpar ve 12 satırı aşan en eski satırları atar.

Lingara, persona’yı ve sahneyi oyununuzdan gelen güvenilmeyen metin olarak ele alır. Bunlar karakterin nasıl konuştuğunu şekillendirir, asla neyi yapmasına izin verildiğini değil.

Bir yanıt nasıl gelir

Yanıt metin parçaları halinde akar; oyununuz bunları geldikçe ekler. Aralarında, örneğin yanıtın kısa kesildiğini söyleyen bir bildirim gelebilir. Tur, yanıt tamamlandığında done ile, başarısız olduğunda ise error ile biter. Bir tur sürdürülemez: bağlantı koparsa oyuncu satırı yeniden söyler.

Her karaktere bir seferde tek bir satır söyleyin. Karakter hâlâ yanıt verirken söylenen bir satır kuyruğa alınmaz, reddedilir, çünkü her tur faturalandırılır.

Kim öder

Yalnızca ölçümlü bir istemcinin oyuncuları sohbet sürdürebilir ve her tur o istemciye faturalandırılır. Bir oyuncunun belirtecinin embed:play kapsamına ihtiyacı vardır.

Kod örneğinin dili

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

Ayrıca bakınız