Unity
← Integre o conteúdo ao seu jogo
Unity 6 · C# · Newtonsoft Json
Comece exibindo uma frase. Este pequeno exemplo lê diretamente a exportação real do porto; ele ainda não é um sistema completo de diálogos. Depois, conecte os dados à interface do seu jogo.
1 · Prepare os arquivos e a cena
Importe story.json para Assets/Story. No Package Manager, instale com.unity.nuget.newtonsoft-json. Crie Canvas → Text - TextMeshPro e importe TMP Essentials se for solicitado. Adicione FirstText.cs a um GameObject. No Inspector, atribua o JSON TextAsset a storyFile e o objeto de texto a dialogueText. Pressione Play.
story.json · Entenda os arquivos exportados
2 · Exiba o primeiro texto
using System;
using Newtonsoft.Json.Linq;
using TMPro;
using UnityEngine;
public class FirstText : MonoBehaviour
{
[SerializeField] private TextAsset storyFile;
[SerializeField] private TMP_Text dialogueText;
private JObject story;
private void Start()
{
try { story = JObject.Parse(storyFile.text); ShowLanguage("en"); }
catch (Exception error) { dialogueText.text = "Cannot read story.json"; Debug.LogException(error); }
}
public void ShowLanguage(string locale)
{
const string id = "fd7b61a3-8233-4ba7-8f77-b88b119a91bf";
var content = story["content"];
var translation = content["translations"]?[locale]?[id];
var message = translation?["message"] ?? content["texts"][id]["sourceMessage"];
string line = "";
foreach (var segment in message["segments"])
{
if ((string)segment["kind"] != "text") throw new Exception("Text-only example");
line += (string)segment["text"];
}
dialogueText.text = line;
}
}Resultado esperado: “Welcome to the harbour. I am Mira.” Com locale = "de" ou o parâmetro de idioma de: “Willkommen im Hafen. Ich bin Mira.” Se o idioma não estiver disponível, será usado o texto original. Este exemplo aceita segmentos de texto e não descarta placeholders silenciosamente.
3 · De uma frase a uma conversa
O ID de texto fixo acima serve para o primeiro teste. No seu jogo, escolha flowRef/entryRef em story-index.json, leia execution.entries[entryRef].nodeRef e depois execution.nodes[nodeRef]. O diálogo atual fornece text.textRef e speakerRef. A continuação depende do tipo de nó.
Nome e diálogo: TMP_Text.text. Respostas: Button.onClick; preserve cada ID de opção em uma variável local separada. End: dialogPanel.SetActive(false). Um botão pode chamar ShowLanguage com a string de sem reiniciar o progresso.
- Continue e End: siga as conexões e feche a caixa de texto
- Escolhas: ID da resposta, ordem e continuação selecionada
- Condições e variáveis: dez ou duas moedas de ouro
- Idioma: mesmos IDs, conteúdo resolvido novamente
- Command: entregar um item ou abrir uma loja
- Call/Return: entrar em uma sub-história e voltar
Examine as respostas e a verificação de ouro nesta linguagem
Leia os dados de uma escolha
Insira este trecho onde story estiver disponível após o carregamento (no RPG Maker: const story = $gameTemp.vnleExample.story;). Ele exibe IDs para conferência. Substitua a saída pelos seus botões de resposta. O trecho cobre as duas respostas do porto e a verificação de ouro seguinte; não é um interpretador genérico.
// Inside a method after story (JObject) has been loaded.
var choice = story["execution"]["nodes"]["42edfff8-b8fe-46bf-ae0d-9e2347b6e726"];
foreach (var optionIdToken in choice["optionOrder"])
{
string optionId = (string)optionIdToken;
var option = choice["options"][optionId];
Debug.Log(optionId + " " + (string)option["text"]["textRef"]);
// Resolve the text and retain optionId in your Button.onClick listener.
}
var branch = story["execution"]["nodes"]["c1c3c372-0a73-4cd0-851d-ede59d5709bb"];
int gold = 10; // Repeat with 2.
var next = gold >= (int)branch["condition"]["right"]["value"]["value"]
? branch["whenTrue"] : branch["whenFalse"];
Debug.Log((string)next["nodeRef"]);Com 10 moedas de ouro, next aponta para Pay five gold; com 2, para Not enough gold. No jogo, execute a verificação somente quando o caminho escolhido chegar a esse nó. Cada resposta tem sua própria continuação.
4 · Mapeie suas próprias imagens
Este trecho complementar espera um objeto de diálogo atual chamado node e os elementos de interface indicados nos comentários. Em C++ e MonoGame, speakerRef já foi lido como SpeakerId ou speakerId. A chave do mapeamento é o ID real da personagem Mira; o nome e a localização da imagem pertencem ao seu jogo. Insira as linhas nos locais indicados.
// Add inside your own MonoBehaviour. Assign a Sprite and a UI Image in Inspector.
[SerializeField] private Sprite miraPortrait;
[SerializeField] private UnityEngine.UI.Image portrait;
// node is the current JObject dialogue:
portrait.sprite = (string)node["speakerRef"] == "807b2957-7bab-4a28-83a4-1f3d1589bbc2" ? miraPortrait : null;
portrait.enabled = portrait.sprite != null;Resolva o nome do personagem por content.characters[speakerRef].nameTextRef, como faz com o texto do diálogo. Se faltar um mapeamento, o jogo deve ocultar o retrato anterior ou mostrar uma imagem substituta. As imagens não são selecionadas pelo idioma.
Use as referências de imagem da exportação completa
5 · Distribua os arquivos com o jogo
O TextAsset referenciado é incluído com a cena. As tabelas de IDs são objetos JSON com chaves dinâmicas; JsonUtility não substitui JObject diretamente neste caso. Este exemplo não exige acesso a arquivos por StreamingAssets.
Confira o resultado
- As saudações em inglês e alemão devem aparecer corretamente; um idioma indisponível deve usar o inglês.
- Ao implementar o fluxo, teste as duas respostas, 10 e 2 moedas de ouro, a volta da sub-história e End.
- Execute o jogo compilado fora da pasta do projeto. JSON, fontes e retratos também devem estar disponíveis ali.
Documentação oficial
Referências de API e configuração usadas nesta abordagem: