Generates Unity UI prefabs from design JSON via the project's UIGenerator workflow. Use when modifying or extending UI generation, adding layer rules, sprite fallbacks, button bindings, hierarchy organization, moving prefabs to UI folders, or BaseUIView script generation. Trigger terms: UIGenerator, Generate from JSON, default sprite folder, UI prefab from JSON, hierarchy 整理, anchorPosition 覆盖, BaseUIView, Generate UI Components, 优化 prefab 节点名称, 优化 Hierarchy 节点名称, 功能性组件优先, 创建对应名称脚本, StartPanel 参考.
优先使用 Unity MCP 进行操作,而不是修改项目代码。
execute_menu_item("Assets/UI Generator/Generate UI"),或使用 Tools/UI Generator/Generate from JSON 选文件生成。manage_scene 加载/保存/获取层级;manage_gameobject 在场景中创建、修改、移动、删除 GameObject(如创建 Cube、改位置、改父节点)。manage_prefabs 查看/修改 prefab 内容;manage_asset 查询、移动、复制资源;读取 prefab 的 YAML 文件做分析。manage_editor 播放/暂停/停止;read_console 查错;refresh_unity 刷新资源与编译。Tools/UI Generator, default sprite folder, or generating prefabs from design JSON.Assets/Game/UI, or generating BaseUIView partial script..prefab file; see 1.5 优化已有 prefab 的节点名称. By default, only optimize functional components (_btn/_txt/_img/_toggle/_state); skip non-functional (decorative) nodes unless user asks for full optimization.Menu(可用 MCP 直接执行,无需改代码)
Tools/UI Generator/Generate from JSON — open file panel, pick JSON under Assets.Assets/UI Generator/Generate UI — context menu on selected .json asset(先选中 JSON 再执行).execute_menu_item("Assets/UI Generator/Generate UI");或 execute_menu_item("Tools/UI Generator/Generate from JSON") 用文件对话框选 JSON。Pipeline(自动按顺序执行)
UIGeneratorMenu.GenerateUIPrefab(jsonPath) 加载 UIGeneratorSettings.Instance,构建 UIGeneratorConfig,创建 UIGenerator(config),调用 GenerateUIPrefab(jsonPath)。RebuildHierarchyByRectContainment)按 rect 覆盖关系整理树状层级;SimplifyNodeNames)按 1.5 的命名规则对 _btn/_txt/_img/_toggle/_state 节点改名;settings.outputPath,销毁临时根。Settings (preset)
Tools/UI Generator/Settings or load from Assets/Game/Editor/UIGenerator/UIGeneratorSettings.asset.outputPath, defaultTMPFont, defaultSpriteFolder.config.DefaultSpriteFolder = settings.defaultSpriteFolder). Paths use forward slashes.Game.Editor.UIGenerator): takes UIGeneratorConfig, produces a root GameObject (Canvas + root with artboard name).type and naming):
LayerData.IsTextLayer (type == "textLayer") → CreateTextLayer (TextMeshProUGUI, name lower + _txt).IsShapeLayer → CreateShapeLayer (Image, default color from config).IsImageLayer (type == "layer") → CreateImageLayer (Image, sprite load; optional button + triggers).layerName with extensions .png, .jpg, .jpeg (paths normalized to Assets, forward slashes).AssetDatabase.FindAssets("t:Sprite", new[] { folder }), then match by filename without extension (case-insensitive) to RemoveExtension(layerName)._btn_ get:
GetTypeFromAssemblies("CustomButton")).GetComponentsInChildren<ButtonClickTrigger>(), so ClickAudio and ClickScaleAnim on the same GameObject are used automatically.Path.Combine(...).Replace('\\', '/') or string.Replace('\\', '/') for Unity/Assets paths._icon_ in layer name → Image raycastTarget = false. _btn_ → button + triggers.nameWithoutExtension.ToLower() + "_txt".执行 UIGenerator 时,以下步骤按顺序自动执行(保存前在内存中完成):1. Hierarchy organization → 1.5 节点名称精简(代码中 SimplifyNodeNames,与 1.5 命名规则一致)→ 保存 prefab。保存后:2. Move prefab to UI folder (if applicable) → 3. 检查是否存在对应界面脚本 → 4. Optional: BaseUIView script generation。
3. 检查是否存在对应界面脚本(生成好界面后必须执行):
NoAdsPopup.prefab)得到面板名 {PanelName}(即文件名无扩展名)。Assets/Game/UI/{PanelName}/Scripts/{PanelName}.cs 是否存在(若 prefab 在 Assets/Game/UI/{X}/Resources/ 下,则 PanelName 取 X 或 prefab 文件名;若在 Generated 等通用目录,则 PanelName = prefab 文件名无扩展名,并检查是否存在 Assets/Game/UI/{PanelName}/ 及其中 Scripts)。Assets/Game/UI/{PanelName}/Scripts/ 下创建 {PanelName}.cs(参考 StartPanel.cs 的继承与 Create/OnOpen 结构)。MCP 可做:manage_asset(action="get_info"|"search") 查 prefab 路径与资源;直接读取 Assets/.../xxx.prefab 的 YAML 分析层级与名称;manage_scene 在场景中创建/调整物体。对已有 prefab 文件做 hierarchy/改名 若项目未提供对应菜单,则需加菜单或改代码;有菜单时用 execute_menu_item 触发即可。
生成时自动执行:在 UIGenerator 流程中,保存 prefab 前会先执行 SimplifyNodeNames;仅对原本就带 _btn/_txt/_img/_toggle/_state 后缀且组件匹配的节点做全面优化,其他节点做简单优化(不增加后缀)。
已有 prefab 单独优化时:当用户要求「优化某 prefab 的 Hierarchy 节点名称」且不重新跑生成时,优先通过直接编辑 prefab 的 YAML 文件完成,不修改 C# 脚本。
优先跳过非功能性组件:
_btn、_txt、_img、_toggle、_state 且组件匹配的节点,BaseUIViewEditor 会扫描绑定,必须优化以便生成字段。适用场景:对 Assets/Game/Prefabs/UI/Generated/xxx.prefab 或 Assets/Game/UI/xxx/Resources/xxx.prefab 等已有 prefab 做节点命名优化。
做法:
read_file 读取目标 .prefab 文件(Unity 预制体为 YAML 格式)。m_Name: 原名称(GameObject 的 serialized 名称)。search_replace),将 m_Name: 原名称 改为 m_Name: 新名称。命名规则(分两类):
UI_、UI_L_、面板/artboard 名、尾部 _01/_02 等,小写+下划线保留语义;过长文案可收束(如 thebestway..._txt → quote_txt)。便于 BaseUIViewEditor 识别。UI_、UI_L_、尾部 _01/_02,中间小写+下划线保留语义;不增加 _img、_btn 等额外后缀。例如 UI_shengli_bak_xia_01 → bak_xia(不改为 bak_xia_img)。title_txt),则在名称中插入数字区分:第一个保持 title_txt,第二个为 title_2_txt,第三个为 title_3_txt,依此类推(格式:base_num_suffix)。避免 BaseUIView 生成字段重名。GameVictoryPanel、胜利常态2)一般不改。示例映射(便于实现时对照):
thebestwaytopredictthefutureistocreateit_txt → quote_txt;nextlevel_txt → next_level_txt;UI_shengli_btn_next_01 → next_btn(原名含 _btn,保留后缀)。UI_shengli_bak_xia_01 → bak_xia;UI_shengli_bak_shang_01 → bak_shang;UI_shengli_pic_gongxi_01 → pic_gongxi;UI_L_shengli_pic_zhuese_01 → pic_zhuese(均不追加 _img 等后缀)。title_txt → title_txt、title_2_txt;三个 close_btn → close_btn、close_2_btn、close_3_btn。RectTransformUtility / world corners then transform to root local)._btn + CustomButton_txt + TextMeshProUGUI_img + Image_toggle + Toggle_state(无组件要求,视为 GameObject)_btn / _txt / _img / _toggle / _state;中间部分:去掉 UI_、面板名/artboard 名、尾部 _01/_02 等,小写+下划线保留语义(如 setting_huang_btn、close_btn)。不要改成 PascalCase(那是 FieldName)。gameObject.name = newName(prefab 内修改后需 SetDirty/ApplyPrefab)。SaveAsPrefabAsset, open prefab, run hierarchy pass + name simplification, save). Use EditorUtility.SetDirty / prefab apply when modifying in editor.Assets/Game/UI/:
StartPanel, GamePanel, SettingPopup, LevelChoicePanel, Popup (shared).StartPanel.cs, StartPanel.Generated.cs), Resources/ or Prefabs/ (prefabs), Sprites/ (art, JSON).{fileName}.prefab (e.g. StartPanel.prefab):
Assets/Game/UI/{fileName}/ exists (e.g. Assets/Game/UI/StartPanel/).Assets/Game/UI/StartPanel/Resources/StartPanel.prefab). Prefer Resources if the panel is loaded at runtime via Resources.Load; use Prefabs if only referenced in editor/scenes.Assets/Game/Prefabs/UI/Generated), or optionally move to a global Assets/Game/UI/Resources (or similar) if you want a single place for “unassigned” generated prefabs.public partial class GamePlayPanel : BaseUIView).Assets/Game/Editor/BaseUIViewEditor.cs): CustomEditor for BaseUIView. It:
{ClassName}.Generated.cs in the same directory as the main script (via GetScriptPath → GetPartialScriptPath). The generated file declares [SerializeField] private fields for CustomButton, TextMeshProUGUI, Image, Toggle, GameObject by naming.StartPanel.cs) must already exist under Assets/Game/UI/{PanelName}/Scripts/ and be a partial class inheriting BaseUIView.Assets/Game/UI/{PanelName}/Resources/, user opens prefab, adds BaseUIView (or the existing panel script) to root, then in Inspector clicks “Generate UI Components”, waits for compile, then “Bind Components to Inspector”.Tools/UI Generator/Generate View Script for Selected Prefab or run after Generate): ensure root has a BaseUIView component; call BaseUIViewEditor logic programmatically (e.g. get Editor via Editor.CreateEditor, invoke the method that does ScanChildObjects + GeneratePartialClassCode + SavePartialScript), then prompt user to run “Bind Components to Inspector” after compile, or run binding via reflection if safe.{PanelName}.cs under Assets/Game/UI/{PanelName}/Scripts/, either (1) add a command that creates a minimal partial class stub (e.g. public partial class {PanelName} : BaseUIView { }) and the folder structure, then run generation, or (2) document that user creates the script and folder first, then generates prefab and runs “Generate UI Components” + “Bind Components to Inspector”.新建面板时,在 Assets/Game/UI/{PanelName}/Scripts/ 下创建与面板同名的主脚本 {PanelName}.cs,继承与结构参考 StartPanel。
Assets/Game/UI/{PanelName}/Scripts/{PanelName}.cs(PanelName 与 UI 文件夹名一致,如 StartPanel、ShopPanel、NoAdsPopup)。public partial class {PanelName} : BaseUIView;如需与项目一致可加接口,例如 , IDebuger, IEventSender(参考 StartPanel)。Bear.UI(BaseUIView)、Bear.EventSystem / Bear.Logger(若用接口)、Game.Events 等按需;TMPro 若用到再加。public override void OnOpen() 中调用 base.OnOpen(),再挂接按钮等逻辑(如 XxxBtn.OnClick += Handler)。var panel = UIManager.Instance.OpenUI<{PanelName}>($"{typeof({PanelName}).Name}", UILayer.Normal); return panel;{PanelName}.Generated.cs,编译后再「Bind Components to Inspector」。参考:Assets/Game/UI/StartPanel/Scripts/StartPanel.cs(继承 BaseUIView, IDebuger, IEventSender、OnOpen、Create 写法)。
| File | Role |
|---|---|
Assets/Game/Editor/UIGenerator/UIGenerator.cs | Core generator; layer creation, LoadSprite, button/trigger binding. |
Assets/Game/Editor/UIGenerator/UIGeneratorMenu.cs | Menu items; builds config from Settings, runs generator, saves prefab. Can extend with post-prefab steps (hierarchy, move, optional view script). |
Assets/Game/Editor/UIGenerator/UIGeneratorSettings.cs | ScriptableObject preset (output path, font, default sprite folder). |
Assets/Game/Editor/UIGenerator/Models/UIGeneratorConfig.cs | Runtime config (resolution, DefaultFont, DefaultSpriteFolder, PlaceholderColor, etc.). |
Assets/Game/Editor/UIGenerator/Models/LayerData.cs | JSON layer (Id, Index, Name, Type, X, Y, Width, Height, TextInfo); IsTextLayer, IsShapeLayer, IsImageLayer. |
Assets/Game/Editor/BaseUIViewEditor.cs | Generates .Generated.cs and binds components for BaseUIView; GetScriptPath, GetPartialScriptPath, ScanChildObjects, GeneratePartialClassCode, BindComponentsToInspector. |
Assets/Game/UI/{PanelName}/Scripts/*.cs | Panel partial class + .Generated.cs; prefabs in Resources/ or Prefabs/. |
execute_menu_item、manage_scene、manage_gameobject、manage_prefabs、manage_asset 等完成的(如触发生成、在场景中加物体、移动资源),不新增或修改脚本。layer.Type or name pattern, then a dedicated CreateXxxLayer(layer, obj, jsonPath)._btn_ block.Assets/Game/UI/{Name}/Resources/ or Prefabs/ when folder exists, then optionally hook into BaseUIViewEditor for script generation/binding.