了解。
ここでは Roblox を「数学教育OS」として使うためのテンプレートを、
ジャンル(例:方程式・図形・確率)と解法(例:代入法・面積分割・樹形図)を DataStore にマップとして保存できる構造でまとめるね。
あなたの思想(制度の外化・作る→選ぶ・公共性)をそのまま反映した
“数学教育OSテンプレ” になっている。
🧭 数学教育OSテンプレ(靖さん版)
全体構造(4層)
- 空間層:問題を選ぶ場所(Prompt)
- ロジック層:ジャンルと解法のマップを管理
- インターフェース層:選択UI・フィードバック
- 公共性層:学習ログ・進捗の共有
🏛️ Explorer 構造(テンプレ)
Workspace
└ MathStation
├ Part
└ ProximityPrompt
ActionText: "数学問題を選ぶ"
ObjectText: "Math Selector"
ReplicatedStorage
└ RemoteEvents
└ MathEvent
ServerScriptService
└ MathSystem
└ MathController.lua
ServerStorage
└ MathData
└ GenreSolutionMap.lua
StarterPlayer
└ StarterPlayerScripts
└ MathUIController.lua
📘 1|ジャンル×解法マップ(ServerStorage)
GenreSolutionMap.lua
-- 数学ジャンルと解法のマップ(教育OSの“制度データ”)
local MathMap = {
["一次方程式"] = {
Solutions = {"移項", "代入法", "比例式変形"},
Level = 1
},
["二次方程式"] = {
Solutions = {"因数分解", "平方完成", "解の公式"},
Level = 2
},
["図形の面積"] = {
Solutions = {"分割法", "合同変形", "相似利用"},
Level = 1
},
["確率"] = {
Solutions = {"樹形図", "場合分け", "積の法則"},
Level = 2
}
}
return MathMap
制度的意味:
- 「ジャンル=制度の領域」
- 「解法=制度の操作」
- 「Level=制度の難易度」
- 完全に外化された“数学OSの辞書”
📘 2|サーバー側(制度ロジック)
MathController.lua
local DataStoreService = game:GetService("DataStoreService")
local progressStore = DataStoreService:GetDataStore("MathProgress")
local MathMap = require(game.ServerStorage.MathData.GenreSolutionMap)
local prompt = workspace.MathStation.ProximityPrompt
local MathEvent = game.ReplicatedStorage.RemoteEvents.MathEvent
prompt.Triggered:Connect(function(player)
-- ランダムにジャンルを選ぶ(制度の“提示”)
local genres = {}
for genre, _ in pairs(MathMap) do
table.insert(genres, genre)
end
local selectedGenre = genres[math.random(#genres)]
-- 解法リストを取得
local solutions = MathMap[selectedGenre].Solutions
-- データストアに保存(学習履歴の制度化)
progressStore:SetAsync(player.UserId .. "_lastGenre", selectedGenre)
progressStore:SetAsync(player.UserId .. "_solutions", solutions)
-- クライアントへ通知(公共ログ)
MathEvent:FireClient(player, selectedGenre, solutions)
end)
制度的意味:
- Prompt=「数学問題を選ぶ」権限の外化
- MathMap=数学制度の辞書
- DataStore=学習履歴の制度化
- FireClient=個別性の提示(学習者に返す)
📘 3|クライアント側(UI・可視化)
MathUIController.lua
local MathEvent = game.ReplicatedStorage.RemoteEvents.MathEvent
MathEvent.OnClientEvent:Connect(function(genre, solutions)
local text = "ジャンル: " .. genre .. "\n解法: " .. table.concat(solutions, ", ")
game.StarterGui:SetCore("SendNotification", {
Title = "数学OS",
Text = text,
Duration = 5
})
end)
制度的意味:
- UI=制度の可視化
- 「ジャンル→解法」の関係が外化される
- 学習者が“選ぶ”前に制度を理解できる
📘 4|学習者が“解法を選ぶ”Prompt(作る→選ぶ)
追加の Prompt を置くと、
学習者が自分で解法を選ぶ制度が作れる。
Workspace
└ SolutionStation
├ Part
└ ProximityPrompt
ActionText: "解法を選ぶ"
ObjectText: "Solution Selector"
SolutionController.lua(サーバー)
local DataStoreService = game:GetService("DataStoreService")
local progressStore = DataStoreService:GetDataStore("MathProgress")
local prompt = workspace.SolutionStation.ProximityPrompt
prompt.Triggered:Connect(function(player)
local solutions = progressStore:GetAsync(player.UserId .. "_solutions")
if not solutions then return end
-- ランダムに解法を提示(または UI で選択させる)
local selected = solutions[math.random(#solutions)]
progressStore:SetAsync(player.UserId .. "_selectedSolution", selected)
print(player.Name .. " selected solution: " .. selected)
end)
制度的意味:
- Prompt=「解法を選ぶ」権限の外化
- DataStore=選択の記録
- 「作る→選ぶ」の完全な実装
🌱 このテンプレが実現する数学教育OS
| 教育OSの概念 | Robloxでの実装 |
|---|---|
| 数学ジャンルの外化 | MathMap(辞書) |
| 解法の外化 | Solutions 配列 |
| 選択の外化 | Prompt |
| 学習履歴の制度化 | DataStore |
| 公共性 | RemoteEvent |
| 個別性 | UI通知 |
| 作る→選ぶ | 解法選択 Prompt |
あなたの思想がそのまま数学教育に落ちている。
✨ 次に進められること
- このテンプレをブログ記事用に整形する
- ジャンルと解法をもっと体系化した“数学OS辞書”を作る
- 学習者が自分でジャンルを追加できる制度版を作る
- 数学OSの制度図(ジャンル→解法→選択→履歴)を描く
どれを深めるのが今の流れに合いそうかな。
了解。
ここでは、前に作った「ジャンル × 解法」の辞書を、数学教育OSとして本当に使える“体系化された辞書”に進化させるね。
あなたの思想に合わせて、
・ジャンル=制度の領域
・解法=制度の操作
・前提スキル=制度の依存関係
・難易度=制度のレベル
・典型構造=制度のパターン
として整理する。
Roblox の DataStore にそのまま入れられる構造で作る。
🏛️ 数学OS辞書(体系化版)
以下は 「ジャンル → サブジャンル → 解法 → 前提スキル → 典型構造」 の5層構造。
教育OSとして扱うための“制度辞書”になっている。
📘 1|代数(Algebra)
["代数"] = {
Level = 1,
SubGenres = {
["一次方程式"] = {
Solutions = {"移項", "代入法", "比例式変形"},
Prerequisites = {"四則演算", "文字式の扱い"},
Patterns = {"ax + b = c", "比例式 a/b = c/d"}
},
["二次方程式"] = {
Solutions = {"因数分解", "平方完成", "解の公式"},
Prerequisites = {"一次方程式", "平方の展開"},
Patterns = {"ax^2 + bx + c = 0"}
},
["連立方程式"] = {
Solutions = {"代入法", "加減法", "グラフ交点"},
Prerequisites = {"一次方程式"},
Patterns = {"ax + by = c", "2本の直線の交点"}
}
}
}
📘 2|図形(Geometry)
["図形"] = {
Level = 1,
SubGenres = {
["面積"] = {
Solutions = {"分割法", "合同変形", "相似利用"},
Prerequisites = {"基本図形の性質"},
Patterns = {"三角形の面積", "複合図形の分割"}
},
["角度"] = {
Solutions = {"同位角・錯角", "三角形の内角", "円周角"},
Prerequisites = {"平行線の性質"},
Patterns = {"円周角の定理", "多角形の内角和"}
},
["相似"] = {
Solutions = {"相似比→長さ", "相似比→面積", "三角形の相似条件"},
Prerequisites = {"比例", "三角形の性質"},
Patterns = {"AA相似", "辺の比から相似判定"}
}
}
}
📘 3|関数(Functions)
["関数"] = {
Level = 2,
SubGenres = {
["一次関数"] = {
Solutions = {"傾き計算", "切片計算", "グラフ交点"},
Prerequisites = {"比例・反比例"},
Patterns = {"y = ax + b"}
},
["二次関数"] = {
Solutions = {"平方完成", "頂点の求め方", "グラフの変換"},
Prerequisites = {"二次方程式"},
Patterns = {"y = ax^2 + bx + c"}
},
["指数・対数"] = {
Solutions = {"指数法則", "対数変換", "グラフの性質"},
Prerequisites = {"累乗", "関数の基本"},
Patterns = {"a^x", "log_a x"}
}
}
}
📘 4|確率(Probability)
["確率"] = {
Level = 2,
SubGenres = {
["基本確率"] = {
Solutions = {"場合の数", "積の法則", "和の法則"},
Prerequisites = {"集合", "順列・組合せ"},
Patterns = {"サイコロ", "カード", "玉の取り出し"}
},
["条件付き確率"] = {
Solutions = {"樹形図", "ベイズ更新", "条件分岐"},
Prerequisites = {"基本確率"},
Patterns = {"P(A|B)", "条件付きの枝分かれ"}
}
}
}
📘 5|数列(Sequences)
["数列"] = {
Level = 2,
SubGenres = {
["等差数列"] = {
Solutions = {"一般項", "和の公式", "漸化式"},
Prerequisites = {"一次関数"},
Patterns = {"a_n = a_1 + (n-1)d"}
},
["等比数列"] = {
Solutions = {"一般項", "和の公式", "指数変換"},
Prerequisites = {"指数法則"},
Patterns = {"a_n = a_1 r^(n-1)"}
}
}
}
📘 6|データ(Statistics)
["データ"] = {
Level = 1,
SubGenres = {
["平均・中央値"] = {
Solutions = {"平均計算", "中央値の求め方"},
Prerequisites = {"四則演算"},
Patterns = {"データの並べ替え"}
},
["散布図・相関"] = {
Solutions = {"相関係数", "回帰直線"},
Prerequisites = {"一次関数"},
Patterns = {"散布図→直線近似"}
}
}
}
🧩 数学OS辞書の構造(Roblox DataStore 用)
最終的に Roblox で扱いやすい形にするとこうなる:
local MathOS = {
["代数"] = { ... },
["図形"] = { ... },
["関数"] = { ... },
["確率"] = { ... },
["数列"] = { ... },
["データ"] = { ... }
}
return MathOS
🌱 あなたの思想との接続
この辞書は完全にあなたの教育OS思想と一致している。
- ジャンル=制度の領域
- サブジャンル=制度の細分化
- 解法=制度の操作
- 前提スキル=制度の依存関係
- 典型構造=制度のパターン
つまり、数学という巨大な制度を 外化 → 分解 → 再構成 したもの。
Roblox の DataStore に入れれば、
学習者が「制度を選ぶ」「制度を編集する」ことができる。
✨ 次に進められること
次はどれを作る?
- この辞書を使った「数学問題生成OS」
- 学習者がジャンルを追加できる“制度編集UI”
- Roblox 内でジャンル→解法→問題の流れを可視化する Prompt システム
- ブログ用にこの辞書を図式化した記事
どれでも一緒に深められるよ。
ここからが本番だね。
いま作った 数学OS辞書(ジャンル→サブジャンル→解法→前提→典型構造) を使って、
Roblox 上で 「数学問題生成OS」 を構築するテンプレートをまとめるよ。
これは単なる問題生成ではなく、
数学という制度を外化し、学習者が“選ぶ・編集する・交渉する”OS として動く仕組み。
あなたの思想に完全に沿った構造になっている。
🏛️ 数学問題生成OS(あなた版)
MathOS 辞書 → 問題生成 → 解法提示 → 学習ログ → 公共性の可視化
1|全体アーキテクチャ(OS構造)
Workspace
└ MathStation(Prompt:問題生成)
└ SolutionStation(Prompt:解法選択)
ServerStorage
└ MathOS.lua(ジャンル辞書)
└ ProblemTemplates.lua(問題テンプレ)
ServerScriptService
└ MathProblemSystem
├ ProblemGenerator.lua
├ SolutionSelector.lua
└ ProgressLogger.lua
ReplicatedStorage
└ RemoteEvents
├ ProblemGenerated
└ SolutionSelected
StarterPlayer
└ StarterPlayerScripts
└ MathUIController.lua
2|MathOS辞書(ジャンル→解法→典型構造)
すでに作った辞書をそのまま使う:
local MathOS = {
["代数"] = {
Level = 1,
SubGenres = {
["一次方程式"] = {
Solutions = {"移項", "代入法", "比例式変形"},
Prerequisites = {"四則演算", "文字式"},
Patterns = {"ax + b = c"}
},
...
}
},
...
}
return MathOS
3|問題テンプレ(典型構造→具体問題)
典型構造(Pattern)を具体的な問題に変換するテンプレを作る。
ProblemTemplates.lua
local Templates = {}
Templates["ax + b = c"] = function()
local a = math.random(1, 9)
local b = math.random(1, 9)
local c = math.random(1, 20)
return {
Text = string.format("%dx + %d = %d を解け", a, b, c),
Answer = (c - b) / a
}
end
Templates["三角形の面積"] = function()
local base = math.random(3, 10)
local height = math.random(3, 10)
return {
Text = string.format("底辺 %d、高さ %d の三角形の面積を求めよ", base, height),
Answer = base * height / 2
}
end
return Templates
ポイント
- Pattern をキーにして関数化
- 典型構造 → 具体問題
- これが「数学OSの問題生成エンジン」
4|問題生成ロジック(サーバー側)
ProblemGenerator.lua
local MathOS = require(game.ServerStorage.MathOS)
local Templates = require(game.ServerStorage.ProblemTemplates)
local ProblemEvent = game.ReplicatedStorage.RemoteEvents.ProblemGenerated
local prompt = workspace.MathStation.ProximityPrompt
prompt.Triggered:Connect(function(player)
-- ① ジャンルをランダム選択
local genres = {}
for genre, _ in pairs(MathOS) do
table.insert(genres, genre)
end
local selectedGenre = genres[math.random(#genres)]
-- ② サブジャンルを選択
local subGenres = MathOS[selectedGenre].SubGenres
local keys = {}
for k, _ in pairs(subGenres) do
table.insert(keys, k)
end
local selectedSub = keys[math.random(#keys)]
-- ③ 典型構造(Pattern)を選択
local patterns = subGenres[selectedSub].Patterns
local pattern = patterns[math.random(#patterns)]
-- ④ 問題生成
local problem = Templates[pattern]()
-- ⑤ クライアントへ送信
ProblemEvent:FireClient(player, {
Genre = selectedGenre,
SubGenre = selectedSub,
Pattern = pattern,
Text = problem.Text,
Answer = problem.Answer
})
end)
制度的意味
- Prompt=「問題生成」の権限
- MathOS=数学制度の辞書
- Pattern=制度の典型構造
- Templates=制度の操作(解法)
- FireClient=個別性の提示
5|解法選択(作る→選ぶ)
SolutionSelector.lua
local MathOS = require(game.ServerStorage.MathOS)
local SolutionEvent = game.ReplicatedStorage.RemoteEvents.SolutionSelected
local prompt = workspace.SolutionStation.ProximityPrompt
prompt.Triggered:Connect(function(player)
-- 前回の問題のジャンルを取得(ProgressLoggerで保存済み)
local genre = player:GetAttribute("LastGenre")
local sub = player:GetAttribute("LastSubGenre")
if not genre or not sub then return end
local solutions = MathOS[genre].SubGenres[sub].Solutions
local selected = solutions[math.random(#solutions)]
player:SetAttribute("SelectedSolution", selected)
SolutionEvent:FireClient(player, selected)
end)
制度的意味
- 学習者が「解法を選ぶ」
- 解法=制度の操作
- Attribute=制度の状態管理
6|学習ログ(公共性の可視化)
ProgressLogger.lua
local DataStoreService = game:GetService("DataStoreService")
local store = DataStoreService:GetDataStore("MathProgress")
local ProblemEvent = game.ReplicatedStorage.RemoteEvents.ProblemGenerated
ProblemEvent.OnServerEvent:Connect(function(player, data)
store:SetAsync(player.UserId .. "_lastProblem", data)
player:SetAttribute("LastGenre", data.Genre)
player:SetAttribute("LastSubGenre", data.SubGenre)
end)
7|UI(問題提示・解法提示)
MathUIController.lua
local ProblemEvent = game.ReplicatedStorage.RemoteEvents.ProblemGenerated
local SolutionEvent = game.ReplicatedStorage.RemoteEvents.SolutionSelected
ProblemEvent.OnClientEvent:Connect(function(data)
game.StarterGui:SetCore("SendNotification", {
Title = data.Genre .. " - " .. data.SubGenre,
Text = data.Text,
Duration = 6
})
end)
SolutionEvent.OnClientEvent:Connect(function(solution)
game.StarterGui:SetCore("SendNotification", {
Title = "選んだ解法",
Text = solution,
Duration = 4
})
end)
🌱 この「数学問題生成OS」が実現すること
✔ 数学を「制度」として扱う
ジャンル=領域
解法=操作
典型構造=パターン
前提スキル=依存関係
✔ 学習者が制度を“選ぶ”
Prompt を押す → 問題生成
Prompt を押す → 解法選択
✔ Roblox が「数学OSの実験場」になる
- 問題生成
- 解法選択
- 学習ログ
- 公共性の可視化
- 制度の編集可能性
すべて外化されている。
✨ あなたへ
次に進める方向はどれが良さそう?
- このOSを「学習者が編集できる版」に拡張する
- ジャンル→解法→問題の流れを可視化するUIを作る
- ブログ用にこのOSの制度図を描く
- Roblox内で「数学OSの街」を作る(各ジャンルが建物になる)
どれでも一緒に深められるよ。
これはまさに「数学OS」を“見える化”する核心部分だね。
ここでは Roblox 内で「ジャンル → 解法 → 問題」の流れを可視化する UI を、
教育OSとしての構造を保ったまま実装できるテンプレとしてまとめるよ。
あなたの思想(制度の外化・選択の可視化・公共性)を UI に落とし込むと、
UI は 「制度のダッシュボード」 になる。
🏛️ 数学OS UI:ジャンル → 解法 → 問題の可視化テンプレ
UI は3段階で構成する:
- ジャンル選択 UI(制度の領域を可視化)
- 解法選択 UI(制度の操作を可視化)
- 問題提示 UI(制度の実行を可視化)
すべて ScreenGui + Frame + TextButton で構成できる。
🎨 1|UI 全体構造(Explorer)
StarterGui
└ MathOSGui
├ GenreFrame
│ └ Buttons...
├ SolutionFrame
│ └ Buttons...
└ ProblemFrame
├ ProblemText
└ AnswerInput
🧭 2|ジャンル選択 UI(GenreFrame)
目的
- MathOS 辞書の「ジャンル」を外化
- 学習者が制度の“領域”を選べる
UI イメージ
- 大きめのボタンで「代数」「図形」「関数」などを表示
- 押すとサブジャンルと解法がロードされる
コード(クライアント)
local MathOS = require(game.ServerStorage.MathOS)
local gui = script.Parent
local genreFrame = gui.GenreFrame
local solutionFrame = gui.SolutionFrame
local problemFrame = gui.ProblemFrame
-- ジャンルボタン生成
for genre, data in pairs(MathOS) do
local button = Instance.new("TextButton")
button.Text = genre
button.Size = UDim2.new(0, 200, 0, 50)
button.Parent = genreFrame
button.MouseButton1Click:Connect(function()
genreFrame.Visible = false
solutionFrame.Visible = true
-- 解法UIを更新
local subGenres = data.SubGenres
for sub, info in pairs(subGenres) do
local subButton = Instance.new("TextButton")
subButton.Text = sub
subButton.Size = UDim2.new(0, 200, 0, 50)
subButton.Parent = solutionFrame
subButton.MouseButton1Click:Connect(function()
-- サーバーに「ジャンルとサブジャンル」を送る
game.ReplicatedStorage.RemoteEvents.RequestProblem:FireServer(genre, sub)
end)
end
end)
end
🧩 3|解法選択 UI(SolutionFrame)
目的
- 選んだジャンルの「解法」を外化
- 学習者が“操作”を選べる
UI イメージ
- 「因数分解」「平方完成」「解の公式」などのボタン
- 押すと選択が記録される
コード(クライアント)
local solutionFrame = gui.SolutionFrame
game.ReplicatedStorage.RemoteEvents.ProvideSolutions.OnClientEvent:Connect(function(solutions)
-- 解法ボタン生成
for _, sol in ipairs(solutions) do
local button = Instance.new("TextButton")
button.Text = sol
button.Size = UDim2.new(0, 200, 0, 50)
button.Parent = solutionFrame
button.MouseButton1Click:Connect(function()
game.ReplicatedStorage.RemoteEvents.SolutionSelected:FireServer(sol)
end)
end
end)
📘 4|問題提示 UI(ProblemFrame)
目的
- 生成された問題を可視化
- 学習者が回答できる
UI イメージ
- 大きなテキストで問題文
- 下に回答入力欄
- 「答える」ボタン
コード(クライアント)
local problemFrame = gui.ProblemFrame
local problemText = problemFrame.ProblemText
local answerBox = problemFrame.AnswerInput
game.ReplicatedStorage.RemoteEvents.ProblemGenerated.OnClientEvent:Connect(function(problem)
solutionFrame.Visible = false
problemFrame.Visible = true
problemText.Text = problem.Text
problemFrame.Submit.MouseButton1Click:Connect(function()
local answer = tonumber(answerBox.Text)
game.ReplicatedStorage.RemoteEvents.SubmitAnswer:FireServer(answer)
end)
end)
🏗️ 5|サーバー側:UI と辞書の連携
RequestProblem(ジャンル→サブジャンル→解法)
local MathOS = require(game.ServerStorage.MathOS)
local Templates = require(game.ServerStorage.ProblemTemplates)
game.ReplicatedStorage.RemoteEvents.RequestProblem.OnServerEvent:Connect(function(player, genre, sub)
local solutions = MathOS[genre].SubGenres[sub].Solutions
game.ReplicatedStorage.RemoteEvents.ProvideSolutions:FireClient(player, solutions)
end)
SolutionSelected(解法→問題生成)
game.ReplicatedStorage.RemoteEvents.SolutionSelected.OnServerEvent:Connect(function(player, solution)
local genre = player:GetAttribute("LastGenre")
local sub = player:GetAttribute("LastSubGenre")
local patterns = MathOS[genre].SubGenres[sub].Patterns
local pattern = patterns[math.random(#patterns)]
local problem = Templates[pattern]()
game.ReplicatedStorage.RemoteEvents.ProblemGenerated:FireClient(player, problem)
end)
🌱 このUIが実現すること
✔ 数学制度の“流れ”が可視化される
- ジャンル=制度の領域
- 解法=制度の操作
- 問題=制度の実行
✔ 学習者が制度を“選ぶ”
- UI がそのまま「作る→選ぶ」の外化
✔ Roblox が「数学OSのダッシュボード」になる
- 選択
- 生成
- 解法
- 回答
- ログ
すべてが UI として見える。
✨ あなたへ
次に進める方向はどれが良さそう?
- UI を「制度図」として図式化する
- 学習者がジャンルや解法を追加できる UI を作る(制度編集)
- 数学OSの街(ジャンルごとに建物)を作る
- ブログ用にこの UI の設計思想をまとめる
どれでも一緒に深められるよ。
これは最高に“OS的”な発想だね。
数学という制度を 「街」=空間構造として外化するのは、あなたの思想(境界の外化・制度の可視化・作る→選ぶ)と完全に一致している。
ここでは、Roblox 上に 「数学OSの街」 を構築するためのテンプレートを、
空間設計 → 建物構造 → Prompt → UI → 制度ロジック の順でまとめるよ。
🏙️ 数学OSの街(MathOS City)テンプレ
数学のジャンルを「建物」として配置し、
建物に入ると 解法 → 典型構造 → 問題生成 が流れるように設計する。
🧭 1|街の全体構造(空間OS)
街は「制度の地図」として機能する。
MathOS City
├ Algebra Tower(代数タワー)
├ Geometry Garden(図形ガーデン)
├ Function Lab(関数ラボ)
├ Probability Port(確率ポート)
├ Sequence Station(数列ステーション)
└ Data District(データ地区)
ポイント
- ジャンル=建物
- サブジャンル=建物内の部屋
- 解法=部屋の中の装置(Prompt)
- 典型構造=問題生成マシン
- 問題=UIで提示
数学制度が「街」として歩ける。
🏛️ 2|建物の内部構造(ジャンル→サブジャンル)
例:Algebra Tower(代数タワー)
Algebra Tower
├ Floor 1:一次方程式
│ ├ 移項装置(Prompt)
│ ├ 代入法装置(Prompt)
│ └ 比例式変形装置(Prompt)
├ Floor 2:二次方程式
│ ├ 因数分解装置
│ ├ 平方完成装置
│ └ 解の公式装置
└ Floor 3:連立方程式
├ 加減法装置
├ 代入法装置
└ グラフ交点装置
制度的意味
- 建物=制度の領域
- フロア=サブジャンル
- 装置(Prompt)=解法の外化
🎮 3|建物内の装置(Prompt)テンプレ
各解法装置は ProximityPrompt を使う。
例:因数分解装置
Part(FactorMachine)
└ ProximityPrompt
ActionText: "因数分解で問題を生成"
ObjectText: "Factorization"
押すと:
- MathOS辞書から「二次方程式 → 因数分解」パターンを取得
- 典型構造(ax²+bx+c)から問題生成
- UI に問題を提示
🧠 4|サーバー側ロジック(建物→解法→問題)
BuildingController.lua(ジャンル→サブジャンル→解法)
local MathOS = require(game.ServerStorage.MathOS)
local Templates = require(game.ServerStorage.ProblemTemplates)
local ProblemEvent = game.ReplicatedStorage.RemoteEvents.ProblemGenerated
local function generateProblem(genre, sub, solution)
local patterns = MathOS[genre].SubGenres[sub].Patterns
local pattern = patterns[math.random(#patterns)]
return Templates[pattern]()
end
return generateProblem
PromptScript(各装置に入れる)
local generateProblem = require(game.ServerScriptService.MathProblemSystem.BuildingController)
local prompt = script.Parent.ProximityPrompt
prompt.Triggered:Connect(function(player)
local genre = script:GetAttribute("Genre")
local sub = script:GetAttribute("SubGenre")
local solution = script:GetAttribute("Solution")
local problem = generateProblem(genre, sub, solution)
game.ReplicatedStorage.RemoteEvents.ProblemGenerated:FireClient(player, {
Genre = genre,
SubGenre = sub,
Solution = solution,
Text = problem.Text,
Answer = problem.Answer
})
end)
ポイント
- 建物・フロア・装置に Attribute を付けて制度化
- Prompt を押すと問題生成
- 完全に「制度としての数学」が外化される
🖥️ 5|UI(問題提示)
MathUIController.lua
local ProblemEvent = game.ReplicatedStorage.RemoteEvents.ProblemGenerated
ProblemEvent.OnClientEvent:Connect(function(data)
game.StarterGui:SetCore("SendNotification", {
Title = data.Genre .. " / " .. data.SubGenre .. " / " .. data.Solution,
Text = data.Text,
Duration = 6
})
end)
🌱 6|この「数学OSの街」が実現すること
✔ 数学制度が「空間」として歩ける
ジャンル=建物
サブジャンル=部屋
解法=装置
典型構造=問題生成マシン
✔ 学習者が制度を“選ぶ”
建物に入る → フロアを選ぶ → 装置を選ぶ
✔ Roblox が「数学OSの都市」になる
- 制度の地図
- 制度の操作
- 制度の実行
- 制度のログ
- 制度の編集
すべてが外化される。
✨ あなたへ
次に進める方向はどれが良さそう?
- 街のマップデザイン(地形・道路・建物配置)を作る
- 建物ごとの内部構造を詳細化する(フロア構造)
- 数学OSの街の“制度図”を描く
- 学習者が建物を追加できる制度編集版を作る
どれでも一緒に深められるよ。