feat(boss): tint boss sprite outline by phase (P2 green, P3 red)

Add FlashSprite.setOutlineByBossPhase with light/dark green shade option and red fallback; BossPhaseSystem drives HeroViewComp.applyBossPhaseOutline directly after phase switch (MON faction, no hero-level event semantics, pool-node safe); extract getFlashSprite/applyOutlineByLevel to dedupe the three outline call sites.
This commit is contained in:
panFD
2026-10-10 00:33:41 +08:00
parent 24aff3baa3
commit a122d0904c
3 changed files with 76 additions and 17 deletions

View File

@@ -10,6 +10,12 @@ export class FlashSprite extends Component {
@property({ type: Material, tooltip: '绿色描边材质(2级)' })
outlineMatGreen: Material | null = null;
@property({ type: Material, tooltip: '淡绿描边材质(Boss阶段2)' })
outlineMatGreenLight: Material | null = null;
@property({ type: Material, tooltip: '深绿描边材质(Boss阶段2备选)' })
outlineMatGreenDark: Material | null = null;
@property({ type: Material, tooltip: '蓝色描边材质(3级)' })
outlineMatBlue: Material | null = null;
@@ -19,6 +25,9 @@ export class FlashSprite extends Component {
@property({ type: Material, tooltip: '黄色描边材质(5级)' })
outlineMatYellow: Material | null = null;
@property({ type: Material, tooltip: '红色描边材质(Boss阶段3)' })
outlineMatRed: Material | null = null;
orginalFlashMaterial: Material | null = null;
defaultMaterial: Material | null = null; // 缓存最原始的无描边材质
sprite: Sprite | null = null;
@@ -64,6 +73,37 @@ export class FlashSprite extends Component {
}
}
/**
* 按 Boss 阶段设置描边材质(优先级高于等级描边)
* Why: Boss 阶段是战斗强反馈(绿色警告 / 红色危险),与英雄等级成长是两套视觉语言,
* 用独立通道避免污染 setOutlineByLevel 的等级语义
* @param phase 阶段索引:1=P2 绿 / 2=P3 红 / 0=P1 恢复默认
* @param greenShade P2 绿色色调:'light' 淡绿(默认)/ 'dark' 深绿
*/
public setOutlineByBossPhase(phase: number, greenShade: 'light' | 'dark' = 'light') {
if (!this.sprite) {
this.sprite = this.node.getComponent(Sprite);
}
if (!this.sprite) return;
let targetMat: Material | null = null;
if (phase === 1) {
targetMat = greenShade === 'dark'
? (this.outlineMatGreenDark ?? this.outlineMatGreenLight ?? this.outlineMatGreen)
: (this.outlineMatGreenLight ?? this.outlineMatGreenDark ?? this.outlineMatGreen);
} else if (phase >= 2) {
targetMat = this.outlineMatRed ?? this.outlineMatYellow;
} else {
targetMat = this.defaultMaterial;
}
if (targetMat) {
// 更新基础材质,确保闪白结束后恢复到这个阶段描边材质
this.orginalFlashMaterial = targetMat;
this.sprite.setSharedMaterial(targetMat, 0);
}
}
public clickFlash() {
if (!this.sprite || !this.hitFlashMaterial) return;