第2章 编写Hello World与仿真系统体验

用最小脚本和一次完整训练任务建立编辑、编译、运行、控制与任务完成的闭环,而不是停留在控制台输出。

直觉:从问题而不是组件开始

用最小脚本和一次完整训练任务建立编辑、编译、运行、控制与任务完成的闭环,而不是停留在控制台输出。 本章真正要解决的不是“把API调用出来”,而是让输入经过一条有所有权、有顺序、有预算的状态链,最终产生可解释的输出。先预测:如果只保留最后一张成功截图,最可能漏掉哪一种旧代际、重复执行、资源泄漏或跨线程错误?

权威目录定位

本页按公开完整目录映射以下条目;编号和名称用于追踪原书范围,正文是独立撰写的教学重构,不复制原书段落:

  • 2.1 创建第一个空的工程
  • 2.2 创建第一个脚本程序
  • 2.3 编写第一个Hello Word程序
  • 2.4 编译输出第一个程序
  • 2.5 运行Hello World
  • 2.6 打开仿真程序Demo
  • 2.7 这是一个很好玩的仿真系统
  • 2.8 进入训练场准备体验训练操作
  • 2.9 控制人物行走
  • 2.10 开动第一辆汽车
  • 2.11 完成第一个仿真任务
  • 2.12 本章小结与分析

公开目录的这一章以“2.1 创建第一个空的工程”为入口,以“2.12 本章小结与分析”为收束。相邻章节会提供依赖,但不能替代本章自己的输入、状态、输出和失败验收。

五个核心概念

、、、、。 这五个概念必须落到同一条证据链:谁创建输入,谁拥有可变状态,哪个版本或代际阻止旧结果,哪个预算阻止无限积压,以及失败后谁负责补偿或回滚。

层次要回答的问题必留证据
输入来源是否合法、完整且属于当前代际吗版本、身份、请求号、资源清单
状态谁能修改,状态是否单调或事务化状态版本、所有者、前后摘要
输出客户端表现与权威结果如何对应双端序号、产物哈希、快照摘要
失败在哪里拒绝,是否越过边界首偏离节点、错误分类、恢复动作

目录主线与因果关系

1. 2.1 创建第一个空的工程

这一组从“2.1 创建第一个空的工程”推进到“2.4 编译输出第一个程序”。先确定输入和所有权,再把中间状态写入可观察轨迹,最后用边界与失败样本验证输出。相关目录项包括:2.1 创建第一个空的工程、2.2 创建第一个脚本程序、2.3 编写第一个Hello Word程序、2.4 编译输出第一个程序。这些条目不是孤立名词:前一项提供后一项的前置条件,任何越序都应在首个不满足的阶段被拒绝,而不是靠最终画面掩盖。

验证时固定工程版本、协议摘要、随机种子和输入脚本;记录阶段开始时间、状态版本、队列或资源预算、错误分类和恢复动作。这样才能区分“实现碰巧运行”与“机制被证明正确”。

2. 2.5 运行Hello World

这一组从“2.5 运行Hello World”推进到“2.8 进入训练场准备体验训练操作”。先确定输入和所有权,再把中间状态写入可观察轨迹,最后用边界与失败样本验证输出。相关目录项包括:2.5 运行Hello World、2.6 打开仿真程序Demo、2.7 这是一个很好玩的仿真系统、2.8 进入训练场准备体验训练操作。这些条目不是孤立名词:前一项提供后一项的前置条件,任何越序都应在首个不满足的阶段被拒绝,而不是靠最终画面掩盖。

验证时固定工程版本、协议摘要、随机种子和输入脚本;记录阶段开始时间、状态版本、队列或资源预算、错误分类和恢复动作。这样才能区分“实现碰巧运行”与“机制被证明正确”。

3. 2.9 控制人物行走

这一组从“2.9 控制人物行走”推进到“2.12 本章小结与分析”。先确定输入和所有权,再把中间状态写入可观察轨迹,最后用边界与失败样本验证输出。相关目录项包括:2.9 控制人物行走、2.10 开动第一辆汽车、2.11 完成第一个仿真任务、2.12 本章小结与分析。这些条目不是孤立名词:前一项提供后一项的前置条件,任何越序都应在首个不满足的阶段被拒绝,而不是靠最终画面掩盖。

验证时固定工程版本、协议摘要、随机种子和输入脚本;记录阶段开始时间、状态版本、队列或资源预算、错误分类和恢复动作。这样才能区分“实现碰巧运行”与“机制被证明正确”。

六阶段机制链

本章的可操作链条是:1. 创建空工程 → 2. 挂载首个脚本 → 3. 编译并读取日志 → 4. 进入训练场 → 5. 切换人物与车辆 → 6. 完成任务并回放。任何一步都不能只凭“没有报错”通过;它需要正常样本证明能力、边界样本证明预算、失败样本证明拒绝与恢复。

最小实现骨架

下面的代码不是原书代码复制,而是用于复现实验的最小骨架。它只表达本章关键所有权,生产实现还要加入错误分类、超时、指标和清理。

public sealed class HelloSimulation : MonoBehaviour
{
    void Start() => Debug.Log("simulation-ready");
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
            Mission.Advance(expected: MissionStage.EnterTraining);
    }
}

状态轨迹必须与代码同时存在:

trace_id,stage,input_version,state_version,owner,budget,decision
baseline-01,创建空工程,1,1,primary,normal,accept
boundary-01,进入训练场,1,2,primary,limit,accept
failure-01,完成任务并回放,0,2,primary,exceeded,reject

验收驱动器每次只改变一个变量,避免同时改变版本、负载和时序后无法定位因果:

for sample in [baseline, boundary, failure]:
  reset_fixture(seed = 20260716)
  run_same_input(sample)
  assert_single_owner()
  assert_bounded_budget()
  export_first_divergence_and_recovery()

可复现实验

从空工程开始记录每次编译、脚本生命周期回调和任务状态。先预测跳过车辆步骤会在哪个门被拒绝,再执行正常、越序和重复触发三组流程。 每次运行保存客户端版本、服务端版本、协议或资源摘要、随机种子、样本类型、首偏离节点、恢复动作和最终决策。平均值只能说明趋势,不能证明单次关键状态没有重复或丢失。

两个必须主动制造的失败

验收矩阵

样本输入变化预期状态通过条件
正常合法版本、身份和容量六阶段顺序完成双端或资源摘要一致
边界临界时序、容量、重复或切换达到预算但不越界无第二份事实,无无限队列
失败畸形、旧代际、断线或依赖失效在首偏离点停止明确拒绝、补偿或回滚
恢复修复后重放同一输入收敛到正常轨迹无幽灵状态和资源泄漏

本页签发不变量是:脚本实例只绑定一次;输入映射明确;任务状态只按合法前置条件单调推进;回放能重现完成顺序。。它必须由轨迹、版本、序号和恢复复测共同证明,不能被一次演示、截图或平均指标替代。

练习

小结

  • MonoBehaviour:MonoBehaviour是“第2章 编写Hello World与仿真系统体验”中用于约束输入、状态、输出或失败恢复的核心概念;它必须有明确所有者和可观察证据。
  • 生命周期:生命周期是“第2章 编写Hello World与仿真系统体验”中用于约束输入、状态、输出或失败恢复的核心概念;它必须有明确所有者和可观察证据。
  • 训练任务:训练任务是“第2章 编写Hello World与仿真系统体验”中用于约束输入、状态、输出或失败恢复的核心概念;它必须有明确所有者和可观察证据。
  • 控制映射:控制映射是“第2章 编写Hello World与仿真系统体验”中用于约束输入、状态、输出或失败恢复的核心概念;它必须有明确所有者和可观察证据。
  • 完成条件:完成条件是“第2章 编写Hello World与仿真系统体验”中用于约束输入、状态、输出或失败恢复的核心概念;它必须有明确所有者和可观察证据。
  • 六阶段机制链已经映射到正常、边界、失败和恢复证据。
  • 本页覆盖的公开目录条目已逐项列出,现代工程补充不会冒充原书分节。

术语表

来源与改编边界

讨论

评论区加载中…