U
Unity
星辰学院
首页
课程表
章节导览
第 1 课
返回主站
首页
/
第 10 章 · UI 界面系统
/
第 167 课
LESSON 167 · UI 界面系统
UI 与代码交互(显示数据)
UI 数据交互已掌握。下一课做小地图。
⏱ 约 14 分钟
📊 难度:
入门
🗂 第 10 章 · UI 界面系统
📍 第 167 / 300 课
课程进度
167 / 300
🎯
本节学习目标
实现数据→UI 更新
掌握刷新时机
用事件解耦
🚀
课程导读
“分数变了,UI 文字要跟着变”。本课讲“数据→UI”的更新机制与最佳实践。
◆
直接更新 vs 事件更新
两种刷新方式。
【方式1 每帧刷新(简单)】在 UIManager 的 Update 里:scoreText.text = score.ToString();
优点:简单,数据随时最新。缺点:每帧更新浪费性能(文字不常变时)。
【方式2 事件驱动(推荐)】数据变化时通知 UI 刷新:
分数系统:
public event System.Action<int> OnScoreChanged;
public int score;
public void AddScore(int n) { score += n; OnScoreChanged?.Invoke(score); }
UI 订阅:
scoreSystem.OnScoreChanged += UpdateScoreText;
void UpdateScoreText(int s) { scoreText.text = "分数:" + s; }
【优点】只在数据变化时更新,性能好、解耦。
【方式3 数据变化手动刷新】调用公共方法 RefreshAllUI()。
【选择】高频变化(分数/血量)用事件;低频/简单用每帧刷新也无妨。
【注意】UI 刷新要防“空引用”(UI 未初始化时)。
✅
专业做法:数据源发事件,UI 订阅刷新。数据与显示分离。
◆
实战:分数与倒计时
做两个实时 UI。
【分数 UI】Canvas 左上角 TMP “分数:0”。
ScoreManager 脚本(单例,第 86 课):
public int score; public event System.Action<int> OnScoreChanged;
public void AddScore(int n) { score += n; OnScoreChanged?.Invoke(score); }
UIManager 订阅并刷新 scoreText。
【倒计时 UI】屏幕上方 TMP 显示剩余时间:
public TMP_Text timeText;
public float timeLeft = 60f;
void Update() { timeLeft -= Time.deltaTime; if (timeLeft <= 0) { timeLeft = 0; /* 时间到 */ }
timeText.text = "时间:" + Mathf.CeilToInt(timeLeft);
}
【死亡/胜利时停表】timeLeft<=0 触发结束(第 163 课)。
【组合】把分数/血量/时间都接进 UIManager,统一管理所有 UI 文本。
【注意】倒计时用 Time.deltaTime 会随暂停停(需要的话用 unscaledDeltaTime)。
【验证】游戏里加分/扣血/倒计时,UI 全部实时变化。
【完成】你的游戏有“仪表盘”了!
💡
UI 刷新心法:数据源头唯一 + 事件通知 + UI 只读显示。
⚠
常见错误与排查
⛔
错误:
UI 文字不更新?
原因:
没订阅事件、或刷新时机不对
解决:
确认订阅了事件;数据变化调用了 Invoke;UI 组件引用正确。
★
动手练习
课后小任务(做出来才算真的学会)
实现分数 UI 的事件刷新
实现倒计时 UI
把血量/分数统一管理刷新
✓
本节小结
UI 数据交互已掌握。下一课做小地图。
标记为已完成
完成打卡后,主站会实时更新你的学习进度 🎯
← 上一课
UI 拖拽与排序
下一课 →
小地图制作(UI 层)
↑