UI 系统

This commit is contained in:
2026-06-08 11:26:17 +08:00
parent 1897658a00
commit b582317692
94 changed files with 33540 additions and 3726 deletions

View File

@@ -145,10 +145,17 @@ namespace BaseGames.Editor
GameObject settingsRootGo = GetOrCreateChild(uiRootGo.transform, "SettingsRoot").gameObject;
GameObject mapRootGo = GetOrCreateChild(uiRootGo.transform, "MapRoot").gameObject;
GameObject shopRootGo = GetOrCreateChild(uiRootGo.transform, "ShopRoot").gameObject;
// 形态技能一览 / 能力解锁总览(实例化预制件,注册为 PanelId.FormSkills / Abilities供暂停菜单打开
GameObject formSkillRootGo = EnsureUIPanelInstance(uiRootGo.transform, "FormSkillRoot",
"Assets/_Game/Prefabs/UI/UI_FormSkillPanel.prefab", report);
GameObject abilityRootGo = EnsureUIPanelInstance(uiRootGo.transform, "AbilityRoot",
"Assets/_Game/Prefabs/UI/UI_AbilityOverviewPanel.prefab", report);
pauseRootGo.SetActive(false);
settingsRootGo.SetActive(false);
mapRootGo.SetActive(false);
shopRootGo.SetActive(false);
formSkillRootGo.SetActive(false);
abilityRootGo.SetActive(false);
GameObject deathCanvasGo = GetOrCreateCanvas(uiRootGo.transform, "DeathScreen Canvas", 10);
GameObject deathRootGo = GetOrCreateChild(deathCanvasGo.transform, "DeathScreenRoot").gameObject;
@@ -268,7 +275,7 @@ namespace BaseGames.Editor
// UIManager uses _panels (PanelRegistration[]) — NOT individual _pauseMenuRoot/_settingsRoot etc.
var so = new SerializedObject(uiManager);
var panelsProp = so.FindProperty("_panels");
panelsProp.arraySize = 4;
panelsProp.arraySize = 6;
var p0 = panelsProp.GetArrayElementAtIndex(0);
p0.FindPropertyRelative("id").intValue = (int)PanelId.Pause;
p0.FindPropertyRelative("root").objectReferenceValue = pauseRootGo;
@@ -281,6 +288,12 @@ namespace BaseGames.Editor
var p3 = panelsProp.GetArrayElementAtIndex(3);
p3.FindPropertyRelative("id").intValue = (int)PanelId.Shop;
p3.FindPropertyRelative("root").objectReferenceValue = shopRootGo;
var p4 = panelsProp.GetArrayElementAtIndex(4);
p4.FindPropertyRelative("id").intValue = (int)PanelId.FormSkills;
p4.FindPropertyRelative("root").objectReferenceValue = formSkillRootGo;
var p5 = panelsProp.GetArrayElementAtIndex(5);
p5.FindPropertyRelative("id").intValue = (int)PanelId.Abilities;
p5.FindPropertyRelative("root").objectReferenceValue = abilityRootGo;
so.ApplyModifiedPropertiesWithoutUndo();
}
AssignAsset(uiManager, "_onGameStateChanged", report, true, "EVT_GameStateChanged", "EVT_GameState");
@@ -1435,6 +1448,29 @@ namespace BaseGames.Editor
/// 历史的非预制件裸物体会被替换为预制件实例;绑定 <c>_config</c> 与三个加载事件频道。
/// 预制件缺失时仅在 report 提示(先跑「生成加载界面」菜单),不报错。
/// </summary>
/// <summary>
/// 通用:实例化 / 复用一个自足 UI 面板预制件为指定命名根(自身已绑好引用,不再额外绑定)。
/// 历史裸物体会被替换为预制件实例。预制件缺失时仅 report 提示,返回占位根(不报错)。
/// </summary>
private static GameObject EnsureUIPanelInstance(Transform uiParent, string instName, string prefabPath, List<string> report)
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
Transform existing = uiParent.Find(instName);
if (prefab == null)
{
report.Add($"缺少预制件 {prefabPath}请先运行对应「BaseGames/UI/控件库」生成菜单)。");
return existing != null ? existing.gameObject : GetOrCreateChild(uiParent, instName).gameObject;
}
if (existing != null && PrefabUtility.GetCorrespondingObjectFromSource(existing.gameObject) != null)
return existing.gameObject;
if (existing != null) Undo.DestroyObjectImmediate(existing.gameObject);
var go = (GameObject)PrefabUtility.InstantiatePrefab(prefab, uiParent);
go.name = instName;
Undo.RegisterCreatedObjectUndo(go, $"Instantiate {instName}");
report.Add($"{instName}:由 {System.IO.Path.GetFileName(prefabPath)} 实例化。");
return go;
}
private static void EnsureLoadingScreenInstance(Transform uiParent, List<string> report)
{
const string instName = "Canvas_Loading";