how-to-make-a-video-game-in-unity-score-ui-e0

Course: 【油管100w+】 Unity 入门视频


🎮 视频标题|How to make a Video Game in Unity — SCORE & UI (E07)

👤 主讲人|Brackeys

📅 系列定位|Unity 初学者系列 Episode 07

🏷 关键词|UI系统 | Canvas | Text组件 | Transform | ToString | 字体导入 | 实时分数显示 | Format格式化


🏛 课程目标

为游戏添加一个实时更新的分数系统(Score System),

学习使用 Unity UI 系统(Canvas + Text),并理解如何在脚本中与 UI 元素交互。


🧭 项目整理:结构优化

  • 创建文件夹结构以保持整洁:
    • 📂 Scripts → 存放 PlayerMovement.csPlayerCollision.cs
    • 📂 Materials → 存放材质 ObstacleMatPlayerMat
    • 📂 Fonts → 用于自定义字体(稍后导入)

🧩 养成良好的项目管理习惯,将来项目增大时维护更轻松。


📦 修复碰撞检测问题(精度提升)

出现问题:

玩家偶尔穿过障碍物未检测到碰撞。

解决方案:

1️⃣ 选中 Player 与 Obstacle → Rigidbody → Collision Detection 设置为 Continuous

2️⃣ 打开 Edit → Project Settings → Time → 将 Fixed Timestep 从 0.02 调整为 0.01

→ 让物理更新更频繁,减少漏检。

3️⃣ 因时间步更短 → 玩家需要更大的力:

  • ForwardForce = 8000
  • SidewaysForce = 120

✅ 碰撞检测更平滑,控制手感保持一致。


📚 创建 UI 界面(Canvas + Text)

1️⃣ 在 Hierarchy 右键 → UI → Text

→ 自动生成 Canvas(画布)+ EventSystem。

2️⃣ 进入 2D 模式(快捷键 2D 按钮),选中 Text → 按 F 聚焦。

3️⃣ Canvas 特性:

  • 自动适配 Game View 尺寸
  • Text 是在屏幕坐标中渲染的,不随场景摄像机移动

4️⃣ 调整 Text 属性:

  • 水平、垂直居中
  • 字体大小约 250
  • 文本内容:250(占位)
  • 颜色:白色
  • 对齐方式:Center

🎯 画布(Canvas)是所有 UI 元素的容器,

它在屏幕空间上绘制图像,与 3D 场景分离。


🧠 调整 UI 缩放模式

默认 Canvas Scaler 设置为:

“Constant Pixel Size”(像素大小恒定)

切换为:

Scale With Screen Size

让 UI 随屏幕分辨率自动缩放。

这样无论窗口多大,字体位置比例都保持一致。

同时可勾选 Pixel Perfect 提高渲染清晰度。


📚 导入自定义字体

“我真的真的讨厌 Arial!” —— Brackeys 😄

推荐字体:Roboto(Google Fonts)

导入步骤:

1️⃣ 前往 fonts.google.com → 搜索 “Roboto”

2️⃣ 下载 ZIP → 解压 → 拖入 Unity Fonts 文件夹

3️⃣ 在 Text 组件的 Font 属性中选择 Roboto-RegularRoboto-Light

📘 提示:

  • 黑色文字在浅色背景上更清晰
  • 可根据场景氛围调整颜色与粗细

🧩 编写分数脚本:Score.cs

目标:让文本动态显示玩家在 Z 轴方向的移动距离。

using UnityEngine;
using UnityEngine.UI;

public class Score : MonoBehaviour
{
    public Transform player;     // 玩家引用
    public Text scoreText;       // UI 文本引用

    void Update()
    {
        scoreText.text = player.position.z.ToString("0");
    }
}

📘 关键点解释:

  • player.position.z:玩家前进的 Z 坐标值
  • .ToString("0"):将浮点数格式化为整数文本
  • public Text:允许拖入 Unity 的 Text 组件引用

🎯 将脚本挂在 Text 对象上

→ 拖入 Player(Transform)与 Text(组件)引用。


🧪 关于数据类型与类型转换

类型说明示例
float小数值,如玩家坐标3.14f
string字符串(文本)"Score: 5"
.ToString()将数值转为文本score.ToString("0") → “5”

🧩 注意:若直接将 float 赋值给 string,会报错:

“Cannot implicitly convert type ‘float’ to ‘string’”。


完整工作流回顾

步骤内容文件
1️⃣创建 UI Canvas + TextHierarchy
2️⃣导入字体Assets/Fonts
3️⃣调整 Canvas 缩放模式Inspector
4️⃣编写 Score.csScripts 文件夹
5️⃣连接引用(Player + Text)Inspector 面板
6️⃣测试 → 跑动中实时更新分数Game View

结果:

玩家前进时,屏幕中央实时显示分数(距离),字体清晰,比例自适应。


🧠 补充知识点

概念说明
Canvas Render Mode控制 UI 绘制空间(Screen Space、World Space)
UI Text vs TextMeshProTextMeshPro 提供更清晰字体与丰富排版,后续可升级
ToString 格式控制"0.00" 保留两位小数;"0000" 强制四位显示
Pixel Perfect使 UI 元素在不同分辨率下锐利显示

🪄 延伸练习建议

1️⃣ 添加“最高分”保存功能:

使用 PlayerPrefs.SetFloat("HighScore", score);

配合 PlayerPrefs.GetFloat() 读取。

2️⃣ 添加单位显示:

scoreText.text = player.position.z.ToString("0") + " m";

3️⃣ 使用 TextMeshPro 重构 UI:

改进字体渲染质量与性能。

4️⃣ 添加得分动画或渐变效果:

利用 CanvasGroupColor.Lerp() 让分数变化更具动感。


📚 下一集预告:Restart System & Game Over UI

Episode 08 将介绍如何创建 GameManager.cs

实现“死亡重启机制 + Game Over 提示界面”。

你将学到:

  • SceneManager.LoadScene() 重载场景
  • Invoke() 延迟调用
  • 按键检测返回主界面或重新开始游戏