Unityゲーム画面用のFigma Make(Figma AI)投入プロンプトを壁打ちで設計・生成する。UI Toolkit(UXML/USS)への変換を見据えた制約込み。ユーザーが「Figma用のプロンプトを作りたい」「画面デザインの壁打ちをしたい」と言ったら使う。
uitk-import
デザイン(Figma MCP出力・HTML/CSS・デザイン仕様)からUI Toolkit用UXML/USSを生成し、Unityへのインポート・シーン配置・コンパイル・スクショ検証・ゲームロジック結線検証まで自動で行う。「この画面をUnityに取り込んで」「UXML/USSにして」で使う。
含まれるファイル(2)
- SKILL.md13.3 KB
- references/css-to-uss-checklist.md4.9 KB
SKILL.md(原文)
インストールする前に、エージェントに与えられる指示の中身を確認できます。
uitk-import: デザイン→UXML/USS→Unity検証 自動化スキル
デザインソースからUnityで表示・動作確認済みのUXML/USSを作るまでの全工程。
前提
- Unityプロジェクトを unity-cli-loop(uLoopMCP) で操作できること(
uloop-compile/uloop-screenshot/uloop-execute-dynamic-code等の同梱スキルを使う) - UI Toolkitの画面確認はwindowモードスクショ、UI操作はSendEvent方式で行う(
uloop-uitk-interactスキル参照。renderingモードはUI Toolkitが正しく写らず、simulate-mouse系はUI Toolkitに届かない) - 生成後のUSSは references/css-to-uss-checklist.md で必ず自己検査する
- プロジェクト固有の設定(UXML/USSの配置先・機能要件や要素名の契約・結線するコントローラ名)は、プロジェクトの CLAUDE.md や要件ドキュメントで指定されている前提。無ければ人間に確認する
手順
0. 前提チェック(ゲート — 満たさなければ中断して人間に依頼)
- MCPツールの存在確認: ローカルDev Modeサーバー(Figmaデスクトップアプリ内蔵)のMCPツール(get_metadata等)がツール一覧に見えるか確認。見えない場合は代替手段で進めず中断して人間に報告する。MCP接続はセッション開始時にしか張られないため、復旧はFigmaデスクトップアプリ(対象ファイルを開いた状態)を先に起動してからセッションを開き直してもらうのが確実。似た名前のリモートコネクタ(選択ノードを取得できないもの)と取り違えないこと
- フレームサイズ検査:
get_metadataで選択フレームの width/height を確認。Game Viewの検証解像度(推奨1920x1080)と不一致なら中断し、Figma側でのリサイズを人間に依頼する(一致しないとピクセル比較が成立しない) - 正解画像の確認: 正解画像置き場(例:
docs/design-refs/<画面名>.png)に人間がFigmaからエクスポートしたPNG(1x・検証解像度と同サイズ)があるか確認。無ければ人間に依頼する(Figmaで対象フレームを右クリック→Export)- MCPの
get_screenshotはチャット内でしか画像を見られずファイル保存できない。目視比較には使ってよいが、正解画像の代わりに自作のHTML再現を使うことは禁止(自分の再現物と照合する循環評価になり、ground truthが失われる)
- MCPの
1. 入力の正規化
- Figma MCP経由の場合:
get_variable_defs→get_design_context(get_code) →get_screenshot(目視用)get_variable_defsが{}なのは正常系(Figma Make生成物はFigma Variablesを持たない)。トークンの正は次の優先順で採用する: ①壁打ちで確定したデザイン選好ドキュメント(例:docs/デザイン選好.md) ②get_design_contextのCSS実測値- get_codeのReact+Tailwind出力は「デザインの表現」であって最終コードではない。UXML/USSへ翻訳する(Figma公式の位置づけ)
- HTML/CSSやテキスト仕様の場合: 要素ツリーとスタイル値を抽出してから変換に入る
1.5. 要件対照チェック(実装前・必須)
デザインの要素一覧と機能要件を突き合わせ、要件にない要素を列挙する(例: 設定/実績ボタン・装飾的な統計表示など、生成AIが自主的に追加しがちな要素)。各要素を 残す(装飾) / 消す / ロジック結線する のいずれにするか人間に確認してから実装する(プロジェクト側で方針が決まっていればそれに従う)。
動的生成コードとの契約ズレも同時に確認する: デザインの構造(例: リスト行のアイコン・レート表示・バッジ)が、実行時にコードが生成する構造より豊かな場合、デザイン側を先回りして貧しくしない。人間に確認の上、このワークフローの中でコントローラ側の生成コードを拡張し、手順5の結線検証で確かめる。
演出仕様も要件として取り込む: アニメーション・エフェクト(押下時スケール、カウント加算の浮遊表示等)は、デザインを静的ファイルに貼り出した時点で失われておりMCPからは取得できない。壁打ちログ等の演出仕様(どの操作で何がどう動くか)を確認し、USSの transition / コントローラ側実装としてこのワークフローの中で実装する。演出仕様が文書に無ければ人間に確認する。
2. UXML/USS生成
- トークンはハードコードせずUSSカスタムプロパティにする:
:root { --color-primary: #xxxxxx; }→color: var(--color-primary);(var()は関数の中では使えない点に注意) - 配置先: プロジェクト指定のUIディレクトリ(例:
Assets/_Project/UI/<画面名>.uxml/<画面名>.uss) - 絵文字はそのまま使う(🍙等)。「Unityでは豆腐化する」と思い込んで図形や画像に代替しない — UI Toolkitはシステムの絵文字フォントにフォールバックし、300px程度までカラー描画できる(Unity 6 / macOSで実機検証済み。他OSビルドでは要再確認)。歯車等は字形バリアント注意(
⚙ではなく⚙️=U+FE0F付き) - フォント: デザインが指定するフォントが未導入なら、このワークフローの中で導入する(事前に仕込まない)。再配布可能なライセンス(OFL等)か確認し、ライセンス文を同梱し、プロジェクトのクレジット記録(参考文献ドキュメント等)に追記した上で、USSから相対参照する:
.root { -unity-font-definition: url("../Fonts/YourFont-Regular.ttf"); } - インタラクション状態も写す: デザインのhover/押下表現を
:hover/:active+transitionで再現する(例:.main-button { transition: scale 0.08s ease-out; } .main-button:active { scale: 0.92; }) - 生成直後に references/css-to-uss-checklist.md の全項目で自己検査し、違反を直してから次へ進む
3. シーン配置(検証用シーンを新規作成 — 既存シーンに触らない)
既存シーンは変更しない。 検証は専用シーン(例: Assets/_Project/Scenes/UITKImportTest.unity)で行う。
以下のcsxをテンプレートとして execute-dynamic-code --code-file で実行する(__UXML_PATH__ / __SCENE_PATH__ / __PANEL_SETTINGS_PATH__ / __THEME_PATH__ を差し替え)。
注意: csx内に絵文字リテラルを書くと不安定。絵文字が必要な場合は \U0001F359 形式のエスケープを使う。
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;
using UnityEditor.SceneManagement;
AssetDatabase.Refresh();
string uxmlPath = "__UXML_PATH__"; // 例: Assets/_Project/UI/TitleScreen.uxml
string scenePath = "__SCENE_PATH__"; // 例: Assets/_Project/Scenes/UITKImportTest.unity
string panelSettingsPath = "__PANEL_SETTINGS_PATH__"; // 例: Assets/_Project/UI/ScreenPanelSettings.asset
string themePath = "__THEME_PATH__"; // 例: Assets/_Project/UI/UnityDefaultRuntimeTheme.tss
// 検証用シーンを開く(なければ新規作成して保存)
// ※必ずシーン切替を先に行うこと。シーン切替(NewScene/OpenScene)の前に取得したアセット参照を
// 切替後のオブジェクトに代入すると、保存時に参照が失われることがある(実測)
var scene = EditorSceneManager.GetActiveScene();
if (scene.path != scenePath)
{
if (AssetDatabase.LoadAssetAtPath<SceneAsset>(scenePath) == null)
{
var newScene = EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single);
EditorSceneManager.SaveScene(newScene, scenePath);
scene = newScene;
}
else
{
scene = EditorSceneManager.OpenScene(scenePath);
}
}
// PanelSettings(共用アセットを再利用、なければ作成)— シーン切替の後に読み込む
var panelSettings = AssetDatabase.LoadAssetAtPath<PanelSettings>(panelSettingsPath);
if (panelSettings == null)
{
var theme = AssetDatabase.LoadAssetAtPath<ThemeStyleSheet>(themePath);
panelSettings = ScriptableObject.CreateInstance<PanelSettings>();
panelSettings.themeStyleSheet = theme;
panelSettings.scaleMode = PanelScaleMode.ScaleWithScreenSize;
panelSettings.referenceResolution = new Vector2Int(1920, 1080);
AssetDatabase.CreateAsset(panelSettings, panelSettingsPath);
}
var existing = GameObject.Find("ImportedUI");
if (existing != null) Object.DestroyImmediate(existing);
var go = new GameObject("ImportedUI");
var uiDoc = go.AddComponent<UIDocument>();
uiDoc.panelSettings = panelSettings;
uiDoc.visualTreeAsset = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(uxmlPath);
EditorSceneManager.MarkSceneDirty(scene);
EditorSceneManager.SaveOpenScenes();
return "scene=" + scene.path + ", uxml=" + (uiDoc.visualTreeAsset != null);
3.5. 配置後の必須確認
csx実行後、PlayModeに入る前に参照が保存されたか確認する(execute-dynamic-codeで
doc.panelSettings != null && doc.visualTreeAsset != null をチェック)。nullならシーンを開いた状態で再代入して保存する。
症状: panelSettingsがnullのままPlayすると、エラーも出ずにUIが一切描画されない。
4. コンパイル→スクショ→自己評価ループ
npx --yes uloop-cli@<バージョン> compile --project-path <proj>
npx --yes uloop-cli@<バージョン> control-play-mode --action Play --project-path <proj>
npx --yes uloop-cli@<バージョン> screenshot --window-name Game --output-directory <スクショ保存先> --project-path <proj>
自己評価は必須ゲート(スクショを撮らずに完了と言わない)。正解画像は手順0で確認した人間エクスポートのPNGを使い、以下の4観点を別々に評価する:
- レイアウト: 要素の位置・整列・重なり・見切れ(正解画像とスクショを並べて比較)
- 色・トークン準拠: 主要色がトークン値と一致するか(目測せずUSSの値とデザイン側の値を突き合わせる)
- テキスト: 文言・フォントサイズ・折返し・文字化け(日本語フォント)
- 余白・サイズ: 基準余白の一貫性、ボタン等の実寸
不一致があればUSS/UXMLを修正して手順4を繰り返す(最大5回。収束しない場合は人間にエスカレーション)。
5. 結線検証(見た目OKの後・必須)
UIは表示できてもゲームロジックが付いていなければ動作確認になっていない。
ImportedUIにプロジェクト指定のコントローラ(例:ClickerScreenController)をAddComponentで付与する- Play →
uloop-uitk-interactの方式(SendEvent)でクリック等の操作を実行し、ラベル値をreturnで検証する(要素名・クラス契約がC#と噛み合うかの確認) - スクショで動作後の見た目も確認(動的生成された要素がUSSスタイルと噛み合っているか)
- ※
:activeなどの押下表現・演出(浮遊テキスト等)はSendEventや静止画では確認しきれない。演出仕様との照合を人間レビュー項目として明記し、実装漏れがないかレビュー依頼時に列挙する
- ※
6. 後始末とコミット
- Playモード停止(
control-play-mode --action Stop) - スクショ(失敗版含む)は削除せず保存したままにする(試行錯誤の記録として価値がある)
- 工程ごとにコミット:
feat(ui): <画面名>のUXML/USS生成→feat(ui): <画面名>検証OKなど
精度のための決まりごと
- Figmaフレームは検証解像度(推奨1920x1080)で作らせる(Game Viewの解像度と一致させ、ピクセル比較を成立させる)。手順0でゲート済み
- 正解画像との比較は「見た印象」ではなく要素単位で座標・サイズ・色を列挙して差分を書き出す
- 「AIがスクショを見て問題なしと判定しても人間には崩れて見える」ケースは実際に起きる。最終判定は人間。ループの終わりに必ずスクショのパスを提示してレビューを求める
- 検証せずに「できない」と判断しない(例: 「絵文字は豆腐化するはず」という思い込みで図形に代替して品質を落とした実例がある)。不確かな制約は最小の実機テストで確認してから代替策を取る
レビュー
まだレビューはありません。使ってみた感想をお寄せください。
同じリポジトリのスキル
概要と使いどころ
Clear Unity Console entries. Use before compile, tests, or debugging when stale logs would hide the current result.
日本語の概要は準備中です。原文の説明を表示しています。
Compile the Unity project and report errors/warnings. Use after C# edits or when a full Domain Reload compile is needed.
日本語の概要は準備中です。原文の説明を表示しています。
Control Unity Editor Play Mode. Use to start, stop, or pause Play Mode for runtime behavior checks and frame inspection.
日本語の概要は準備中です。原文の説明を表示しています。
Execute C# with Unity APIs when existing uloop tools cannot inspect or edit enough. Use for scene, prefab, SerializedObject, AssetDatabase refresh/.meta generation, menu, or PlayMode automation.
日本語の概要は準備中です。原文の説明を表示しています。
Find or inspect Unity GameObjects, especially objects the user currently selected in the Hierarchy. Use for details, components, tags, layers, or name/path searches.
日本語の概要は準備中です。原文の説明を表示しています。