Dateien und JSON verstehen
Was ist JSON?
JSON ist eine Textdatei mit strukturierten Daten. Geschweifte Klammern enthalten benannte Eigenschaften, eckige Klammern eine geordnete Liste. Texte stehen in doppelten Anführungszeichen; Zahlen und true/false nicht. IDs verbinden Datensätze. Öffne die Datei in einem Texteditor zum Nachschlagen; ändere die Geschichte normalerweise in VNLE und exportiere neu.
JSON erklärt · Lernweg: Inhalte ins Spiel bringen
Das bearbeitbare Projekt und der Spiel-Export haben unterschiedliche Aufgaben. Ändere Inhalte in VNLE und exportiere sie anschließend neu. Die folgenden Ausschnitte stammen aus dem mitgelieferten Projekt.
Ordner im Export
story.json Game data: flow + text + catalogs
assets/files/…png Images used by the game
story-index.json Entry points for starting conversations
export-info.json Export result
project/
project.vnle.json Project name, languages, catalog references
chapters/ Chapter structure
flows/ Scene nodes and entry points
layout/ Node positions in the editor
characters/ Characters and portrait references
variables/ Variable definitions and initial values
commands/ Game actions, inputs and outcomes
items/, quests/, locations/ Resources
localization/ Source texts and translations
assets/ Asset catalog and image filesIm Lernbeispiel ergänzt guide-map.json die IDs mit lesbaren Namen. Sie gehört zum Beispiel und wird nicht automatisch für jedes Projekt erzeugt. Im normalen Export findest du Startpunkte in story-index.json und die Kataloge in story.json.
Ein Gespräch starten
Ein Startpunkt besteht aus flowRef und entryRef. Beide sind IDs, keine Anzeigenamen. Löse execution.entries[entryRef].nodeRef auf; dort beginnt der Ablauf. Die tatsächlich verwendeten IDs des Beispiels lauten:
{
"flowRef": "1f69a7b6-1bdc-4dff-b8ee-9b2819b35168",
"entryRef": "5e6b2e12-1ac1-4c46-8221-1a051e87370a"
}Einen Dialog lesen
{
"continuation": {
"kind": "node",
"nodeRef": "85b3aadf-2b95-4150-bc44-c0c796337874"
},
"flowRef": "1f69a7b6-1bdc-4dff-b8ee-9b2819b35168",
"id": "ffa7141b-97ed-44c1-a346-8bba7e26d94f",
"kind": "dialogue",
"speakerRef": "807b2957-7bab-4a28-83a4-1f3d1589bbc2",
"text": {
"bindings": {},
"textRef": "fd7b61a3-8233-4ba7-8f77-b88b119a91bf"
}
}kind bestimmt die Knotenart. speakerRef verweist auf eine Figur in content.characters. text.textRef verweist auf content.texts. continuation beschreibt, wohin Weiter führt.
Text und Sprache auflösen
{
"id": "fd7b61a3-8233-4ba7-8f77-b88b119a91bf",
"category": "dialogue",
"sourceMessage": {
"kind": "segments",
"segments": [
{
"kind": "text",
"text": "Welcome to the harbour. I am Mira."
}
]
},
"placeholders": {},
"externalUse": false
}Nutze content.translations[Sprache][Text-ID].message, wenn vorhanden. Ansonsten nutze sourceMessage. Textsegmente liefern den sichtbaren Text; Platzhaltersegmente erhalten ihre Werte aus den Bindungen des Knotens. Die Sprache gehört zu den Spieleinstellungen: Ein Wechsel ändert nicht den Fortschritt.
Name und Bild anzeigen
{
"id": "807b2957-7bab-4a28-83a4-1f3d1589bbc2",
"name": "Mira",
"key": "character_2fbfc3b256cb4ecf94a89965ef8e4549",
"nameTextRef": "ff2cf3d4-08d3-47d8-b41a-86f1a801e1b7",
"color": "#82d5e6",
"defaultPortraitRef": "eacb484c-0663-4ffd-876d-401664b980db",
"emotions": {}
}Löse nameTextRef wie jeden anderen Text auf. Für das Bild verwende das Porträt der gewählten Emotion oder defaultPortraitRef. Die zugehörige Datei steht unter content.assets[Porträt-ID].relativePath. Kopiere assets zusammen mit story.json.