每日学习问题记录
提交版本的时候一定注意,你改动的UI后一定要提交相关的文件,比如你的导出文件和UI图片,还有你改动的脚本文件。
.血量更新机制
立即更新 (UpdateBossHpImmediate())
// 计算血条相关数值
float hpPerBar = (float)maxHp / m_BossHpNum; // 每一条血条代表的血量值float totalHpBars = currentHp / hpPerBar; // 当前血量总共占了几条血条var filledBars = (int)totalHpBars; // 当前完整填充的血条数float partialBarRatio = totalHpBars - filledBars; // 当前这一条血条填充的比例
举例说明
假设Boss最大血量为1000,当前血量为750:
- hpPerBar = 1000 / 2 = 500 (每条血条代表500血量)
- totalHpBars = 750 / 500 = 1.5 (占1.5条血条)
- filledBars = (int)1.5 = 1 (完整填充1条血条)
- partialBarRatio = 1.5 - 1 = 0.5 (第2条血条填充50%)
双血条动画机制
// 红色血条快速变化(0.1秒)
bossHpBarRed.TweenValue(partialBarRatio * 100, 0.1f);
- 作用:立即响应用户操作,提供即时反馈
- 动画时间:0.1秒,非常快速
- 视觉效果:玩家攻击后立即看到血条变化
白色血条背景// 白色血条缓慢变化(0.8秒) bossHpBarWhite.TweenValue(partialBarRatio, 0.8f);
- 作用:提供视觉缓冲,增强打击感
- 动画时间:0.8秒,相对缓慢
- 视觉效果:血条逐渐"回弹"到实际血量位置
阶段转换动画
当Boss血量从高阶段降到低阶段时(如从2阶段降到1阶段),会触发特殊的动画效果:
if (filledBars < lastFilledBars) // 跨阶段 {// 1. 先快速清空白条(0.2秒)bossHpBarWhite.TweenValue(0, 0.2f);// 2. 延迟0.3秒后填充到满值testAniTimer1 = TimerMgr.Inst.AddTimerOnce(0.3f, NewMethod);// 3. 延迟0.6秒后设置到目标值testAniTimer2 = TimerMgr.Inst.AddTimerOnce(0.6f, () => {bossHpBarWhite.TweenValue(partialBarRatio, 0.8f);}); }
1.阶段检测
// 记录上一次的血条数 private float lastTotalHpBars = 0f;// 检测是否跨阶段 if (filledBars < lastFilledBars) // 从高阶段降到低阶段
2.跨阶段动画流程// 步骤1:快速清空白条(0.2秒) bossHpBarWhite.TweenValue(0, 0.2f);// 步骤2:延迟0.3秒后填充到满值(0.2秒) testAniTimer1 = TimerMgr.Inst.AddTimerOnce(0.3f, () => {bossHpBarWhite.TweenValue(100, 0.2f); });// 步骤3:延迟0.6秒后设置到目标值(0.8秒) testAniTimer2 = TimerMgr.Inst.AddTimerOnce(0.6f, () => {bossHpBarWhite.TweenValue(partialBarRatio, 0.8f); });
else {// 同阶段内变化,白色血条缓慢更新bossHpBarWhite.TweenValue(partialBarRatio, 0.8f); }
血量计算优化
整数计算避免精度问题// 使用整数计算避免精度问题 int hpPerBar = maxHp / m_BossHpNum; int totalHpBars = currentHp / hpPerBar; if(currentHp % hpPerBar != 0) // 如果有余数 {totalHpBars += 1; // 向上取整 } float partialBarRatio = 100 * (currentHp % hpPerBar) / (float)hpPerBar; // 当前血条的填充百分比
边界条件处理
// 如果当前血量已经满了,设置填充比例为1 if (currentHp >= maxHp) {partialBarRatio = 1; }// 如果血量为0,关闭页面 if(currentHp == 0) {UIMgr.Inst.ClosePage(this);return; }
阶段文本显示逻辑// 设置阶段文本,当血条数为0时不显示文字 string phaseText = filledBars > 1 ? $"X{filledBars}" : ""; hpBarPhaseLabel.text = phaseText;
- X2:表示还有2条血条(血量>50%)
- X1:表示还有1条血条(血量>0%且≤50%)
- 空字符串:血量归零时不显示
霸体条更新
float batiPercentage = Mathf.Clamp01((float)currentBati / maxBati) * 100f; BossbatiBar.TweenValue(batiPercentage, 0.3f);
Boss头像显示 (ShowBossHeadIcon())
- 根据角色ID获取头像URL
- 更新头像显示
定时器管理- 脚本使用定时器来管理动画效果,并在页面关闭时清理
public void RemoveTimer() {if (testAniTimer1 != -1){TimerMgr.Inst.RemoveTimer(testAniTimer1);testAniTimer1 = -1;}// ... 清理其他定时器 }
页面生命周期管理
public override void UnShow() {base.UnShow();RemoveTimer(); // 移除定时器,防止内存泄漏 }