scenario-roblox-environment について
Roblox Studio の環境アーティストやビルダー向けのスキルで、scenario-roblox-expert toolkit を使います。グレーボックス、地形、マテリアル、ライティング、プレイテスト、シーン監査を扱い、Studio での実測に基づく手順を提供します。
主な機能
- 01スポーン地点の視点からグレーボックスを作成
- 02コードによる地形作成と検証
- 03マテリアルと地形オーバーライドの適用
- 04ライティングの設計と測定
- 05衝突とストリーミングのテスト
- 06引き渡し前のシーン監査
活用シーン
- 01Roblox 環境のグレーボックス作成
- 02地形表面の形成と検証
- 03ライティングによるゾーンの雰囲気づくり
- 04通路とシーン品質の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-roblox-environmentインストール後、Claude Code で/scenario-roblox-environmentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/critique.mdexpert-notes.mdfoliage.mdgui-paths.mdprocedures.mdsources.mdverification.mdscripts/rbx_environment.pyscripts/agentkit/environment/EnvAudit.luauGraybox.luauLooks.luaulune_env_audit.luauMaterialKit.luauScatter.luauTerrainKit.luauWorldCheck.luau詳細
Roblox 環境(ビルダー、環境アーティスト、ライター)
対象:macOS 上の Roblox Studio(2026 年 10 月ビルド)。scenario-roblox-expert ツールキットを通じて操作します。
Roblox での環境制作の専門知識とは、プレーンなパーツからグレーボックスを構築し、スポーンカメラを起点として構成すること、コードで地形やマテリアルを作成して、見えない失敗がないか確認すること、そしてムードを決め、まず太陽の向きを調整し、最後にポストエフェクトを追加してライティングを設計することです。このスキルでは、これらのルールを情報源から引き継ぎ、目的に合わせて制作した村、地形、インテリアを Studio 0.743 で実際にテストして修正しました。また、シーンの構築、ライティング、測定、監査を行うキットモジュールも備えています。ここに記載された関連スキルが利用可能なスキルにない場合は、ユーザーにインストールを依頼してください
(npx skills add scenario-labs/skills --skill <name>)。無人で実行する場合は、ツールのスキーマを確認して進め、不足している点を明示してください。
必須の前提知識: scenario-roblox-expert(チャネル、レビューループ、ツールキット、現行 Roblox の落とし穴)。
ステータス(2026-10-19): 2026-10-19 01:14 の実行では Studio 0.743 で 14 項目中 14 項目に合格しました。オフラインの O1~O9 も合格しています。Scatter、ストリーミングテスト、オーバーレイはオフラインテストのみです。その後の実行では、ビューポートの描画が停止して行き詰まりました(references/procedures.md を参照)。
スタンス(専門家としての差分)
- スポーン地点のカメラから構成する、シンプルなパーツによるグレーボックス。 プリミティブ、1つのグリッド用 MaterialVariant、アンダースコア付きのフォルダー、壁とは異なる地面の色(Jalapeno、T--CNfkfBBQ [00:02:01 to 00:02:35, 00:08:13])。ランドマークは実際のサイズで目立つプレースホルダーにします(RoBuilder、eRnnjqVOq7c [00:05:20])。出入り口と通路の幅は少なくとも10スタッド、壁の高さは少なくとも10スタッドにします(Roblox graybox tutorial)。プレイヤーのスポーン地点から構成し、ランドマーク間の移動時間を計ります(Gino、vWx8UTxsi0A [00:11:49, 00:12:21])。
- 実機検証:テンプレートの SpawnLocation は村とは反対向きで、最初に見えるのは丘陵でした。スポーン地点を最初のランドマークの方へ向けます。
- CSG より先にパーツを使い、開口部に衝突判定がどう影響するかをテストします。 軸に沿った穴はユニオンではなくパーツで切り抜きます(Kaiwala、x9jg8kjH3Vs [00:04:41])。異なるユニオンはそれぞれ独自のメッシュと衝突アセットになります(Kaiwala、Ahn2P_4TDrU [00:20:40])。プレイヤーが形状を通り抜けるのか、接触するのかに応じて精度を選びます(Roblox collisions docs)。
- Kaiwala は、Default の衝突判定では穴が塞がることを確認し、PreciseConvexDecomposition に切り替えています。単純な形状なら、Hull または Box が低コストな解決策です(Ahn2P_4TDrU [00:01:54, 00:02:28])。
- 実機検証:Hull と Box では10×10の出入り口が塞がりましたが、Default と PreciseConvexDecomposition では通り抜けられました。精度の名前を鵜呑みにせず、開口部を1つずつ調べます。
GetPartBoundsInBoxはバウンディングボックスを比較するため、すべてのユニオンのドアを通行不可と判定しました。通行できるかどうかはGetPartsInPartまたはレイでテストします。
- コードで地形を作り、ボクセルを読み取って確認します。 パーツで大まかに形を作り、変換してから滑らかにします(BONES、-DoOf32pkPo [00:04:34, 00:09:57])。Region の呼び出しには解像度4、グリッドに合わせたリージョン、リージョンごとに最大4,194,304ボクセルが必要です(Terrain reference)。
- 実機検証:上端を y 0 に合わせた
FillBlockでは、歩行可能な地表が y 2 付近に残りました。TerrainKit.occupancyを使えば表面を正確な位置に設定できます。 - 実機検証:塗りつぶし直後のレイキャストは何も返しませんでした。
TerrainKit.surfaceYを使うと、ボクセルから高さを読み取れます。 - 草の葉がパーツを突き抜けるため、その部分を LeafyGrass で塗ります(SmartyRBX、CippiATeZ54 [00:01:40])。実機検証では、Grass に設定した床はすべて草が突き抜けました。
TerrainKit.paintUnderを使うと、床の下を塗り直せます。
- 実機検証:上端を y 0 に合わせた
- マテリアルは名前で、ベースマテリアルごとに紐付き、地形ではさらに設定が必要です。 名前を変更すると、そのバリアントを使用するすべてのパーツに影響します(Roblox materials docs)。地形でバリアントを使用するにはオーバーライドが必要で、マテリアルごとに1つ設定します。Grass と LeafyGrass は別々です(SmartyRBX、CippiATeZ54 [00:05:13, 00:05:47])。
- 実機検証:Basalt バリアントを作成しても、
SetBaseMaterialOverrideを設定するまでは何も変わりませんでした。 - 実機検証:オーバーライドを設定しても、地形のマテリアルカラー(Basalt 30、30、37)がマップに掛け合わさるため、ほぼ黒く表示されました。SmartyRBX が手動で行っているように、
Terrain:SetMaterialColorで明るくします [00:02:44]。
- 実機検証:Basalt バリアントを作成しても、
- ムードを決め、太陽の向きを調整してから、色を設定します。 まずムードを一文で決め、次に ClockTime を設定します(RingWorld、UlvSrWHESwA [00:01:06, 00:01:58])。重要な場所に光が当たるよう太陽の向きを調整します(DatBoiEle、aq0Fi0R2FAY [00:02:11]。BONES は方向の制御に GeographicLatitude を使用しています。zAoY8pxJM9c [00:08:36])。
- 実機検証:デフォルトの緯度ではスポーン地点のカメラが太陽を向き、Ambient で色付けされた影側しか見えませんでした。
Looks.aimSunは、あらゆる方向に対して誤差1度未満で ClockTime と GeographicLatitude を見つけます。
- 実機検証:デフォルトの緯度ではスポーン地点のカメラが太陽を向き、Ambient で色付けされた影側しか見えませんでした。
- 暖色の光に寒色の影を組み合わせ、最後に少しずつコントラストを調整します。 Ambient は影に色を付け、ColorShift_Top は光に色を付けます。EnvironmentDiffuseScale を下げるとコントラストが上がります(DatBoiEle [00:03:38, 00:05:48])。まずリアルさを優先します。Atmosphere の Density は0.3〜0.4、Offset は0にし、コントラスト用の色補正は最後に行います(Develuper、vkEXLmRAQgs [00:00:27, 00:01:04, 00:02:16])。ColorCorrection は0.05ずつ動かします(DatBoiEle [00:08:09])。Bloom は Threshold を約0.03、Size を大きくしてから、好みに合わせて Intensity を下げます [00:07:37]。
- 夜には、焦点となる光源とシルエットが必要です。 BONES の暗い設定は廊下で有効です。Atmosphere の Color と Decay を黒にし、Density を0.495、Offset を0.25、Haze を5、Glare を0、環境スケールを0、ExposureCompensation を-0.4にします(zAoY8pxJM9c [00:03:15 to 00:06:04])。屋外では、RingWorld は Brightness を下げ、グレアを抑え、青く色付けし、近距離と遠距離のライトを追加します(UlvSrWHESwA [00:06:44 to 00:07:54])。
- 判断基準:プレイヤーに遠景が必要ですか? 実機検証では、廊下用の設定によって遠景の96〜100%が真っ黒になりました。
night_outdoorでは、すべての景色を見やすいままにできました。
- 判断基準:プレイヤーに遠景が必要ですか? 実機検証では、廊下用の設定によって遠景の96〜100%が真っ黒になりました。
- 室内では、まず窓から光を通し、その後に反射光を擬似的に再現します。 影を落とすガラスは太陽光を遮るため、CastShadow をオフにします(DatBoiEle [00:09:16])。窓から光が差す部屋では、BONES は Brightness を44、Ambient を黒、環境スケールを0に設定します。窓の近くに PointLight [234, 255, 254] を追加し、Range を50、Shadows をオンにします(zAoY8pxJM9c [00:06:14, 00:07:14])。この3つはすべて実機で確認済みです。
まず決めること
- カメラとジャンル:三人称(デフォルト)では、一人称より大きなドアと高い天井が必要です。
- 対象デバイス:モバイルで手が届きやすいよう、柔らかな照明にし、パフォーマンス担当者の予算に合わせます。
- マップのサイズ、StreamingEnabled、クライアント上に常時存在させる必要のあるモデル。
- 各ゾーンにつき雰囲気を表す一文と、参考画像を2~3枚。
- アセットのソース:Scenario のメッシュ、テクスチャ、スカイボックス、または Roblox のマテリアルのみ。
- ファイルのパイプライン:Rojo または Studio のみ。いくつかの設定はファイルでのみ変更できます(Current Roblox notes)。
デフォルト:PrioritizeLightingQuality を使用した Realistic、StudsPerTile を 8 にしたグレーボックスのグリッドバリアント、10
× 10 のドア、スポーン地点からの眺めを想定した day_fantasy の外観。
手順
セットアップ:import rbx_environment as E を実行し、続いて
E.run(studio, code, kit=["Graybox", "TerrainKit", "MaterialKit", "Looks", "EnvAudit"]) を実行します(リードツールキットを検出します)。完全なコードと記録された結果:
references/procedures.md。
- 準備状況(P1)。 LightingStyle、オーバーライド、ファイルでのみ変更できる設定を確認します。GATE: 意図した値になっていること。スクリプトで変更できない設定は、place ファイルまたは Properties パネルで設定します。
- グレーボックス(P3)。
map_geo/<area>/<kind>の下にGraybox.house、wall、lantern、blockを配置し、ランドマークのプレースホルダーを置き、スポーン地点を最初のランドマークに向けます。GATE:Graybox.clearanceで問題が検出されないこと。歩行時間が報告されること。スポーン地点のキャプチャにランドマークが写っていること。 - 地形(P2、P13、P4)。 高さ関数を指定した
TerrainKit.heightfield、water、fromParts、smoothを使い、続いて床にpaintUnderを適用します。GATE: スポーン地点の地面(1フレーム後のgroundYまたはsurfaceY)が設計上の高さにあること。スポーン地点と屋内のキャプチャで、床を突き抜けて草が生えていないこと。 - 開口部と衝突判定(P5)。 開口部をパーツから作成します。ユニオンを使う場合は、Default の忠実度と
Opening属性を維持します。GATE: キャラクターサイズのGetPartsInPartプローブとレイが、すべての出入口を通過すること。 - マテリアル(P6)。
MaterialKit.kit、役割ごとのdress、地形マテリアルごとに1つのオーバーライド、地形マテリアルの色を設定します。GATE:MaterialKit.linksで破損が0件と返されること。各オーバーライドを読み戻せること。マテリアル適用後のキャプチャをreferences/critique.mdに沿って評価すること。- 草木、岩、樹木:
Scatter.planとScatter.placeを使い、バリアントごとに衝突判定と LevelOfDetail を設定します(references/foliage.md)。
- 草木、岩、樹木:
- 照明(P7~P10)。 スナップショットを取得し、
Looks.apply、Looks.aimSunを実行します。同じカメラで適用前後を撮影し、E.look_metricsを実行してコンタクトシートを1枚作成します。GATE: 指標が品質ゲートの範囲内であること。シートを雰囲気を表す一文と照らして評価すること。 - プレイテスト(P11)。 Client Stats、モデルごとのストリーミング確認、ドアを通り抜けるテストを行います。GATE: キャラクターが屋内に到達すること。数値をパフォーマンス担当者に共有すること。
- キャプチャ以外で失敗する可能性のある確認項目:半径64でのストリーミング、衝突判定と不可視ブロッカーのオーバーレイ、テクスチャサイズ、メッシュグループ(
references/verification.md)。
- キャプチャ以外で失敗する可能性のある確認項目:半径64でのストリーミング、衝突判定と不可視ブロッカーのオーバーレイ、テクスチャサイズ、メッシュグループ(
- 監査と引き継ぎ(P12)。 Studio で
EnvAudit.all(game)を実行し、保存済みファイルでE.lune_audit(place)を実行します。GATE: error も warn もないこと。
数値
| 値 | 数値 | 出典 |
|---|---|---|
| 出入口と廊下の幅;壁の高さ | 少なくとも 10 スタッド | graybox tutorial |
| デフォルトの WalkSpeed;JumpHeight | 16 スタッド/秒;7.2(チュートリアルの 5 は古い値です) | Humanoid reference |
| 1 スタッド | 約 28 cm;インポート時に変換されません | units guide |
| グリッドバリアントのタイル | StudsPerTile 8 | Jalapeno |
| Terrain 領域の呼び出し | 解像度 4、4,194,304 ボクセル | Terrain reference |
| CSG の結果 | 最大 20,000 三角形 | solid modeling docs |
| Light Range | 書き込み時に 120 にクランプされます(ライブ) | deltas |
| Atmosphere Density、Offset(日中) | 0.3~0.4、0 | Develuper |
| 暗い Atmosphere | Density 0.495、Offset 0.25、Haze 5、Glare 0 | BONES |
| ExposureCompensation | -0.4、小数単位で調整 | BONES |
| 窓から光が差し込む室内 | Brightness 44;フェイク GI [234, 255, 254]、Range 50 | BONES |
| ColorCorrection のステップ | 0.05;Contrast 0.1 | DatBoiEle |
| ストリーミングの基本設定 | MinRadius 64、TargetRadius 1024、PauseOutsideLoadedArea、Opportunistic、Improved | streaming docs |
| 2 GB のスマートフォンでのビューごとの予算 | 500 ドローコール、500k 三角形 | McNeill, cWDNVvOh4o0(パフォーマンス担当) |
| スクリプトのクランプ(ライブ) | Atmosphere の Glare と Haze は 10、Density と Offset は 1、ShadowSoftness は 1;Brightness と Bloom Size はクランプされません | Studio 0.743 |
品質ゲート
測定値(各キャプチャの下半分を対象に、skip_top=0.45 を指定して測定し、空の影響を抑えます):
- 昼の見た目:どのビューでも
crushedが 0.05 未満で、中立的なキャプチャより幅広く分布します。 - 屋外の夜:どのビューでも
crushedが 0.5 未満で、スポーン地点付近に照らされた焦点があります。 - 太陽光のある屋内:床の一部がクリップされ(
clippedが 0.05 を超え)、その部分を保ったまま、疑似的なバウンス光によってmean_lumaが上がります。 Graybox.clearance、MaterialKit.links、EnvAudit:エラーまたは警告レベルの検出結果はゼロです。- プレイテスト:開発用マシンで 60 fps。ビューごとにドローコール数と三角形数を報告します。
コンタクトシート(references/critique.md)を目視で評価します。雰囲気が文章と
一致していること、グレースケールでも明暗の構成が分かること、スポーン地点から照らされた面が見えること、ランドマークと
背景にコントラストがあること、素材がプラスチックのように見えたり、ほぼ黒になったりしていないこと、遠景の霞がシルエットを残すこと。
よくある間違い
| 間違い | 修正 |
|---|---|
スクリプトで Lighting.Technology = Future を設定する | LightingStyle と PrioritizeLightingQuality を使用します。Technology は place ファイルでのみ設定します |
スクリプトでストリーミング半径や Terrain.Decoration を設定する | ファイルでのみ設定します:Rojo の $properties または Properties パネル(実行中は「有効なメンバーではありません」と表示されます) |
小さな半径で LevelOfDetail = StreamingMesh を使用する | 静的モデルには SLIM を使用します。StreamingMesh は TargetRadius が 1000 以上の場合にのみ使用します(Andrew、Wwj8EkMWFhI) |
| ドアを 4×8 にする | 少なくとも 10×10 にします |
| Hull または Box のユニオンでドアを作る | パーツを使用するか、Default fidelity のユニオンを使用します |
| BaseMaterial を Grass にしたバリアントで、地形も変わると期待する | Grass と LeafyGrass には SetBaseMaterialOverride を使用し、その後、地形の素材の色を確認します |
| 適用後にバリアントの名前を変更する | 名前は変更せず、MaterialKit.links で監査します |
| Soft で ShadowSoftness を調整し、その後 Realistic で評価する | 出荷するスタイルで評価します。スタイルごとにキャプチャします |
| 太陽の向きを調整する前に色を調整する | 最初に Looks.aimSun を実行します |
| Edit のキャプチャでブルームを評価する | Intensity 3 のブルームによるキャプチャの変化は、同一条件のキャプチャ間の差を超えませんでした(実行中)。プレイ中またはデバイス上で評価します |
| 遠くにポイントライトを 1 つだけ置く | ライトを近くと遠くに 2 つ置きます。Range は 120 で止まります |
| CastShadow をオンにしたガラス | CastShadow をオフにします |
引き継ぎ
| 対象(引き継ぎ元または先) | 内容 |
|---|---|
| scenario-3d、次に scenario-roblox-assets | Scenario のメッシュはそこでインポートして確認します(トライアングル、コリジョン、SurfaceAppearance)。このスキルではメッシュを配置し、fidelity と LevelOfDetail を設定して、ライティングを行います |
| scenario-textures | タイル状に使える PBR セットはここで MaterialVariants になります(color、normal、roughness、metalness、OpenGL normals)。単一メッシュ用のテクスチャセットは scenario-roblox-assets に SurfaceAppearance として送ります |
| scenario-skyboxes | 6 面を Sky.SkyboxBk/Dn/Ft/Lf/Rt/Up に設定します。アップロードにはユーザーの許可が必要です。空はシーンに色を付けるため、見た目を確認して評価します |
| scenario-game-assets | デカールとサインはここでサーフェスに配置します。UI アートは scenario-roblox-ui に送ります |
| scenario-roblox-performance | ストリーミング設定、予算、デバイスのテストについては、P11 Stats と EnvAudit のカウントを送ります |
| scenario-roblox-vfx-audio | パーティクル、ビーム、環境音については、ムードを表す文とライトの位置を送ります |
| scenario-roblox-gameplay | コリジョングループ、ヒットボックスの形状、グレーボックス内の NPC ナビゲーション |
| scenario-roblox-tooling | ファイルのみの設定を含む Rojo プロジェクト |
現在の Roblox に関する注意事項
Lighting.TechnologyはLightingStyle(Soft または Realistic)とPrioritizeLightingQualityに置き換えられています。スクリプトから Technology を読み取ることはできません。- スクリプトからの設定が拒否されるファイルのみの設定(ライブ環境):
StreamingTargetRadiusおよびStreamingEnabledを除くその他のストリーミング設定、Terrain.Decoration、GrassLength、MaterialService.<Material>Name。Rojo 7.7.1 ではこれらすべてを書き込めます(Lune で読み戻し)。 - Rojo で作成したプレースはエンジンのデフォルト設定で開始します。GlobalShadows はオフ、環境スケールは 0、アンビエントはグレーで、 Sky や Atmosphere はありません(ライブ環境)。
GeometryService:SubtractAsyncとその関連 API はBasePart:SubtractAsyncに取って代わります。結果は親なしで返され、CollisionFidelityの書き込みは次の yield 後に読み戻されます(ライブ環境)。ReadVoxelChannelsは結果テーブルにSizeを返し、ReadVoxelsはマテリアル配列に返します (ライブ環境)。- Terrain の
CloudsはWorkspace.Terrainの下にあり、スクリプトで作成できます(ライブ環境)。 - 実行中のゲームでも、
ClockTimeは自動では進みません(ライブ環境)。
参考資料
references/procedures.md:P1 から P13 まで。ライブテストで実行するコードとその結果です。references/critique.md:キャプチャの評価方法と、このスキル自体のキャプチャで得られた知見です。references/expert-notes.md:情報源ごとの専門家の見解、合意点、相違点、ライブでの修正です。references/gui-paths.md:GUI 専用ツール、そのコードによる代替手段、メニューのパスです。references/foliage.md:散布、葉カード、衝突、RenderFidelity、LevelOfDetail についてです。references/verification.md:ストリーミングテスト、オーバーレイ、テクスチャ、バッチ処理の監査です。references/sources.md:すべての情報源と公開 URL です。- キット:
Graybox、TerrainKit、MaterialKit、Looks、EnvAudit、Scatter、WorldCheck、lune_env_audit、rbx_environment.py。