building-maps について
Roblox Studioで大規模な環境を構築するための手順を、エージェントに提供するスキルです。レイアウト要件の確認、ゾーンごとの構築、Robloxツールによる完成後の検証を重視します。
主な機能
- 01マップ設計チェックリスト
- 026段階の構築手順
- 03アンカー基準のゾーン配置
- 04整理されたマップ階層
- 05構築後の構造検証
活用シーン
- 01複数ゾーンのマップ設計
- 02Robloxシーンの段階的な生成
- 03移動経路とパーツ固定の確認
MCP 対応
mcp__roblox__run_codeを使ったマップの構築と検査を案内し、ツールの各実行がステートレスであることも説明します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ohzw/ roblox-dev-skills --skill building-mapsインストール後、Claude Code で/building-mapsを入力して読み込まれたか確認します。
詳細
Roblox でのマップ構築
このスキルでは、mcp__roblox__run_code ツールを使って、Roblox Studio で信頼性の高い、一貫性のある大規模な環境を生成するための手順を説明します。
権威性:この SKILL.md ファイルは、docs/ フォルダー内にある指示よりも優先されます。
MCP の制限と回避策(重要)
mcp__roblox__run_code ツールは、Lua コードをステートレスに実行します。
実行するたびに状態は初期化されます。
- 状態の喪失:ある呼び出しで宣言した変数は、次の呼び出しでは存在しません。
- 参照の喪失:オブジェクトへの参照は、呼び出しをまたいで保持されません。
- 対処法:すべての
run_code呼び出しの開始時に、workspace:FindFirstChild("MapRoot")を使って、作業中のマップへの参照を必ず再取得してください。
-- MUST BE AT THE START OF EVERY RUN_CODE CALL
local mapRoot = workspace:FindFirstChild("CityMap")
if not mapRoot then
mapRoot = Instance.new("Folder")
mapRoot.Name = "CityMap"
mapRoot.Parent = workspace
end
避けるべきアンチパターン
- 推測しない(事実確認の原則):マップの構築は複数のチャンクにまたがります。ゾーンやランドマークの位置がわからなくなった場合、絶対に推測しないでください。新しいオフセットを計算する前に、
mcp__roblox__run_codeを使ってworkspaceを調べ、既存パーツの正確なCFrameを出力してください。 - マップ全体を1回の呼び出しで構築しない:大きなスクリプトは、文字列長の制限や実行タイムアウトにより失敗しやすくなります。構築をフェーズとゾーンごとに分割してください。
- サブゾーンに固定のワールド座標を使わない:中央の「Origin」アンカー(例:0,0,0 にある 1x1 の透明パーツ)を定義してください。すべてのゾーンのオフセットは、この
Origin.CFrameを基準にする必要があります。 - 同一のゾーンを作らない:主要な素材、アクセントカラー、またはシルエットが特徴的なランドマークを変えて、ゾーンごとに違いを持たせてください。
- 道を狭くしない:幅が 6 studs 未満の道では、プレイヤーは一列で移動せざるを得ません。主要道路の幅は 10 studs 以上にしてください。
- 浮いたジオメトリを作らない:すべての構造物を、地面または地形に接続してください。
構築プロセス(6 フェーズ)
複雑なマップを1回の実行で構築しようとしないでください。以下のフェーズを順番に進めてください。
フェーズ 1:レイアウトの計画(コーディング前)
マップ構築の依頼を受けたら、コードを書く前に、必ず次の評価プロセスに厳密に従ってください。「spacious(広い)」「western(洋風)」「cool(かっこいい)」などの言葉は、構造上の要件ではなく、曖昧な修飾語です。
ステップ 1:思考とチェックリストの評価
mcp__roblox__run_code を呼び出す前に、ユーザーのプロンプトを以下の必須チェックリストに照らして評価するため、必ず <thinking> ブロックを出力してください。
- [規模/範囲] 全体のサイズが定義されていますか?(例:100x100 の小さなアリーナか、2000x2000 の都市か)。
- [ゲームプレイの種類] 構造のトポロジーが定義されていますか?(例:平坦な交流用ロビーか、垂直方向に展開するパルクールのオビーか)。
- [ゾーンの内訳] 具体的なエリア/ゾーンが列挙されていますか?(例:「町」は不十分です。「スポーン広場、家3軒、店がある町」なら十分です)。
ステップ 2:実行経路の選択
<thinking> ブロック内で、各項目に Yes または No で答えてください。
重要なルール:項目のいずれかが「No」または「曖昧」なら、必ず停止してください。構築を進めてはいけません。何も「妥当だろう」と仮定してはいけません。構造を推測することは禁止されています。
- 経路 A:実行とプロトタイプ チェックリストの3項目すべてが明確に「Yes」の場合に限り、構築を進められます。
- 経路 B:ユーザーに質問(「No」が1つでもある場合は必須) いずれかの項目が No/曖昧なら、必ず直ちに停止して、ユーザーに確認してください。コードを書いてはいけません。ドキュメントを読んではいけません。停止して、ユーザーに質問してください。 自然な言葉、または質問ツールを使って、具体的な選択肢を含む簡潔な質問を1つだけしてください。
フェーズ 2:地面と境界
メインの床面と境界壁を生成します。Origin アンカーパーツと MapRoot のフォルダー階層を作成してください。1回の呼び出しで作成するパーツ数の目安は10~20個です。
フェーズ 3:ゾーンの外殻
各ゾーンの床部分、主要な壁、仕切りを生成します。オフセットは Origin を基準に計算してください。1回の呼び出しで作成するパーツ数の目安は20~40個です。
フェーズ 4:ランドマーク
塔、噴水、目立つ木、主要な建造物などを作成します。プレイヤーが位置を把握する目印になります。1 回の呼び出しあたりのパーツ数の目安:ランドマークごとに 20~30 個。
複雑な幾何学的ランドマークを作成する場合は、../building-3d-objects/docs/spatial-patterns.md をお読みください。
フェーズ 5:ゾーンの配置
各ゾーンに小道具、家具、植生を配置します。1 回の呼び出しあたりのパーツ数の目安:ゾーンごとに 20~30 個。
フェーズ 6:環境、ライティング、スポーン地点
マップの環境を設定し、スポーン地点を配置します。グローバル設定とローカルな光源の両方が含まれます。1 回の呼び出しあたりのパーツ数の目安:5~20 個。
インスタンスレベルのライトだけに限定しないでください。 次の項目も検討してください。
Lightingサービスのプロパティ(ClockTime/TimeOfDay、Ambient、Brightness)Atmosphere(Density、Offset、Color、Decay、Glare、Haze)- 地面が固い場所にある
SpawnLocation
フォルダー構成
必ず階層構造に整理してください。workspace にパーツをフラットに並べないでください。
workspace/
MapName/ ← MapRoot (Folder)
Origin ← invisible anchor part (0,0,0)
Terrain/ ← ground planes, terrain features
Zone_A/ ← named zone (Folder)
Floor
Walls/
Props/
Zone_B/
Landmarks/ ← major visual anchors
Lighting/ ← ambient sources
Spawns/ ← SpawnLocation instances
ビルド後の検証
ビルドが視覚的に完成したら、mcp__roblox__run_code を使って検証スクリプトを実行してください。MAP_ROOT_NAME 変数は、マップのフォルダー名に合わせてください。
local MAP_ROOT_NAME = "YourMapName" -- AI: Update this
local root = workspace:FindFirstChild(MAP_ROOT_NAME)
if not root then print("[ERROR] " .. MAP_ROOT_NAME .. " not found"); return end
local errors, warnings, partCount = 0, 0, 0
for _, desc in ipairs(root:GetDescendants()) do
if desc:IsA("BasePart") then
partCount = partCount + 1
if not desc.Anchored then
print("[ERROR] " .. desc:GetFullName() .. " not Anchored")
errors = errors + 1
end
if desc.Position.Y - desc.Size.Y/2 < -0.5 then
print("[WARN] " .. desc.Name .. " below floor Y=" .. string.format("%.1f", desc.Position.Y - desc.Size.Y/2))
warnings = warnings + 1
end
if desc.Color == Color3.new(163/255,162/255,165/255) and desc.Material == Enum.Material.Plastic then
print("[WARN] " .. desc.Name .. " uses default color")
warnings = warnings + 1
end
end
end
print(string.format("Parts: %d | Errors: %d | Warnings: %d", partCount, errors, warnings))
回帰確認のループ:スクリプトが [ERROR] または [WARN] を出力した場合は、問題を修正して再検証してください。
さらに、次の構造上の特性を確認してください。
- 移動経路:すべてのゾーンにスポーン地点から到達できますか?
- スケールの確認:プレイヤーのサイズ(約 5 studs)に対して、環境のスケールは適切ですか?
- 階層:すべてのパーツが
MapRootフォルダー階層内に格納されていますか? - アンカー設定:上記のスクリプトで確認済みです。