VNLEWIKI物語をつくる。世界をつなぐ。
日本語
VNLEガイド

ファイルとJSONを理解する

JSONとは?

JSONは構造化されたデータを保存するテキスト形式です。波括弧は名前付きのプロパティ、角括弧は順序のある一覧を表します。文字列は二重引用符で囲みますが、数値とtrue/falseは囲みません。IDで項目同士を関連付けます。内容の確認にはテキストエディターを使えますが、通常の編集はVNLEで行い、再度エクスポートしてください。

JSONのご紹介 · 学習ガイド:コンテンツをゲームに組み込む

編集用プロジェクトとゲーム用エクスポートは用途が異なります。内容はVNLEで編集し、改めてエクスポートします。以下は付属プロジェクトのデータを抜粋したものです。

エクスポートフォルダ

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 files

この作例では、IDと読みやすい名前を対応付けるguide-map.jsonを追加しています。これは作例専用で、すべてのプロジェクトに自動生成されるものではありません。通常のエクスポートでは、開始地点はstory-index.json、各種項目はstory.jsonで確認します。

会話を始める

開始地点はflowRefとentryRefで表されます。どちらも表示名ではなくIDです。execution.entries[entryRef].nodeRefを取得すると、実行を始めるノードが分かります。以下は作例で実際に使用しているIDです。

{
  "flowRef": "1f69a7b6-1bdc-4dff-b8ee-9b2819b35168",
  "entryRef": "5e6b2e12-1ac1-4c46-8221-1a051e87370a"
}

会話データを読む

{
  "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はノードの種類を示します。speakerRefはcontent.characters内のキャラクター、text.textRefはcontent.texts内の文章を参照します。continuationにはContinueを押したときの進行先が記載されています。

文章と言語を読み出す

{
  "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
}

content.translations[language][text ID].messageがあればそれを使い、なければsourceMessageを使います。テキストセグメントは表示する文章、プレースホルダーセグメントはノードのバインディングから取得する値です。言語はゲームの設定として扱い、変更しても進行状況は変えません。

名前とポートレートを表示する

{
  "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": {}
}

nameTextRefは他の文章と同じ方法で読み出します。画像は選択した感情のポートレートを優先し、なければdefaultPortraitRefを使います。content.assets[portrait ID].relativePathでファイルを探してください。assetsはstory.jsonと一緒にコピーします。

すべてのフィールドを調べる

完全なフィールド参照 · JSON スキーマ · story.json