首页/ 第 10 章 · UI 界面系统/ 第 167 课
LESSON 167 · UI 界面系统

UI 与代码交互(显示数据)

UI 数据交互已掌握。下一课做小地图。

⏱ 约 14 分钟📊 难度:入门🗂 第 10 章 · UI 界面系统📍 第 167 / 300 课
课程进度
167 / 300

🎯本节学习目标

  • 实现数据→UI 更新
  • 掌握刷新时机
  • 用事件解耦

🚀课程导读

“分数变了,UI 文字要跟着变”。本课讲“数据→UI”的更新机制与最佳实践。

直接更新 vs 事件更新

两种刷新方式。

  1. 【方式1 每帧刷新(简单)】在 UIManager 的 Update 里:scoreText.text = score.ToString();
  2. 优点:简单,数据随时最新。缺点:每帧更新浪费性能(文字不常变时)。
  3. 【方式2 事件驱动(推荐)】数据变化时通知 UI 刷新:
  4. 分数系统:
  5. public event System.Action<int> OnScoreChanged;
  6. public int score;
  7. public void AddScore(int n) { score += n; OnScoreChanged?.Invoke(score); }
  8. UI 订阅:
  9. scoreSystem.OnScoreChanged += UpdateScoreText;
  10. void UpdateScoreText(int s) { scoreText.text = "分数:" + s; }
  11. 【优点】只在数据变化时更新,性能好、解耦。
  12. 【方式3 数据变化手动刷新】调用公共方法 RefreshAllUI()。
  13. 【选择】高频变化(分数/血量)用事件;低频/简单用每帧刷新也无妨。
  14. 【注意】UI 刷新要防“空引用”(UI 未初始化时)。
专业做法:数据源发事件,UI 订阅刷新。数据与显示分离。

实战:分数与倒计时

做两个实时 UI。

  1. 【分数 UI】Canvas 左上角 TMP “分数:0”。
  2. ScoreManager 脚本(单例,第 86 课):
  3. public int score; public event System.Action<int> OnScoreChanged;
  4. public void AddScore(int n) { score += n; OnScoreChanged?.Invoke(score); }
  5. UIManager 订阅并刷新 scoreText。
  6. 【倒计时 UI】屏幕上方 TMP 显示剩余时间:
  7. public TMP_Text timeText;
  8. public float timeLeft = 60f;
  9. void Update() { timeLeft -= Time.deltaTime; if (timeLeft <= 0) { timeLeft = 0; /* 时间到 */ }
  10. timeText.text = "时间:" + Mathf.CeilToInt(timeLeft);
  11. }
  12. 【死亡/胜利时停表】timeLeft<=0 触发结束(第 163 课)。
  13. 【组合】把分数/血量/时间都接进 UIManager,统一管理所有 UI 文本。
  14. 【注意】倒计时用 Time.deltaTime 会随暂停停(需要的话用 unscaledDeltaTime)。
  15. 【验证】游戏里加分/扣血/倒计时,UI 全部实时变化。
  16. 【完成】你的游戏有“仪表盘”了!
💡
UI 刷新心法:数据源头唯一 + 事件通知 + UI 只读显示。

常见错误与排查

错误:UI 文字不更新?
原因:没订阅事件、或刷新时机不对
解决:确认订阅了事件;数据变化调用了 Invoke;UI 组件引用正确。

动手练习

课后小任务(做出来才算真的学会)

  • 实现分数 UI 的事件刷新
  • 实现倒计时 UI
  • 把血量/分数统一管理刷新

本节小结

UI 数据交互已掌握。下一课做小地图。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课UI 拖拽与排序