Lingara Lingara Dokumentasyon Mga gabay API Mga library Mga app Gumawa Embed Web app
Wika: Filipino

Usapan ng NPC

Isinalin mula sa Ingles ang pahinang ito. Kung magkaiba ang dalawa, ang pahinang Ingles ang tama. Basahin ang pahinang Ingles

Ang isang karakter sa iyong laro ay puwedeng makipag-usap sa player sa wikang pinag-aaralan niya, na itinapat sa kanyang antas. Ang bawat linyang sinasabi ng player ay isang turn: ipinapadala ito ng player kit, at nag-i-stream pabalik nang paisa-isang piraso ang sagot ng karakter.

Ang dala ng isang turn

Ipinapadala ng bawat turn ang lahat ng kailangan ng karakter, dahil walang iniingatang usapan ang Lingara sa pagitan ng mga turn:

  • npc: kung sino ang nagsasalita. Ang name nito ay 1 hanggang 32 character, at ang opsyonal nitong persona ay isang linya ng paglalarawan, 1 hanggang 120 character, gaya ng “isang nagtitinda ng dumpling”.
  • scene: opsyonal, kung saan nagaganap ang usapan, 1 hanggang 160 character.
  • source_lang at target_lang: ang sariling wika ng player at ang wikang pinag-aaralan niya. Dapat magkaiba ang mga ito, at target_lang lang ang sinasalita ng karakter.
  • level: ang antas ng player, mula 1 hanggang 9. Inilalarawan ng gabay ng Lingara na “Ano ang ibig sabihin ng isang antas” ang sukatan.
  • line: ang kasasabi lang ng player, 1 hanggang 500 character.
  • history: ang usapan hanggang ngayon, pinakaluma muna, hanggang 12 linya. Ang bawat linya ay may speaker, alinman sa player o npc, at ang text nito, 1 hanggang 500 character.

Iisang linya ang bawat text. Ang iyong laro ang nag-iingat ng usapan: hawak ng player kit ang window para sa bawat dialogue na binubuksan mo, idinadagdag dito ang bawat natapos na turn, pinuputol ang bawat sagot sa unang 500 character nito, at tinatanggal ang pinakalumang mga linya na lampas sa 12.

Itinuturing ng Lingara ang persona at ang scene bilang hindi pinagkakatiwalaang text mula sa iyong laro. Hinuhubog ng mga ito kung paano nagsasalita ang karakter, hindi kailanman kung ano ang pinapayagan nitong gawin.

Paano dumarating ang isang sagot

Nag-i-stream ang sagot bilang mga piraso ng text, na idinudugtong ng iyong laro habang dumarating ang mga ito. Puwedeng may dumating na abiso sa pagitan ng mga ito, gaya ng abisong nagsasabing pinaikli ang sagot. Natatapos ang turn sa done kapag kumpleto na ang sagot, o sa error kapag nabigo ito. Hindi puwedeng ituloy ang isang turn: kapag naputol ang koneksyon, uulitin ng player ang linya.

Isang linya lang sa bawat pagkakataon ang sabihin sa bawat karakter. Ang linyang sinabi habang sumasagot pa ang karakter ay tinatanggihan sa halip na ipila, dahil sinisingil ang bawat turn.

Sino ang nagbabayad

Ang mga player lang ng isang metered client ang puwedeng makipag-usap, at sinisingil sa client na iyon ang bawat turn. Kailangan ng token ng player ang embed:play.

Wika ng halimbawang code

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

Tingnan din