第2章 Unity基本概念与脚本编程

掌握物体、组件、层级、标签、创建销毁、生命周期、协程,并完成3D射击。

问题:怎样证明自己复现的是第2章,而不是一个同名教程?

先预测:如果删掉原章标题、命名实例和系统边界,只留一段能运行的C#代码,另一位读者还能反推出本章吗?不能。GameObject只提供身份与层级,行为来自组件。3D射击把公开引用、GetComponent、Prefab、生命周期和协程放进同一条射击事务,摄像机跟随则验证LateUpdate与父子空间。

原书边界与目录单元

本页严格对应2021年版目录中的以下单元。现代API和工程补充可以解决版本差异,但不能替代这些原目录位置:

  • 游戏物体和组件
  • 变换组件
  • 父子关系详解
  • 物体的标签和层
  • 用脚本获取物体和组件
  • 利用公开变量引用物体和组件
  • 预制体
  • 用脚本创建物体
  • 创建组件
  • 销毁物体或组件
  • 定时创建和销毁物体
  • 脚本的生命周期
  • 常见的事件方法
  • 实例:跟随主角的摄像机
  • 协程入门
  • 实例:3D射击游戏
  • 实现武器系统和子弹
  • 实现敌人角色
  • 子弹击中的逻辑
  • 测试和改进

详细章目采用得到电子书目录;作者、ISBN与出版社信息由教材采选系统交叉核对。本站重新组织讲解、代码、实验和证据,不逐字复制原文。导读和总复习不重复计入13个正文章。

核心模型与行为不变量

GameObject只提供身份与层级,行为来自组件。3D射击把公开引用、GetComponent、Prefab、生命周期和协程放进同一条射击事务,摄像机跟随则验证LateUpdate与父子空间。

先写功能切片:输入来自哪里,哪个对象拥有状态,在哪个Unity回调更新,调用哪个引擎系统,输出由谁消费,失败时第一条信号是什么。脚本、Inspector引用和场景对象都必须能回到同一个切片编号。

每次开火只生成一个受控实例,每次命中只结算一次,禁用或销毁对象后不残留协程和引用。 这条不变量要在正常、边界和失败三组输入下成立。最终画面正确但中间所有权、时序或资源生命周期错误,仍不能签发。

五个核心术语

它必须落到第2章的输入、状态、输出与失败信号,不能只作为名词记忆。

它必须落到第2章的输入、状态、输出与失败信号,不能只作为名词记忆。

它必须落到第2章的输入、状态、输出与失败信号,不能只作为名词记忆。

它必须落到第2章的输入、状态、输出与失败信号,不能只作为名词记忆。

它必须落到第2章的输入、状态、输出与失败信号,不能只作为名词记忆。

术语连成模型后,再记录对象的创建、启用、禁用、销毁和场景切换行为。Unity回调不是任意函数名,而是引擎调度合同;在错误阶段读取输入、推进物理或释放资源,会产生偶发且难以回放的故障。

从输入到结果的数据链

本章主链是:角色组件 → 输入开火 → 预制体生成 → 子弹飞行 → 敌人命中 → 销毁回收。每个节点保存切片ID、帧号、对象ID和状态版本。表现系统只能呈现玩法事实,资源与数据系统必须通过租约或快照管理生命周期。

public void Fire()
{
    if (!cooldown.Ready) return;
    Projectile p = Instantiate(projectilePrefab, muzzle.position, muzzle.rotation);
    p.Launch(ownerId, damage);
}

旧输入API、Text、AssetBundle或LitJSON可以迁移到Input System、TextMeshPro、Addressables或System.Text.Json,但迁移账本必须写明原书问题、替代实现、保留不变量和对照证据。

三步复现与中间检查

两个必须主动制造的失败样本

当前Unity迁移表

原书对象当前实现必须保留的证据
旧输入、UI或资源API当前官方包或兼容层原案例输入、状态和结果对照
MonoBehaviour回调明确时钟与状态所有者的组件Awake到Destroy的顺序日志
场景公开引用SerializeField、稳定ID或运行时注入缺失引用检查和场景重载回放
手工创建销毁仅在证据支持时使用对象池或租约创建、复位、唯一释放和峰值数据

现代迁移不能把原书内容改写为通用最佳实践清单。每章首先复现其具体系统和实例,再补充版本差异、性能风险和可测试接口。

证据包与自动检查

每次运行至少保存原章、案例、构建号、输入序列、状态版本、首个失败信号、截图或日志哈希以及修复后同输入回放。跨系统案例还要保存对象和资源的创建释放记录。

{
  "chapter": "第2章",
  "unit": "游戏物体和组件",
  "flow": [
    "角色组件",
    "输入开火",
    "预制体生成",
    "子弹飞行",
    "敌人命中",
    "销毁回收"
  ],
  "normal": true,
  "boundary": true,
  "failureReplay": true
}
PASS chapter=第2章 ownership=true timing=true result=true
PASS invariant=每次开火只生成一个受控实例,每次命中只结算一次,禁用或销毁对象后不残留协程和引用。
REJECT missing-unit | duplicate-event | stale-reference | premature-release

练习:把知识变成可审计交付

小结

  • 是否能逐项指出本页覆盖的原目录单元与命名实例?
  • 是否能解释组件所有权、局部变换、预制体实例之间的关系?
  • 是否保存正常、边界、失败三组回放和现代迁移差异?
  • 是否验证对象禁用、场景重载和资源释放后的状态?

术语表

来源与改编边界

讨论

评论区加载中…