Roblox × Story OS
物語から、Robloxのストーリーゲームを。
BunChoのStory OSで書いた物語を、NPCの会話・クエスト・分岐・結末つきのRobloxのプロジェクトにして書き出します。ワールドを作るのはRoblox Studio、物語の骨組みと会話はBunCho。長い物語の構造、キャラの一貫性、分岐の整合性で勝負します。
例文から公開まで
- Story OSの「新しいシリーズ」に一文を入れると、AIが筋・人物・場面を作ります(クレジットを使います)。用意したテンプレートから始めることもできます。
- 「ゲーム」タブで選択肢とフラグ(鍵を持っている、暗号を解いた…)を足します。行き止まり・たどり着けない場面・立たないフラグはその場で見つかります。
- Story Testsに通ると「Robloxに書き出す」が押せます。Rojoのプロジェクト・.rbxmx・プラグイン用の.jsonが入ったzipです。
- Roblox StudioでBunChoプラグイン(またはRojo)から取り込むと、NPC・クエスト・会話のUIが配置されます。
- ワールドを作り込み、複数人でテストして、Robloxに公開します。
書き出されるもの
下は、この例文に当たるテンプレート『廃校からの脱出』を実際に書き出した結果です(書き換えていません)。
物語の構造(分岐と結末)
15の場面と5つの結末。矢印は先へ進む選択肢(教室に戻るなどの戻り道10本は省略)。
三人そろって / 脱出成功 / いたずらの真相 / 裏口の合言葉 / 朝を待つ
NPC 3人(性格・口調・秘密・行動)
ハル
クラス委員
- 性格
- 仕切りたがりで強がり。でも責任感は誰より強い。
- 口調
- はきはきした命令口調。
- 目的
- 全員を連れて帰る
- 秘密
- 自分が書いたいたずらのメモのせいで、みんなが閉じ込められたと思いこんでいる。
- セリフの例
- “落ち着け。5分で出口を見つけるぞ。”
ミオ
図書委員
- 性格
- 物静かで観察力が鋭い。人に頼るのが苦手。
- 口調
- 小声で、短く正確に話す。
- 目的
- 暗号を解く
- 秘密
- 去年もここに閉じ込められかけ、黒板の暗号を残したのは自分。
- セリフの例
- “黒板に、数字の暗号がある。”
ソラ
陸上部
- 性格
- 明るくておしゃべり。暗い所が苦手。
- 口調
- 元気なタメ口。
- 目的
- 暗くなる前に家に帰る
- 秘密
- 用務員さんのメモをポケットに入れたまま忘れていた。
- セリフの例
- “暗くなる前に帰りたいよ……”
行動: 自分が話す場面の場所へ移動し、それ以外の場所で話しかけられると直近のセリフで答えます。秘密はプレイヤーには表示されない開発者向けのメモです。
クエスト(鍵を探す・暗号を解く・扉を開ける)
選択肢の条件になっているフラグが、そのまま目標の一覧になります。制限時間は300秒、時間切れで「朝を待つ」の結末へ。
- 913 の棚を調べる
- 暗号の番号でロッカーを開ける
- メモを預かる
- ミオを信じる
- 鍵で正面の扉を開ける
- 裏口で合言葉を言う
ゲーム内のUI
- 会話ウィンドウ: 話し手の名前と1行ずつのセリフ、「次へ」
- 選択肢: 複数人なら投票(多数決・時間切れあり)
- 目標の表示: チェックつきの一覧と「次の場所」
- タイマー: 残り30秒で赤く
- 結末: 見つけた結末の数(5つ中)
黒板の数字は、本の分類番号だと思う。
913 の棚を調べる400 の棚を調べる教室に戻るUIはコードで組み立てるので、画像の素材は要りません。色とフォントはStoryClientの先頭のTHEMEで変えられます。
Luauのコード
データ(Story・Strings)と、動く部分(状態機械・サーバー・UI)に分かれています。選択はサーバーが毎回たしかめます(サーバー権威)。
-- src/shared/Story.luau
["n006"] = {
Title = "N.n006.title",
Place = "science",
Ending = false,
Events = { "lights_flicker" },
Lines = {
{ Key = "N.n006.1" },
{ Key = "N.n006.2", Npc = "haru" },
},
Choices = {
{ Id = "c013", Key = "C.c013", To = "n007", Requires = { "cipher" }, Sets = { "has_key" } },
{ Id = "c014", Key = "C.c014", To = "n002", Requires = {}, Sets = {} },
},
-- src/shared/StoryRuntime.luau
-- Applies a choice. Returns false (and a reason) when the choice is not open right now.
function StoryRuntime.choose(story, state, choiceId: string): (boolean, string?)
local c = StoryRuntime.findChoice(story, state, choiceId)
if c == nil then
return false, "choice_not_available"
end
for _, f in c.Sets do
local neg, name = negated(f)
state.flags[name] = if neg then nil else true
end
StoryRuntime.jump(story, state, c.To)
return true, nil
end
-- Quest objectives with their done state (flags that some choice requires)
function StoryRuntime.objectives(story, state)
-- src/server/StoryServer.server.luau
local function onChoose(player: Player, choiceId: string)
local session = sessions[sessionKey(player)]
if session == nil or not session.open or session.state.ended then
return
end
if Runtime.findChoice(Story, session.state, choiceId) == nil then
return
end
local voters = #members(session)
if Config.ChoiceMode ~= "vote" or voters <= 1 then
セーブ
DataStoreは任意(Config.UseDataStore)。見つけた結末と、ひとりプレイの続きを保存します。Studioで試すときは「APIサービスへのStudioアクセス」を有効にします。
6言語の翻訳表
日本語・英語・スペイン語・ポルトガル語・繁体字・簡体字。プレイヤーのRobloxの言語で表示し、無い言語は元の言語で出します。localization/BunChoStory.csvはRobloxの翻訳ツールにも使えます。
zipの中身
- BunChoStory.rbxmx
- NPCS.md
- README.md
- default.project.json
- localization/BunChoStory.csv
- src/client/StoryClient.client.luau
- src/server/StageSetup.server.luau
- src/server/StoryServer.server.luau
- src/shared/Config.luau
- src/shared/Localize.luau
- src/shared/StageBuilder.luau
- src/shared/Story.luau
- src/shared/StoryRuntime.luau
- src/shared/Strings.luau
- story-tests.json
- story.pack.json
Studioプラグインで配置する
- プラグインを入れる(Creator Storeで公開予定。今は下のファイルをStudioのPluginsフォルダへ)
- 「Plugins → BunCho → Story Pack」を開き、書き出した.jsonを選ぶか、https のURLを貼る
- 「Build stage now」で部屋・光る調べる場所・NPCがパーツで並ぶ(編集できます)
- 「Play」で動作を確かめる。複数人は「テスト → クライアントとサーバー」
Rojoを使う人は、zipを展開して rojo serve → Studioで接続。.rbxmxをドラッグして入れる方法もあります(READMEに手順)。
公開
Robloxに公開して収益化に挑戦できる(収益はRobloxの規約・DevExの条件による)。
BunChoで作る理由
- キャラの性格がぶれない人物の性格・口調・一人称・秘密を正典(Character Bible)に持ち、Story Testsが口調のずれを見つけます。NPCのセリフはその正典から書き出します。
- 伏線が回収される張った伏線と回収の場面を結んで管理します。結末までに回収されない伏線はテストで分かります。
- 選択肢と結末の整合性を保証行き止まり・たどり着けない場面・立たないフラグ・行き先の無い選択肢があると書き出せません。すべての結末にたどり着けることを機械で確かめてから出します。
年齢区分を意識した作り
- ゲームの中で生成AIは動きません。文章はすべて書き出す時点で決まり、検査済みです(自由入力のAIチャットは入れません)。
- こわい演出は明滅・暗転・影・ささやきの字幕・小さな揺れだけ。血やけが、大きな音の驚かしは使いません(Config.ScareIntensity = 0 で止められます)。
- Robloxの成熟度・コンプライアンスの質問票は、ご自身のゲームに合わせて正しく答えてください。
Roblox Studioで自分ですること
- ワールドの作り込み(舞台はただの箱です。自分のマップを使うときは、パーツにタグ BunChoStoryTrigger と属性 Place / Npc を付けます)
- 音・モデル・アニメーション(権利のあるものを)
- 複数人でのテスト、サムネイル・説明文・質問票、公開
テンプレート
廃校からの脱出
廃校に閉じ込められた 3 人の生徒が、5 分以内に脱出するミステリー。鍵を探し、暗号を解き、扉を開ける。結末は 5 つ。
5分の制限時間・NPC 3人・鍵/暗号/扉・結末5つ
灯りの消えた洋館
嵐の夜、古い洋館に閉じ込められた仲間たち。銀と金の鍵を探し、館に住む幽霊の少女の秘密に触れる。結末は 5 つ。
協力型・銀と金の鍵・こわい演出(全年齢)・結末5つ
料金
Robloxへの書き出しはBunChoのプランに含まれます。Studioプラグインとテンプレートは無料です。
FAQ
Roblox Studioの知識は要りますか?
取り込んで「Play」を押すまでは要りません。ワールドの作り込みや公開はRoblox Studioで行います。
ゲームの中でAIがプレイヤーと会話しますか?
しません。会話はすべて書き出す時点で決まった文章です。そのため年齢を問わないゲームにしやすい作りです。
ホラーゲームの作り方としても使えますか?
はい。協力型ホラーのテンプレートは、鍵を探す協力・結末5つ・全年齢向けのこわい演出つきです。
自分のマップに組み込めますか?
Config.BuildStage = false にして、パーツにタグ BunChoStoryTrigger と属性 Place(場所のid)か Npc(人物のid)を付ければ、そこが物語の入口になります。
Rojoは必須ですか?
いいえ。BunChoプラグインか、.rbxmxのドラッグでも入れられます。
記載の機能は、いまのBunChoで動いているものです。Roblox Studioでの画面の録画は準備中です。 English