how-to-make-a-video-game-in-unity-programming-e
Course: 【油管100w+】 Unity 入门视频
《🎮 How to make a Video Game in Unity – PROGRAMMING (E02)》
下面是 Notion 系统化笔记整理版,延续前一份 Episode 01 的格式与风格(🎮🏛🧭📦📚🧠🧪✅🪄 图标层级结构),方便你直接复制进 Notion。
🎮 视频标题|How to make a Video Game in Unity — PROGRAMMING (E02)
👤 主讲人|Brackeys
📅 系列定位|Unity 初学者系列 Episode 02
🏷 关键词|C# 脚本 | Component | Rigidbody | Force | Debug | Console | FixedUpdate | deltaTime | 注释习惯
🏛 本集目标
在 Unity 中创建第一个 C# 脚本(Script),理解 Unity 组件化编程结构,掌握修改属性、添加物理力、使用 Console 调试,以及使用 Update / FixedUpdate 控制逻辑的区别。
🧭 脚本创建流程
1️⃣ 选中要编程的对象(例:Player)
2️⃣ Inspector → 点击「Add Component」→ 选择「New Script」
3️⃣ 命名脚本(例如:PlayerMovement)
4️⃣ 语言选择 C#
5️⃣ 脚本即成为一个自定义组件,可重复挂载到其他对象上。
📘 Unity 中脚本本质上就是 可编写逻辑的组件(Component),与 Transform、Rigidbody 并列。
📦 打开脚本编辑器
- Windows 默认使用 Visual Studio。
- Mac 用户使用 MonoDevelop 或 VS for Mac。
- Unity 自动生成两个函数:
void Start() {
// 游戏开始时执行一次
}
void Update() {
// 每帧执行一次
}Start() = 初始化逻辑(仅运行一次)
Update() = 帧更新逻辑(循环执行)
🧠 第一个程序:Hello World
void Start() {
Debug.Log("Hello World");
}Debug.Log()用于输出调试信息至控制台。- 注意:C# 区分大小写,每条语句末尾必须加
;分号。 - 运行游戏 → 打开 Console 窗口 → 输出信息出现。
Console 是调试窗口,用于查看 Log、Warning、Error。
调试原则:游戏运行异常时,先看 Console。
📚 引用组件:访问 Rigidbody
想通过代码修改对象的物理属性(如重力、力),需先引用组件:
public Rigidbody rb;
void Start() {
rb.useGravity = false;
}- 在 Unity 中,脚本保存后会在 Inspector 中出现一个空槽
rb。 - 将 Player 的 Rigidbody 拖入该槽即可建立引用。
- 运行后即可禁用重力,使立方体悬浮。
🧪 为物体添加物理力
public Rigidbody rb;
void Start() {
rb.AddForce(0, 200, 500);
}AddForce(x, y, z)表示向指定方向施加力。运行后立方体会被推向前方。
注意红色错误提示:若未指定参数,会报错。
因为
AddForce()需要 Vector3 参数说明方向与大小。
🧭 从“一次力”到“持续力”
如果想让物体持续移动,需放入 Update():
void Update() {
rb.AddForce(0, 0, 200);
}Update()每帧执行一次,因此会不断加速。- 但此时的速度依赖于电脑帧率(高帧=更快)。
- 为了帧率独立,需要乘以
Time.deltaTime。
🧠 理解 Time.deltaTime
Time.deltaTime = 上一帧到当前帧所用的时间(秒)。
rb.AddForce(0, 0, 200 * Time.deltaTime);若每秒 10 帧 → deltaTime = 0.1
若每秒 20 帧 → deltaTime = 0.05
→ 帧率越高,乘数越小,移动速度保持一致。
📘 原理:力 × 时间 ≈ 加速度一致,避免不同设备速度差异。
⚙️ 物理计算的正确位置:FixedUpdate()
void FixedUpdate() {
rb.AddForce(0, 0, 200 * Time.deltaTime);
}- Unity 推荐所有物理相关逻辑放在
FixedUpdate()中。 FixedUpdate()每次物理模拟时调用,频率固定(默认 50Hz)。- 这样可避免物理系统与渲染帧率不一致导致的不稳定行为。
📝 代码注释与格式化习惯
- 单行注释:
// 这是一条注释 - 行尾注释:
rb.AddForce(...); // 推动玩家 - 缩进建议使用 Tab,不要手动空格。
- 编程是“结构化阅读”的艺术,保持整洁比花哨更重要。
✅ 最终脚本:PlayerMovement.cs
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public Rigidbody rb;
void FixedUpdate()
{
// 给玩家持续向前的力(帧率无关)
rb.AddForce(0, 0, 200 * Time.deltaTime);
}
}Unity 将此脚本视为“组件”,在物理模拟阶段持续施力。
若场景中加入其他物体(如墙或障碍),即可发生碰撞与反应。
📚 调试与扩展建议
- 💡 每个脚本修改后务必保存(Ctrl+S)并切回 Unity。
- 🧱 试着复制多个 Player,调整 Force 参数对比效果。
- ⚠️ 切勿在 Play 模式中调整关键属性(退出即丢失)。
- 🧩 下一步:通过键盘输入(
Input.GetKey)控制方向。
🪄 概念小结
| 概念 | 含义 | 示例 |
|---|---|---|
| Start() | 游戏开始时运行一次 | 初始化变量 |
| Update() | 每帧执行 | 处理输入、UI |
| FixedUpdate() | 物理步进执行 | 加力、移动、碰撞 |
| Time.deltaTime | 上帧到当前帧的秒数 | 平衡帧率差 |
| Rigidbody.AddForce() | 给物体施力 | 推动物体前进 |
| Debug.Log() | 输出调试信息 | 打印状态 |
🎇 延伸阅读建议
- 官方文档:Unity Manual → MonoBehaviour → FixedUpdate()
- C# 初学者课程(推荐 Brackeys 自家系列)
- 下一集(E03):🕹 玩家移动控制 — Input System + 物理响应