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 + 物理响应