feat(hero): 新增英雄详情弹窗与图鉴页面重构

1.  新增HeroInfoComp英雄详情弹窗,支持英雄属性展示、升级操作、前后切换功能
2.  重构HerosListComp图鉴页面,将详情面板逻辑剥离至弹窗,点击卡片直接打开详情页
3.  新增英雄列表排序工具函数,统一图鉴与弹窗切换的排序逻辑
4.  优化战斗渲染排序逻辑,移除无关的Y轴渲染权重计算
5.  新增英雄详情弹窗UI配置与预制体资源
This commit is contained in:
panFD
2026-09-18 11:22:03 +08:00
parent 93dc59a616
commit 63a9f6cba5
9 changed files with 16410 additions and 15910 deletions

View File

@@ -25,6 +25,8 @@ export enum UIID {
Mission,
/** 技能信息弹窗(技能小图标点击弹出) */
SInfo,
/** 英雄详情弹窗(图鉴卡片点击弹出:含属性/技能/升级/前后切换) */
HeroInfo,
}
/** 打开界面方式的配置数据 */
@@ -41,5 +43,6 @@ export var UIConfigData: { [key: number]: UIConfig } = {
// [UIID.Talents]: { layer: LayerType.UI, prefab: "gui/element/talents" },
[UIID.Mission]: { layer: LayerType.UI, prefab: "gui/element/mission" },
[UIID.SInfo]: { layer: LayerType.PopUp, prefab: "gui/element/SInfoBox" },
[UIID.HeroInfo]: { layer: LayerType.PopUp, prefab: "gui/element/heroInfo", bundle: "resources" },
}

View File

@@ -11,6 +11,7 @@
* - 升级表 key 为目标等级:need = HERO_UPGRADE_NEED_FRAGMENTS[lv + 1],查不到即满级。
*/
import { HERO_UPGRADE_NEED_FRAGMENTS } from "./GameSet";
import { HeroInfo, HeroList } from "./heroSet";
/** 英雄升级状态快照 */
export interface HeroUpgradeState {
@@ -75,3 +76,25 @@ export function getHeroUpgradeState(lv: number, fragments: number): HeroUpgradeS
canUpgrade: !isMax && fragments >= (need as number),
};
}
/**
* 图鉴展示排序:可升级优先 → 现有等级降序 → 品质降序。
* Why: 图鉴(HerosListComp)与英雄详情(HeroInfoComp)共用同一排序口径,
* 保证图鉴中的卡片顺序与详情面板"前后切换"顺序一致。
* @param getGrowth 查询英雄成长数据(lv / fragments)的回调,通常由 smc.getHeroGrowth 注入
* @returns 排序后的英雄 uuid 数组(新数组,不修改 HeroList)
*/
export function getSortedHeroList(getGrowth: (uuid: number) => { lv: number; fragments: number }): number[] {
return [...HeroList].sort((a, b) => {
const ga = getGrowth(a);
const gb = getGrowth(b);
// 可升级的一批排在最左
const ca = canHeroUpgrade(ga.lv, ga.fragments) ? 0 : 1;
const cb = canHeroUpgrade(gb.lv, gb.fragments) ? 0 : 1;
if (ca !== cb) return ca - cb;
// 同批内:现有等级降序优先
if (ga.lv !== gb.lv) return gb.lv - ga.lv;
// 等级相同:品质降序(rarity 越大品质越高)
return (HeroInfo[b]?.rarity ?? 1) - (HeroInfo[a]?.rarity ?? 1);
});
}