scenario-roblox-assets について
Blender と Roblox Studio で小道具やアバターアクセサリーを準備する、Roblox 向けアセット制作スキルです。メッシュやテクスチャの処理、Studio でのプレビュー、フィット確認、ローカル検証を扱い、最終アップロードは人またはコンピューター操作エージェントに委ねます。
主な機能
- 01GLB の検査と Blender 処理
- 02メッシュの寸法・向き・三角形数確認
- 03Roblox 用テクスチャの準備と監査
- 04Studio プレビューとアクセサリー適合テスト
- 05UGC アクセサリーのローカル検証
活用シーン
- 01目標のスタッド寸法に合わせた小道具制作
- 02Studio へのインポート前のメッシュ確認
- 03帽子アクセサリーの適合と監査
- 04アップロード前のアバターアイテム検証
- 05Roblox インポート用アセットの引き継ぎ
MCP 対応
scenario-roblox-expert ツールキットと Studio MCP を使い、Roblox のプレース内で準備済みアセットをプレビュー・監査します。アップロードせずにローカル検証できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-roblox-assetsインストール後、Claude Code で/scenario-roblox-assetsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/avatar-item-checks.mdcritique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/blender_roblox_prep.pyrbx_assets.pyscripts/agentkit/assets/AssetAudit.luauMeshBuild.luauPayload.luauUGCCheck.luau詳細
Roblox アセットパイプラインとUGC
対象:macOS 上の Roblox Studio(2026年10月ビルド)。scenario-roblox-expert ツールキットを通じて操作します。
ここでいうエキスパートレベルとは、すべてのメッシュが Studio に届く時点で、すでにスタッド単位のサイズに調整され、-Z 方向を向き、三角形数の予算内に収まり、必要に応じて閉じられ、Roblox に合わせたサイズと分割のマップを備え、その数値で状態が証明されていることを意味します。Blender で修正し、Studio でアップロードせずにプレビューと監査を行い、ローカルで緑判定になるまで検証したら、Roblox がアセットのアップロードを必要とする時点で正確に作業を止めます。
ここで名前が挙がっている関連スキルが利用可能なスキルにない場合は、ユーザーにインストールを依頼してください
(npx skills add scenario-labs/skills --skill <name>)。無人で作業を進める場合は、ツールのスキーマを確認し、欠落しているスキルを明記してください。
必須の背景知識: scenario-roblox-expert(チャンネル、レビューループ、ツールキット、Roblox の最新の落とし穴)。
方針(エキスパートに必要な追加事項)
- AI が生成した GLB は、既知の欠陥を持つ未加工の入力として扱います。 画像から生成された3Dデータは、幅が約0.95ユニットで、正面が+Zを向き、すべてのマテリアルで
doubleSidedが有効になり、部分的な金属感を塗装で表現したmetallicFactor1.0、2048 px の JPEG マップ、ピンホールを含む状態で出力されます[追加、2つの生成結果で測定]。未加工メッシュには、リメッシュ、ピボット、スケールの調整が必要です(CallMeDogey)。 - Studio ではなく Blender でスタッド単位のサイズを決めます。 Blender の1単位は1スタッドです。glTF は Importer でスケール調整が不要になります(Creator Docs、Importer;KatsBits[00:02:56])。小道具のピボットは底面の中心に(Common Sense Machines[00:02:39])、アクセサリーのピボットはメッシュの中心に設定します(validation #173)。
- エクスポート前に正面を-Zに向けます。 glTF の正面は+Zを向きますが、Roblox の LookVector は-Zです。Blender でヨーを180度回転させれば、正しい向きにできます[追加]。
- アクセサリーのサイズはバウンディングボックスで決まり、帽子のサイズはクラウンで決まります。 バウンディングボックスは AccessoryType ごとに異なり、アタッチメントの周囲で測定されます。回転させるとボックスが大きくなります(KatsBits[00:10:34])。ボックスは
AvatarPartScaleTypeに従います。none または Classic ではGetValidationRules()のボックス(Hat は 3 x 4 x 3)、ProportionsNormal ではドキュメントの値(1.87 x 2.5 x 1.87)を使います[追加、実環境で確認]。帽子はクラウンが頭に干渉しないようにスケールし、そのうえでボックスを確認します。テスト用の帽子では、つばが Normal のボックスいっぱいまで広がる状態で、クラウンがデフォルトの頭よりも狭くなっていました[追加]。 - 水密性を測定し、塗りつぶし処理を過信しないでください。 テスト用の帽子では、
bmesh.ops.holes_fillが9つのピンホールのうち2つしか塞がず、さらにデシメーションによって3つの面を持つエッジが生成されました[追加]。各ループを塞ぎ、デシメーション後に修復し、境界エッジの数を再度数えます。穴を隠すために Make Double Sided を使用してはいけません(Creator Docs、Importer)。 - アップロードせずにプレビューします。 EditableMesh と EditableImage を使えば、準備済みのメッシュと PBR マップをプレース内に再構築し、監査、着用テスト、キャプチャを行えます[追加]。そのコンテンツはセッション中のみ有効で、プレイテスト用のコピーでは空になります[追加]。反復作業中は、Roblox へのアップロードをオフにした状態で Importer を使って出力してください(Creator Docs;Templates[00:02:31])。
- ローカルで緑判定になるまで検証し、そこで止めます。
ValidateUGCAccessoryAsyncはプレイテスト中に Roblox のバリデーターを実行します。ジオメトリ、スキーマ、マテリアル、バウンディングボックスに関する文字列はすべて修正してください。所有権とモデレーションに関する文字列はアセットのアップロードが必要になるため、エージェントの作業はそこで終了です(Creator Docs、validation system)。 - テクスチャは元データではなく、密度に合わせます。 2 x 2 x 2 スタッドあたり256 px、べき乗のサイズにします。法線マップは OpenGL 形式を使用し、デザイン上サテンが必要な場合を除き、メタルネスは0または1にします。アクセサリーの ColorMap は不透明にします(Creator Docs、texture specifications and SurfaceAppearance)。
最初に確認すること
- 配置先:体験内のプロップ、またはマーケットプレイスのアバターアイテムです。検証を通過し、かつ水密である必要があるのは後者だけです。
- アセットごとのサイズ(スタッド単位。R15 キャラクターの身長は約 5~6 スタッドです)。アクセサリーの場合は、AccessoryType と、宣言する
AvatarPartScaleType(Classic、ProportionsNormal、ProportionsSlender)も確認します。 - 予算クラス:ヒーロープロップ、クラッター、またはアクセサリー(4,000 三角形)です。
- ソース:scenario-3d の GLB(推奨)、FBX(FBX Unit Scale が必要)、または OBJ(メッシュのみ)です。
- リグまたはスキニング済みの入力は、インポート後に scenario-roblox-animation に渡します。
- 未回答の場合の既定値:プロップ、底面ピボット、コンセプトのスケールに基づく最長辺、
texture_sideに基づくテクスチャの辺の長さ、帽子のクラウン開口部は 1.35 スタッド、スケールタイプなし(Classic ボックス)。
手順
コード全文と記録された結果:procedures.md。セットアップ:
import rbx_assets as ra(リードツールキットを自動検出します)。以下のすべてのスニペットは、未実行と記されているものを除き、2026-10-19 に Studio 0.743 または Blender
5.2 で実行しました。Edit とプレイテストのキャプチャで適合を確認しました(覆われた窓は暗いフレームを返すため、ここでは数値で判断します)。
- トリアージ。 目的:欠陥を把握します。方法:オフラインで
ra.glb_info(path)を実行します。GATE:アセットごとに三角形数、サイズ、マップサイズ、doubleSided、スキン、拡張機能を記録します。 - Blender で修正。 目的:サイズ、向き、ピボット、予算、閉じたメッシュ、Roblox マップを整えます。方法:
ra.blender_prep({**ra.PROP_PREP or ra.ACCESSORY_PREP, "input", "out_dir", "yaw": 180, "scale": ...})を実行します。帽子には{"opening": 1.35, "band": [0.08, 0.2], "cap": [3, 4, 3]}を指定します。マシンガードを待ってからblender -bを実行し、レポートと 4 枚の Workbench ビューを書き出します。GATE:ra.gates(report["after"], kind, type)がすべて合格し、正面ビューに正面が表示されていること。 - 現在のルールを確認。 目的:本日時点の制限を確認します。方法:
ra.run(studio, "return AssetAudit.rules()", kit=["AssetAudit"])を実行します。GATE:AccessoryMaxTriangles、MaxTextureSize、およびタイプのアタッチメントのSizeとOffsetを記録します。オフラインのゲートではこれらの値を使用します。 - Studio でプレビューと監査。 目的:配置先にアセットを置き、測定します。方法:パック済みのメッシュとマップを
ra.stageでステージングし、次にMeshBuild.buildとAssetAudit.propを実行します。GATE:Sizeが Blender のサイズと 0.01 スタッド以内で一致し、三角形数が一致し、監査エラーがなく、正面キャプチャに正面が表示されていること。 - アクセサリーを作成。 目的:タイプに応じた名前の Accessory、Handle、アタッチメントを 1 つ作成します。方法:
MeshBuild.accessoryを実行し、続けてAssetAudit.accessory(acc, rules)を実行します。GATE:エラーがゼロであること。AvatarPartScaleTypeのみ警告として残ります(Accessory Fitting Tool が追加します)。 - 装着テスト。 目的:正しく装着されることを確認します。方法:Edit で
UGCCheck.rigとUGCCheck.wearを実行し、正面と側面をキャプチャします。GATE:ジョイントが存在し、アタッチメントの誤差が 0.01 スタッド未満で、opening.clearsが成立し(クラウンが頭頂部で少なくとも頭の幅以上あり)、キャプチャでつばが頭に載っていること。 - ローカルで検証。 目的:アップロード時にしか確認できない文字列だけを残します。方法:
Playtestでra.stage(..., dm="Server")とUGCCheck.validate(acc, Enum.AccessoryType.Hat)を実行します。単一障害のコピーをネガティブコントロールとして実行し、60 秒あたり最大 10 回呼び出します。GATE:アイテムが文字列なしで有効と返され、すべての障害コピーが失敗すること。 - インポートを引き継ぐ。 目的:出荷までの手順を確定します。方法:担当者またはコンピューター操作エージェントが、gui-paths.md の設定で
<name>_roblox.glbをインポートします。Accessory Fitting Tool が最終的なアクセサリーを生成します。GATE:インポートした MeshPart の Size がプレビューと一致し、P7 が再度監査すること。
数値
| 値 | 対象 | 出典 |
|---|---|---|
| 20,000 三角形 | 1つの場所にある1つのメッシュ | Creator Docs |
| 4,000 三角形 | 剛体またはレイヤー化されたアクセサリー | Creator Docs;ライブの AccessoryMaxTriangles |
| 60,000 頂点、20,000 三角形 | 1つの EditableMesh。四角形は2としてカウント | EditableMesh reference |
| 2 x 2 x 2 スタッドあたり 256 px | テクスチャの辺の長さ。次の2の累乗 | Texture specifications |
| 4096 px | 場所のテクスチャ(2026-01-30以降) | DevForum |
| 1024 px | アバターの ColorMap、ライブの MaxTextureSize。その他のアバターマップは256 | Validation system;ライブ |
| 1024 px | EditableImage の辺の長さ | AssetService reference |
| 帽子 3 x 4 x 3 スタッド | AvatarPartScaleType なし、または Classic の場合。ProportionsNormal は 1.87 x 2.5 x 1.87 | ライブのルールとバリデーター;アクセサリーの仕様 |
| 10 個 | アクセサリーの MeshPart あたりの分離したコンポーネント数 | Validation #187 |
| 0.05~4.0 スタッド | アバターパーツの MeshPart の軸ごとのサイズ | Validation #176, #177 |
| 0.02 | AlphaMode Transparency の場合にソフトアルファを実現する、最小の MeshPart.Transparency | SurfaceAppearance |
| 0~40 | Marketplace アイテムの EmissiveStrength | SurfaceAppearance |
| 1.35 スタッド | 帽子のクラウン開口部。デフォルトの高さ 1.16 スタッドの R15 ヘッド用 | [追加、着用テスト] |
| 0.3 スタッド | メッシュの底面より上にある帽子のアタッチメント:つばは頭の高さの4分の1だけ頭頂部より下 | [追加、着用テストとフィット確認用レンダリング] |
| 60秒あたり10回 | ValidateUGCAccessoryAsync のレート制限 | ライブのエラー文字列 |
品質ゲート
測定可能な項目:
- Blender レポート:すべての
ra.gatesエントリーに合格し、未加工の入力は本来失敗すべき項目で失敗する(ネガティブコントロール)。 - Studio:
AssetAuditでエラーが返されず、Sizeと三角形数がレポートと一致する。 - 着用時:ジョイントがあり、アタッチメントの誤差が 0.01 スタッド未満。
- バリデーター:アップロードなしで修正できる文字列が残っていない。
視覚的な確認(接触シート1枚、最大1,600 px。開いて内容を確認):
- 各アセットの正面をカメラの -Z 方向に向け、プロップは地面に立たせます。黒い部分や裏返しの部分がないことを確認します。
- 帽子が正面と側面の両方で頭に装着され、浮いたり、つばを越えて頭に沈み込んだりしていないことを確認します。
- テクスチャがコンセプトどおりに見え、ディテールが適切な位置にあり、アトラスがにじんでいないことを確認します。
完了と判断する前に、critique.md を使って結果を評価してください。
よくある間違い
| 間違い | 症状 | 修正 |
|---|---|---|
| ユニットサイズの GLB をそのままインポートする | レンガほどの大きさになる | Blender でスタッド単位にスケールします。Scale Unit Studs |
| glTF 入力でヨー回転を指定しない | ロックまたは正面が背面を向く | エクスポート前に yaw: 180 |
| 穴を隠すために両面表示にする | 検証で境界エッジエラーが発生し、三角形が二重になる | Blender で穴を閉じます |
holes_fill を信頼する | 修正後も「水密ではありません」と表示される | ループに蓋をし、デシメーション後に修復して、再カウントします |
| Studio でのデシメーションに頼る | アップロード時に三角形が 4,000 個を超える | Blender で 3,800 個までデシメーションします |
| パックされたメタリック・ラフネスマップを 1 つのマップとして使う | 全体が金属になる、または金属にならない | G と B をグレースケールマップに分割します |
| 部分的な金属度をそのままにする | 金属が色付きでプラスチックのように見える | マスクを読み取った後、0 または 1 に丸めます |
| アクセサリにアルファ付きの ColorMap を使用する | 検証エラー #145、透けて見える箇所が発生する | opaque_color |
| TextureID と SurfaceAppearance の両方を設定する | 検証エラー #146 | どちらか一方にします |
| アクセサリに属性やタグを残す | 検証エラー #191 | 検証前に削除します |
| アクセサリのピボットを足元に置く | 「メッシュデータが中央に配置されていません」 | ピボットを中央に配置します |
| フィッティングボックス内で帽子を回転させる | メッシュが内側に見えてもボックスが赤くなる | Blender で再び中央に配置し、向きを調整します |
| つばを基準に帽子のサイズを決める | 頭がクラウンから突き出る | scale.opening、続いて opening.clears |
Handle の Massless を true にする | バリデーターに「false である必要があります」と表示される | デフォルトのままにします |
クライアントから自分のキャラクターに AddAccessory を実行する | ジョイントがなく、帽子が落ちる | サーバーでアタッチし、CFrame でローカルプレビューを配置します |
| サーバー上で Editable コンテンツから帽子のメッシュとテクスチャを作成する | クライアントで Handle に小さなチェック柄の立方体が表示される | ジョイントはサーバーに保持し、各クライアントでローカルに構築したメッシュ(ApplyMesh)と SurfaceAppearance を適用します(手順 P8) |
| EditableMesh のプレビューが保存されると思い込む | 再度開くとパーツが空になる | セッション内のみです。実際に使うにはインポートします |
| プレイテストで編集プレビューが表示されると思い込む | コピーしたパーツには Size があるが、メッシュがない | そのデータモデル内で配置して構築します |
引き継ぎ
- scenario-3d から受け取ります:PBR マップ付きの GLB または FBX メッシュ(画像からの3D生成、リメッシュ、テクスチャの再適用、リギング)。デシメーションでシルエットが損なわれた場合は、リメッシュの実行を依頼してください。
- scenario-textures から受け取ります:1つのメッシュ用の PBR セット。ここでは SurfaceAppearance に変換します。タイル可能なセットは、MaterialVariants として scenario-roblox-environment に渡します。
- scenario-game-assets から受け取ります:scenario-3d がメッシュに変換するコンセプト画像(中央に配置した被写体1つ、シンプルな背景、正面図)。アイコン、スプライト、UI アートは scenario-roblox-ui に、デカールは scenario-roblox-environment に渡します。
- scenario-roblox-environment に渡します:実寸で底面にピボットを設定した MeshParts、推奨する CollisionFidelity、およびゲートレポート。配置、最終的なフィデリティと LevelOfDetail の設定、ライティングは同シナリオで行います。
- scenario-roblox-animation に渡します:スケールと向きを確認した、リギング済みまたはスキニング済みのインポートデータ。
- scenario-roblox-performance に渡します:インポートの各バッチを渡し、メモリとバッチ処理の監査(
references/memory-and-crowds.md、PerfAudit.assets)を依頼します。このスキルではその監査を繰り返しません。
Roblox の最新情報
EditableMeshとEditableImageはInstance.newでは作成できません。AssetService:CreateEditableMesh()、CreateEditableImage()、Content.fromObjectを使用してください。公開済みのエクスペリエンスでは、Mesh API と Image API の設定が必要です。CreateSurfaceAppearanceAsyncが受け取るのは EditableImage コンテンツのみです。マップは後から差し替えられません。- Avatar Joint Upgrade では、剛体アクセサリーはウェルドではなく
RigidConstraintで接続されます。アタッチメントの検索にはFindFirstChild(name, true)を使用してください。 GenerateMeshAsyncは非推奨になる予定です。代わりに、スキーマCar5またはBody1を指定してGenerationService:GenerateModelAsyncを使用します。- 2026-01-30 以降、Places では 4096 px のテクスチャを使用できます。アバターの制限は
GetValidationRules()で確認できます。 - Studio MCP はプラグイン権限で実行されます。Edit では
SurfaceAppearance.ColorMap、ColorMapContent、MeshPart.CollisionFidelityをエラーなしで書き込めました。ゲームスクリプトの権限は少ないため、出荷前に Script でスニペットをテストしてください。 generate_mesh(Studio MCP)が返すのは{generationName, tag}のみで、セグメント分割された MeshParts、アセット ID、TextureID を含む Model を挿入します。size、maxTriangles、segmentationを渡してください。
参考資料
- references/expert-notes.md:ソースごとの原則、見解の相違、実際の実行で得られた追加情報。
- references/procedures.md:P1 から P11 までの完全なコード、テスト ID、結果。
- references/avatar-item-checks.md:各ラッパーが内部で呼び出すエンジン API、複数のボディでの動作、6方向からの不透明度、傾き、Fitting Tool に残る項目(Unknown type、TexturePack、MeshSize)。
- references/critique.md:自身の出力に対するブロッキングチェックと品質チェック。
- references/gui-paths.md:Importer、Accessory Fitting Tool、検証プラグイン、Blender のパス。
- references/sources.md:認証情報とタイムスタンプを含む、すべてのドキュメントと動画。
- scripts/rbx_assets.py:GLB のトリアージ、マシンガード付き Blender ランナー、ゲート、テクスチャサイズの設定、ペイロード、キットランナー。
- scripts/blender_roblox_prep.py:ヘッドレス Blender による検査および準備処理。
- scripts/agentkit/assets/:
Payload、MeshBuild、AssetAudit、UGCCheck。