12周编译原理有随堂期末考试在复习考试期间还要做项目属实是很难受了本博客的实际对应时间是2026.5.11-2026.5.24好吧实际上是考完编译原理后的三天内的进度啦啦啦喜欢我一天速通unity吗这两周进行的是灯光模拟考试功能的开发众所周知很多人在考科目三的时候经常因为启动前的灯光模拟挂掉导致连车子都没动就喜提挂科当然本人从未因为此缘故挂科往往是因为练习不够熟练一般也只有一开始要记的时候练一下和道路模拟时候碰一下以及过度紧张。因此开发一个随时随地能够练习灯光模拟考试的系统功能是非常有必要的。注本博客描述的项目仅做项目练习使用不会用于任何盈利性商业用途应当不构成侵权。由于这个功能涉及到第一个第一人称车内视角的场景渲染不属于专业教授内容因此在开启之前特意请教了树莓专业的盆友得到了一些指点其实就是unity贴图转换主要过程如下业务场景调研现有业务参考古人云“与其寻找一个灯光模拟不如自己创造一个灯光模拟”这句话点出了现有该功能的问题很多驾考APP认为这个功能很“高大上”企图将它束之高阁把它的考试设置为VIP功能极大损伤了广大劳动人民的自尊心和自信心因此我们必须要打破这种垄断的现象。当然现有的功能的布局以及功能还是应当充分参考的。于是我们打开号称“时长下载量第一”的专业级驾考APP《驾考宝典》的科目三灯光模拟功能尝试看看他是怎么做的。打开页面首先映入眼帘的是考试车型选择界面有非常多的豪车可以选由于大部分考试车辆都是桑坦纳于是我们选择桑塔纳进入进入的是一个考试引导教程教你如何操作这些按钮实现等效的灯光模拟操作。然后就会跳出氪金界面虽然没有看到考试的全貌过程但是结合实际来看已经足够了就是采用类似的布局然后用户点击对应的按钮来改变状态系统语音播报判断当前状态是否合法从而进行给分感觉和编译原理里面讲的自动机思想有点关系该参考项目的作用提供了一种现成可参考的交互模式包括要设置哪些按钮、如何操作直接给出了参考的背景和资源可以适当复用。技术调研参考为了真正将构想变成现实我特地去请教了树莓专业的一位朋友让她帮我分析一下怎么做比较简单合理一些通过描述需求和对话了解了unity这个游戏引擎能够非常完美实现我的要求并且效果看起来理论上会非常不错。于是我确定这里应该尝试用Unity进行实现并且开始部署。Unity熟悉和速通作为最广泛使用的游戏开发的引擎我之前对它一无所知直到这次才开始尝试使用太懒了还是。我先通过教程安装了unity Hub然后在里面选择了稳定的编辑器版本。安装好之后就可以进入。可以看到里面具体的界面左侧是预览界面以及测试时候的正式界面往右是游戏对象的操作平台这里每个东西都称为一个游戏对象他们可能是原来就有的画布、摄像头也有可能是我们手动上传上去的图像这时候会被视作sprinter意思是精灵再往右是原始文件夹路径以及各类资源可以通过拖动放入控制台区域让他们变为真实的元素。上面所提到的都是静态的东西如何实现像那种游戏一样的时序逻辑呢经过和LLM的对话我了解到对应的这些过程都是使用C#脚本定义的。另外如何实现代码逻辑里面的变量和实际组件的绑定呢基于之前使用scene builder的经验以及LLM的指导和提示我了解到了右侧的inspector栏目是实现这个目的的关键如图所示我们需要在工作区建立一个gameobject对象作为我们的C#时序逻辑以及传入的组件以及素材之间的之间桥梁我们在这个新的object里面绑定C#脚本然后可以看到这个绑定的脚本所需要的所有字段、每个字段有限定的类型。我们只需要将工作区里面满足这个要求、将适配的类型的对象传入即可当点击开始键之后这些都会按照传入的实例来进行初始化并且在界面上渲染出来。这样我们差不多就将我们所需的unity的逻辑差不多过了一遍接下来可以准备素材并且开始搭建界面了。人机交互部分实现相关素材搜集我们需要先明白需要哪些东西这会有利于我们后续的过程首先对应的场景是一个夜间灯光模拟用户可以操作按钮实现灯光的变换。这里涉及到两个问题一个是有哪些灯光按钮如何进行交互点击拖动悬停第二个是不同的灯光的不同状态如何体现同一个灯光处于不同状态的时候理应有至少的反馈实现。经过对于业务场景的分析参考现有的驾考宝典的实现大致可以回答如下对于第一个问题首先必须考虑实际灯光模拟的时候会需要操作哪些按钮根据网络搜索结果和个人亲身经历得出了以下几类灯光按钮灯光按钮包括左下角灯光旋钮三个档位关闭、示廓灯、前照灯灯光操纵杆对应的两个操作维度远近光灯和左右转向灯危险报警闪光灯PS雾灯理论可以做但是实际灯光考题并没有涉及而且很容易缺乏反馈所以没有加上此外我还记录了一下所有可能的语音命令以及需要的操作和实际检查的得分点汇总成了excel表格方便后续查看和验证对于第二个问题我们针对不同的位置按钮我们需要不同的反馈方式。对于左下角的灯光旋钮三个档位需要做成单独的按钮当某个按钮被点击的时候旋钮需要能旋转特定的角度指向特定的按钮的方向这意味着旋钮也需要成为独立的组件从图中独立出来并且要能监听特定按钮的点击事件并进行反馈。对于转向灯和远近光灯操作的都是拨杆。由于涉及到空间维度上的操作我们模仿驾考宝典里面的四个箭头的方式其中两个对应远近光灯两个对应转向灯。通过箭头来实现两类灯光的变换同时反馈的方式注意到真实车辆在开启转向灯的时候仪表盘上面对应会有左右箭头的闪烁可以把这个加进去。对于远近光灯理论上需要真实的光线渲染但是听树莓的同学介绍直接unity里面引入环境光源特别是针对这种显式背景图的情况效果不是很好。因此我准备转换了一下思路设置三张不同的背景图都是第一人称车内视角分别对应无光、近光和远光三种状态。这样问题就解决了。对于危险报警闪光灯俗称双闪我们用不同亮度的按钮来表示开启和关闭状态即可。然后我们需要将每个需要交互的按钮组件都从原始图片上面抠出来并进行加工抽取原有的痕迹并且将组件的背景设置为透明方法是用WPS的截取特别是旋转的旋钮必须清楚背景否则旋转的时候容易露馅。对于背景我们将原始的驾考宝典上面的背景图截取下来去除那些提示的字和符号为了防止侵权我们使用LLM修改一下车外的背景从训练场地改为阴间黄昏小道模拟真实的“夜间”的感觉。第一步使用AI去除上面的字。第二步得到更换背景之后的夜间图。第三部使用更换后的图生成近光和远光的不同状态的图再裁剪至统一大小防止切换时候错位。最终图片素材搜集完毕如下此外我们还需要搜集对应的音频资源主要包括两部分实际考试的语音播报资源以及切换按钮、转向灯闪烁时候的音效。考试指令语音播报音频通过喜马拉雅下载获得注意这里得到的是原始的多组灯光考试的录音不是单独的每个指令还需要进行提取。参考之前整理的语音指令我们使用剪映从原始的音频里面不重复的提取单独的语音指令单独导出为mp3文件关于音效我通过爱给网搜索了按钮点击音效和汽车闪光灯闪烁音效下载了两段对应的音效并放入了资源文件夹。所有音频资源合集如下资源搜集完成。素材层次设计对于搜集到的素材结合之前速通的unity的经验我是这样安排的背景图打底位于整个页面图层最底层上面附着两类元素一类是按钮点击可以触发事件三个灯光档位、双闪灯按钮一类是图标不能主动点击但是可以作为反馈结果显示灯光旋钮、示廓灯和转向灯Logo图片资源通过拖动进入工作区域成为游戏对象然后游戏对象通过手动拖动绑定到另一个游戏对象引用的脚本实现代码到组件的联动音频资源通过C#脚本使用路径引用即可不需要拖动过程交互逻辑实现我们首先实现一个状态机的变换用户点击按钮就会有对应的反馈信息暂时不考虑语音播报的动态过程。事实上这一过程如果完成了后续就和unity本身没关系了直接依赖C#高级程序语言提供的建模时序过程、判断状态合法性的能力就可以完成了。转向灯的四个箭头通过程序逻辑自己实现绘制即可。经过一番和LLM的对话以及调试进入界面之后就能够实现每次独立的状态切换了在现在的背景里面我们设置了若干按钮和反馈组件按下按钮之后反馈组件会发生相应的变化旋转角度、位置、亮度等。