公開・エクスポートとバンドル
短いバージョン
ワールドが完成したら、どうやって他のプレイヤーに届けるか? シンプル:エディタ上部のバーで「公開」を押す。
「公開」をクリックする前に、エディタの 概要(Overview) セクションで以下が準備できているか確認してください。
- 名前と説明 — 名前は最大200文字、説明は最大10,000文字。良い名前はあなたの店舗、良い説明はあなたのガイドです。
- カバー画像 — コミュニティリストでプレイヤーが最初に目にするもの。カバーのないワールドはポスターのない映画館 — 中で何が上映中か誰も分かりません。
- タグ — 最大10個。タグはプレイヤーがワールドを発見する助けに:「fantasy」「romance」「battle royale」「multiplayer」など。
準備ができたらワールドを保存し、エディタ上部のバーで Publish ボタン(Save の隣)をクリックします。公開ダイアログで コンテンツレーティング(GeneralまたはSensitive Content)、可視性、編集権限を設定し、利用規約に同意して公開。あなたのワールドが Discover に登場し、他のユーザーが検索、閲覧、直接プレイ、フォーク改変できるようになります。
プラットフォームの公開システムを使いたくない? ワールドをJSONファイルとしてエクスポートし、友達に直接送れます。あるいはワールドの一部 — 戦闘システムのような — を Bundle としてエクスポートし、他のクリエイターと共有することも。
詳細バージョン
公開ステータス
ワールドには可視性を制御する信号機のような3状態があります。
| ステータス | 意味 | 他者に見える? |
|---|---|---|
draft | 制作中、自分だけが見える | いいえ |
published | 公開中、Discoverページに登場 | はい |
unpublished | 公開していたが取り下げた | いいえ |
下書きは公開可能、公開は取り下げ可能、取り下げは再公開または下書きに戻せます。ステップを飛ばせません(例:下書きから直接「取り下げ」へは行けない)。
ワールドを取り下げると、システムは自動的にライブラリに追加した全プレイヤーに通知します:「このワールドは取り下げられました」。再公開時はまた通知:「戻ってきました」。なかなか気が利いています。
公開設定
以下の設定はエディタの Publish ボタンから開く 公開ダイアログ で設定されます — 概要フォーム自体ではありません。
コンテンツレーティング(ageRating)
UIには2階層あります。
| UIラベル | 格納値 | 意味 |
|---|---|---|
| General | all | 明示的なアダルトコンテンツなし — 誰にも見える |
| Sensitive Content | r18 | アダルト/センシティブコンテンツ、18+ |
Sensitive Content を選ぶと isNsfw が自動的に true になります — 手動でセットする必要はありません。何も選ばない場合、公開はデフォルトで General + 非NSFW になります。システムが一貫性を扱うので、レーティングがミスマッチになることはありません。
レガシー注記: 古いワールドとデータベースは
r18g(重度の制限)も認識します。公開UIではもう公開されていません — 新規ワールドは18+素材には Sensitive Content を選んでください。
可視性(visibility)
public — 公開、誰もがDiscoverで見える
followers — フォロワー限定、限定テストやサークル共有に良い公開時に指定がなければデフォルトで public。
編集を許可(allowEdit)
デフォルトは true。オンの時、他のクリエイターがあなたのワールドをフォークして編集できます。オフだとあなただけが自分のワールドをフォークできます。
オープンソース vs クローズドソースのような感じ:allowEdit オンだと、あなたのワールドが興味深いバリエーションを生むかも、オフだとコンテンツはプレイされても改変されません。あなた次第です。
マルチプレイヤーを許可(allowMultiplayer)
デフォルトは false。このフラグはプラットフォームに、ワールドがマルチプレイヤー向けに設計されているかを伝えます。ワールド定義のスキーマで multiplayerSettings.availability を enabled にセットすると、システムもこの値を自動推論します。具体的なマルチプレイヤー動作設定は下の「マルチプレイヤー設定」にあります。
タグ(tags)
最大10タグ。Discoverページの検索・フィルタに非常に有用 — プラットフォームは公開ワールド全体のタグ使用頻度を追跡しており、プレイヤーはタグで閲覧・検索できます。オートコンプリートが入力中に人気タグを提案します。
カバー画像(thumbnailUrl)
エディタの 概要 セクションでアップロード。Discoverカード、検索結果、マイライブラリ で使用されます。カバーのないワールドはほぼクリックされません。追加を強く推奨します。
フォーク
ワールドが公開され allowEdit が true のとき、他ユーザーは「フォーク」できます。
- フォーク者所有の完全コピーが作成される
- 名前は自動インクリメント — 元が「Dark Forest」なら、あなたのコピーは「Dark Forest (1)」、もう一度フォークすれば「Dark Forest (2)」
- コピーは下書きとして始まり自動公開はされない
- 元のすべてのタグ、説明、カバー、スキーマ、コンテンツを保持
- 元のワールドの
downloadCountが1増加 - コピーの
sourceWorldIdは元へのトレーサビリティのため逆参照 - 参照されるアセット(画像など)もコピーされる
バンドルシステム
バンドルとは? こんな例えです:あなたは2週間かけて磨かれた戦闘システム — 変数、ルール、UIコンポーネント、効果音、フルパッケージ — を構築しました。友達もワールドを作っており戦闘システムを必要としています。彼らにワールド全体を渡す必要はなく、戦闘関連の部分だけを バンドル して送れます。
バンドルとはワールドの選択された部分を含む「コンポーネントパック」です。
バンドルに含まれるもの:
| セクション | 含まれる内容 | 必須? |
|---|---|---|
| 名前と説明 | バンドル名、説明、タグ、作成日 | はい |
| エントリ | キャラクタープロフィール、プロット、スタイル指示、伝承 | はい(空でも可) |
| 変数 | HP、ゴールド、好感度、フラグ、JSON状態 | はい(空でも可) |
| ルール | トリガー条件とアクション | はい(空でも可) |
| カスタムUI | TSXコンポーネント | はい(空でも可) |
| オーディオトラック | BGM、SFX、ambientトラック | はい(空でも可) |
| ルートコンポーネント | フルマルチファイルTSXアプリ(index.tsxと同階層ファイル)。これを含めるとバンドルが「フルテンプレート」にアップグレードされる | オプション |
| 整理情報 | カスタムタグ定義、エントリフォルダ構造 | オプション |
バンドルの2つの使い方
- 部分バンドル — エントリ/変数/ルール/audioTracksのみ、
rootComponentなし。既存ワールドに マージ。戦闘システムやキャラクターカードの共有に最適。 - フルテンプレート — 同じものに加えて
rootComponent。新しいワールドへ フォーク。「VN骨格」「カードバトルシェル」などに最適 — インポートする人はあなたのテンプレート上に新しいワールドを開始。
7つの公式リソーステンプレートはまさにこの方式で動いています。
「モジュール」と考えてください — 別のワールドに差し込むと動きます。
バンドルの作成
エディタの上部メニューで Export Bundle をクリック。4つのチェック可能なセクションがあります。
- エントリ — エントリ(キャラクタープロフィール、プロット、スタイル指示など)
- 変数 — 変数(HP、ゴールド、好感度など)
- ルール — ルール(トリガー条件+アクション)
- カスタムUI — TSXコンポーネント配列
気の利いた機能:ルールをチェックすると、システムが依存変数を自動でハイライトし「推奨」として印を付けるので、うっかり外すことがありません。
2つは 自動で含まれます(チェックボックスなし)。
- オーディオトラック(
audioTracks) — 全リストが常にバンドルされる。 - ルートコンポーネント(
rootComponent) — ワールドにあれば自動で添付。ルートコンポーネントを含めるとバンドルが「フルテンプレート」にアップグレードされ — 既存ワールドへのマージではなく、インポーターがあなたのテンプレート上の新しいワールドへフォークできるようになります。
インポート時の衝突処理
バンドルを既存ワールドにインポートする際、コンテンツは マージ され上書きされません。具体的な衝突解決:
- 同じ変数ID:スキップ、既存変数を使用
- 同じ変数名で異なるID:サフィックス付きで新規変数を作成(例
HP (1)) - エントリ:常に新規UUIDを生成、既存エントリリストに追加
- ルールとコンポーネント:同様 — 新規ID作成、追加
ルールとコンポーネントで参照される変数IDはインポート後の関係保持のため自動再マッピングされます。これは重要 — 戦闘システムをインポートしてルールの「HP」変数が一致しないと、インポートが無意味になります。
バンドルをハブに公開
保存されたバンドルはデフォルトでプライベートです。公開後、他のクリエイターはDiscoverページで検索・プレビュー・インストールできます。
バンドルを .bundle.json ファイルとしてダウンロードして友達に送り手動インポートしてもらうこともできます。
フルワールドエクスポート
バンドルの「部分エクスポート」を超えて、完全なワールドJSONもエクスポートできます。エディタの 概要 セクション、または マイライブラリ → マイプロジェクト から利用できます。エクスポートされたファイルには WorldDefinition のすべてが含まれます。
- すべてのエントリ(
entries)とエントリフォルダ構造(entryFolders) - すべての変数(
variables) - すべてのルール(
rules)とコンパイル済みリアクション(reactions) - ルートコンポーネント(
rootComponent) — ワールドUIエントリ全体、index.tsxと同階層ファイル含む - カスタムUI TSXコンポーネント(
customUI) - オーディオトラック(
audioTracks)、BGMプレイリスト(bgmPlaylist)、条件付きBGM(conditionalBGM) - 空間システム(
systems)とシーン(scenes) - エディタモード(
editorMode: "simple" | "advanced") - UIブループリント(
uiBlueprint) - ワールド設定(
settings) — 温度、トークン制限、レイアウトモード、スキャン深度など - マルチプレイヤー設定(
multiplayerSettings)
注意:共有バリアントグループ化キー(languageGroupId)はワールドレコード自体に格納され(ハブマッチング用)、WorldDefinition 内ではないので、エクスポートされたJSONには現れません。
フルエクスポートの用途:
- バックアップ — 定期的にエクスポートしてローカルコピーに。データはクラウドで安全ですが、ローカルバックアップは安心感があります。
- バージョン管理 — gitリポジトリにコミットして変更追跡。主要リビジョン前に手動セーブポイントとしてエクスポート。
- コラボレーション — JSONを協力者に送ると、彼らが自分のアカウントでインポートして作業できます。
- マイグレーション — 将来のTauriオフライン版は同じ形式を使うので、移行はシームレスです。
インポート時、システムは自動でYuminaワールドJSON、SillyTavernキャラクターカード(PNG埋め込みV2カード含む)、バンドルJSONを認識し、それぞれ別処理します。形式を選ぶ必要はなく、ドラッグ&ドロップするだけです。
多言語サポート:2つのシステム
Yuminaには 目的の完全に異なる2つの多言語メカニズム があります。用途に合うものを選んでください。
| メカニズム | 翻訳されるもの | 使うタイミング |
|---|---|---|
| Hub Translations | Discover/プロフィールに表示される「店舗情報」のみ — タイトル、説明、カバー画像、ギャラリー、タグ | ゲーム内コンテンツは単一言語だが、グローバルプレイヤーに閲覧時のローカライズタイトル・説明を見せたい |
| バリアント | ワールド全体のコピーを完全に翻訳 — エントリ、ルール、コンポーネントテキスト、すべて | プレイヤーに自分の言語でプレイさせ、AIもその言語で返事させたい |
Hub Translations
エディタ左ナビの Hub Translations にあります。
セットアップ方法:
- Hub Translations セクションに行く
- Add Language をクリック
- ドロップダウンから対象言語を選択(10言語サポート)
- 現在のワールドの名前、説明、カバー、ギャラリー、タグが出発点としてコピーされる
- UI内で各フィールドを直接編集 — 対象言語へ翻訳
- 言語固有のカバー画像をアップロードしてもよい
- 保存 — 翻訳はワールドの一部として保存され、別ファイルは生成されない
プレイヤーがDiscoverページを閲覧すると、Yuminaは自動的に彼らのUI言語に最適な翻訳を選びます。プレイヤーがゲーム内で見るコンテンツはワールドの元言語のまま — Hub Translationsはゲームプレイテキストに影響しません。
バリアント
ゲーム内コンテンツも翻訳したいなら、バリアント システムが必要です — エディタ上部のバリアントタブバーで新規バリアントを作成し、対象言語を選択します。エディタは新言語でワールドのフルコピーを作成し、それを翻訳します。
エンジンはバリアントを「同じワールドの異なる言語版」として認識します。ワールド詳細ページでプレイヤーはワンクリックで切り替えられます。コミュニティリストではバリアントグループは単一ワールドとしてカウントされ、ビュー統計は統合されます。
サポート言語
両メカニズムは同じ10言語をサポートします。
| コード | 言語 |
|---|---|
en | English |
zh | 中文 |
ja | 日本語 |
ko | 한국어 |
es | Español |
fr | Français |
de | Deutsch |
pt | Português |
ru | Русский |
ar | العربية |
どちらを?
- 海外プレイヤー向けに 見栄えの良いカバーと説明 が欲しいだけ → Hub Translations
- 完全にローカライズされたゲームプレイ が欲しい → バリアント
- 2つは 組み合わせ可能:バリアントA(中国語版)に中国語+英語Hub Translations、バリアントB(英語版)に英語+日本語Hub Translations — 合計3つのオーディエンスをカバー
マルチプレイヤー設定(MultiplayerSettings)
ワールドがマルチプレイヤーをサポートする場合、エディタで以下を設定します。これらはオプション — 設定しなければマルチプレイヤーはデフォルトで無効です。
| 設定 | オプション | デフォルト | 目的 |
|---|---|---|---|
| Availability | Disabled / Enabled | Disabled | マルチプレイヤーの主スイッチ |
| Chat policy | Free / Active speaker only | Free | 誰がいつメッセージを送れるか |
| AI trigger mode | Instant / Timer / Round / Manual | Manual | AIが応答するタイミング |
| Round timer | 5-120秒 | 15 | カウントダウン時間(timerモード) |
| Author notes | 自由テキスト | 空 | ルームホストに見える指示 |
詳細:
availability — 主スイッチ。disabled = シングルプレイヤーのみ。enabled = マルチプレイヤー用ルーム作成可。ワールドのデータベース層でも allowMultiplayer を true にすることを忘れずに — エディタに別トグルがあります。
defaultChatPolicy — チャットポリシー。
free:自由形式、誰でもいつでも送信可、グループチャットのよう。カジュアル/ソーシャル系ワールドに最適。active_speaker_only:ターン制、一度に1人だけ話せる、ボードゲームのよう。TRPGテーブルトークセッションに最適。
defaultAiTriggerMode — AIはいつ応答するか? 異なるペーシングのための4モード。
instant:誰かが話すと即座にAIが応答。最速ペース、対話駆動ワールド向き。timer:カウントダウンタイマーが切れたときAIが応答(defaultRoundTimerSeconds使用)。他者が割り込む余地を残す。round:全員がメッセージを送った後にAIが応答。TRPGでDMが全員のターン後に話すように — すべての行動が考慮される。manual:ホストが手動でAIを起動。最も柔軟、ホストがペースを完全制御。
defaultRoundTimerSeconds — タイマー時間、5–120秒、デフォルト15。主に timer モードで有効。
authorNotes — ルームを作る人に見えるメモ。例「2–4人推奨」「ホストは開始前にルールを読んでください」「各プレイヤーは開始前にクラスを選択」。AIには送られない — 純粋に人間可読の指示ガイド。
これらはすべて デフォルト値 です — ルームホストが実際のセッション用に調整できます。あなたが設定するのは「推奨設定」です。
実例
例1:公開前チェックリスト
ワールドが完成し公開準備完了。クリックを急がず、まずこのチェックリストを通してください。
[ ] 名前 — 魅力的? 一目でどんなワールドか分かる?
[ ] 説明 — 書いた? 空のままにしない。プレイヤーが体験することを少なくとも2文で
[ ] カバー画像 — アップロード済み? Discoverでサムネイルサイズになってもくっきり見える?
[ ] タグ — 関連タグを3–10追加した? プレイヤーが検索しそうなものを考える
[ ] コンテンツレーティング — アダルト/センシティブ素材(18+)には **Sensitive Content**、それ以外は **General**。間違えないで — 誤ラベルはガイドライン違反
[ ] 可視性 — 誰もに見てほしいなら public。限定テストならフォロワー限定
[ ] allowEdit — 他者にフォーク改変させたいなら開く。元作品を守りたいなら閉じる
[ ] Greeting — プレイヤーが最初に見るメッセージは何? ちゃんと設定されている? 第一印象は重要
[ ] 自己テスト — 自分で最初から最後までプレイした? 変数は機能する? ルールは正しくトリガーされる?確認したらエディタ上部の Save をクリックし、隣の Publish ボタンをクリック、公開ダイアログのフローを完了します。
ワールドが公開されました。Discoverでどう見えるか確認に行きましょう。
例2:戦闘システムバンドルを作成してコミュニティに共有
RPGワールド内にターン制戦闘システムを構築したとします。次を含みます。
- 変数:
HP(数値、0–100、ステータス)、MP(数値、0–50、リソース)、ATK、DEF、battlePhase(文字列、フラグ) - ルール:
HPが0になったら死亡決済をトリガー、MPがターン開始時に5自然回復 - コンポーネント:HP用ステータスバー1つ、MP用ステータスバー1つ
- オーディオ:バトルBGM(ループ)、ヒット効果音(sfx)
パッケージング手順:
- エディタ上部メニューで Export Bundle をクリック
- 「Turn-Based Combat System v1.0」と命名、使用方法を明確に説明
- 5つの変数をチェック — ルールをチェックするとシステムが関連変数をハイライト
- 2つのルールと2つのコンポーネントをチェック
- オーディオトラックをチェック
- タグ追加:
combat、rpg、turn-based - エクスポートして保存
エクスポートされたバンドルファイルには選択した全コンテンツ — エントリ、変数、ルール、UIコンポーネント、オーディオトラック — が単一JSONファイルとしてパッケージされています。
誰かがバンドルファイルを得たら、エディタ上部メニューで Import Bundle をクリックし、どのワールドにインストールするか選べば、戦闘システムが使えるようになります。変数名の衝突は自動処理されます。
例3:マルチプレイヤー設定 — 4人協力RPG
4人ダンジョン冒険ワールドを作りました。各人がクラス(戦士、魔法使い、盗賊、ヒーラー)を演じ、交代で行動し、全員が行動した後にAIがDMとしてストーリーを進めます。
エディタで設定:
- Availability:Enabled
- Chat policy:Active speaker only
- AI trigger mode:Round
- Round timer:60秒
- Author notes:「Recommended 4 players, each choosing a class: warrior, mage, rogue, or healer. Each round, every player describes their action, then the AI advances the story once all players have acted. 60-second timer — if someone is idle too long, the AI moves on anyway.」
なぜこれらの設定か?
active_speaker_only— ターン制発言で、4人が同時にタイプしてAIが誰に応答すべきか混乱するのを防ぐ。TRPGセッションなので一人ずつ。round— AIが応答前に全員を待つので、すべてのプレイヤーの行動が考慮される。「DMがもう進んじゃった」で誰も飛ばされない。60秒タイマー— 戦略を考える時間は十分、引きずる程ではない。誰かが飲み物を取りに行ったらAIは60秒後に進んで他の人を縛りつけない。authorNotes— ホスト向け「マニュアル」、セッションの運営方法と何をプレイヤーに伝えるかを知らせる。
ワールドレベルで allowMultiplayer を true にするのも忘れずに — そうしないと、multiplayerSettingsが完璧でもプラットフォームはマルチプレイヤーワールドとして表示しません。
