公司动态
Scratch 3D恐怖游戏开发指南:用射线投射制作第一人称迷宫
1. 写在前头Scratch 做 3D 恐怖游戏可行吗我一直觉得Scratch 在很多人的印象里就是“拖积木做小动画、小游戏”的入门工具好像跟 3D、恐怖、第一人称射击这些词没什么关系。直到我自己动手把一个 3D 走廊迷宫塞进 Scratch 之后才发现这个看法低估了 Scratch 的潜力。先回答一个大家都会问的问题Scratch 真的能做 3D 吗严格意义上讲Scratch 本身没有原生 3D 引擎也没有 WebGL 渲染接口它提供的舞台是二维平面。但计算机图形学里有个基本思路如果把三维世界中的物体坐标通过“相机”投影到二维屏幕上就能产生近大远小的透视错觉。只要这个投影计算足够快玩家就会认为自己看到了一个 3D 场景。这个思路在 Scratch 里完全可行。很多开发者用“射线投射法”复刻了类似《德军总部 3D》的第一人称迷宫也有人用“精灵缩放模拟距离”做追尾视角的赛车游戏还有人用“画笔逐行渲染”做伪 3D 地形。本文要做的“3D 恐怖游戏”采用的是射线投射渲染 亮度特效 音效氛围的组合方案效果足够完成一个可玩的恐怖小游戏。这篇文章会覆盖从原理到实战的完整流程为什么 Scratch 能渲染 3D以及它的局限在哪里用 Scratch 3.0 搭建一个第一人称 3D 走廊场景实现玩家移动、碰撞检测、怪物出现与跳跃惊吓加入灯光衰减、心跳音效、血量进度条提升恐怖氛围最后整理高频问题和工程化建议。无论你是刚开始学 Scratch 的新手还是带学生做编程项目的老师都可以照着本文一步步做。读完你会掌握一套“如何用有限工具实现复杂效果”的思维方式这对以后学任何编程语言都有帮助。2. 环境准备与版本说明2.1 选择 Scratch 网页版还是桌面版Scratch 官方提供了两个常见使用入口网页在线编辑器scratch.mit.edu和离线桌面编辑器。网页版打开浏览器就能用方便分享和查看社区作品但需要网络环境。它的优点是素材库、声音库、角色库直接可用作品可以一键发布到社区。桌面版适合在没有网络的环境下使用也能打开 sb3 格式的项目文件。缺点是部分系统需要额外安装 Adobe AIR老版本或直接使用 3.x 安装包。本文示例以Scratch 3.0版本为准。无论是网页版还是桌面版积木逻辑基本一致不影响操作。有些新手会问“我下载的 Scratch 为什么打不开”这多半是版本不匹配。建议到 scratch.mit.edu 官网下载对应系统的安装包不要用来路不明的第三方压缩包。2.2 素材准备说明恐怖游戏非常依赖素材气氛这里不需要你懂美术按下面清单准备就好角色不需要额外角色本文采用第一人称视角玩家“看不见自己”只需要一个隐藏的玩家对象来记录坐标和方向。怪物可以用 Scratch 自带角色库里的蝙蝠、幽灵也可以自己画一个粗糙的“黑影”。关键是怪物图片的中心点要设置正确否则旋转和缩放时会偏移。音效Scratch 自带声音库里有一些适合恐怖氛围的音频比如“Boom Cloud”“Screech”“Pop”但更推荐自己上传一段低沉的心跳声或环境风声。你也可以用在线工具生成简单的白噪音。背景用单色背景或纯黑背景都可以因为 3D 画面是通过画笔逐帧画出来的不需要传统角色背景。我这里要单独提醒一句做恐怖游戏时音效比画面重要得多。即使画面简陋只要在怪物出现前加入“突然安静心跳声加快”的处理恐怖感会立刻上升一个档次。2.3 创建项目与基础设置打开 Scratch 编辑器后先做三步基础设置删除默认的小猫角色或者把小猫隐藏掉因为第一人称视角不需要看到自己。添加一个专门用于“渲染画面”的角色这只角色负责用画笔绘制 3D 画面。你可以把它命名为渲染器。添加一个“玩家控制器”角色用来接收按键事件它本身不用显示。除此之外还需要在变量区创建以下全局变量玩家X 玩家Y 玩家方向 生命值 游戏状态 屏幕距离表这些变量在后面的项目实战中会逐步解释。现在先把骨架搭好下一步我们来拆解“Scratch 如何假装 3D”的核心原理。3. 核心原理拆解Scratch 如何“假装”3D3.1 3D 投影的本质把三维坐标变成屏幕坐标真实世界里的 3D 渲染本质上是把物体在世界坐标系中的位置通过相机变换、投影变换最终映射到屏幕像素坐标。但在 Scratch 里我们不需要了解复杂的矩阵运算只需要掌握一个最核心的公式——透视投影的近大远小。假设有一个物体在世界坐标的x, y, z位置相机位于原点看向 z 轴正方向。那么它在屏幕上的位置可以近似表示为屏幕X 屏幕中心X (物体X * 焦距) / 物体Z 屏幕Y 屏幕中心Y (物体Y * 焦距) / 物体Z这个公式的含义很直观物体离相机越远物体Z越大除以的数值越大屏幕坐标越靠近中心看起来越小物体离相机越近除以的数值越小屏幕坐标偏移越大看起来越大。这就是我们常说的“透视效果”。在 Scratch 中渲染角色可以使用“画笔”模块。每次循环时清空之前的画面重新根据玩家位置和方向计算每个可见点的屏幕坐标再落笔画点或画线。由于人眼存在视觉暂留只要每秒钟刷新足够多次就可以形成连续画面。3.2 射线投射适合迷宫恐怖游戏的渲染方案上面说的“投影物体坐标”适合处理独立物体但要是做一整个迷宫逐物体绘制的效率就很低了。所以主流 Scratch 3D 迷宫都采用**射线投射Raycasting**方案。它最早因《德军总部 3D》而出名核心思路非常简单把地图看作一个二维网格每个格子要么是墙要么是空地。在屏幕上按列渲染比如屏幕宽 480就分为 480 条垂直列。对每一列从玩家位置出发向玩家朝向附近发出一条射线。射线一步一步向前延伸直到撞到墙格子。记录射线从玩家到墙的距离d。根据距离d画垂直柱子的高度距离越近柱子越高距离越远柱子越低。用 Scratch 伪积木表达就是当绿旗被点击 重复执行 清空画笔 设置画笔颜色为黑色 将笔粗细设为 15 屏幕列 1 重复直到 屏幕列 480 计算射线距离 柱子高度 6000 / 距离 移到 x: (屏幕列 - 240) y: (0 - 柱子高度 / 2) 面朝 90 度 向下移动 (柱子高度) 步 屏幕列 屏幕列 1这里的6000是焦距参数可以根据屏幕分辨率调整。数值越大画面中的柱子越高数值越小柱子越矮。射线投射最大的优点是速度快。一个 20×20 的网格地图每帧只需要计算几百列射线距离Scratch 完全能承受。3.3 深度排序与遮挡关系在 3D 场景中物体之间可能有遮挡比如怪物站在墙后面玩家不应该看到它。处理遮挡有两种策略简单策略只在怪物的“屏幕 X”位置与对应墙壁柱子的左右范围不重叠时绘制怪物重叠时就跳过绘制这样怪物自然会被墙挡住。复杂策略把所有待绘制物体按距离从远到近排序先画远的再画近的近的会覆盖远的这样遮挡关系自然正确。恐怖游戏里怪物往往是最关键元素我推荐使用“简单策略”也就是先渲染墙壁再画怪物但画怪物前要判断“怪物所在列是否被墙挡住”。如果怪物和墙在同一列且怪物距离更远就不画。这个判断可以抽象成一个函数定义 判断怪物是否可见(怪物X) (怪物Y) 射线到怪物距离 计算两点距离 对怪物所在屏幕列计算墙壁距离 如果 墙壁距离 射线到怪物距离 那么 将 怪物可见 设为 0 否则 将 怪物可见 设为 1这里的核心思想是墙比怪物更近所以怪物被挡住。这一步理解后后续做怪物出现、消失逻辑就很容易了。3.4 四种常见 Scratch 3D 方案对比我在做这个项目前也看过很多人用不同方式做 Scratch 3D这里整理一下对比帮助大家少走弯路方案原理适合场景实现难度性能射线投射逐列发射射线检测墙壁距离第一人称迷宫、恐怖游戏中等高精灵缩放根据距离动态改变角色大小追尾视角、跑酷、赛车低高画笔渲染用画笔逐点画线/画多边形低面数3D模型、地形高低3D 引擎类扩展使用第三方 3D 扩展插件复杂模型中不稳定从效果和性能平衡来看射线投射是制作第一人称恐怖游戏的最佳选择。它不需要大量克隆体也不依赖扩展只用画笔和列表就能完成兼容性也最好。4. 完整实战做一个“走廊灯光恐怖”小游戏4.1 游戏设计与功能拆分在动手拖积木之前先把需求想清楚。我设计的游戏比较简单但氛围完整玩家在一个 11×11 的网格迷宫中第一人称移动用 W/A/S/D 控制前后左右用左右方向键转向画面中央有灯光范围远离灯光的位置会变暗迷宫中存在一只怪物当玩家靠近到一定距离时怪物会突然出现在画面中并播放惊吓音效怪物靠近玩家到一定范围时玩家生命值减少生命值显示在屏幕顶部以进度条形式表现生命值归零时游戏结束。功能拆解之后我们可以分成这几个模块来实现地图数据模块3D 渲染模块玩家控制模块怪物 AI 模块UI 与音效模块下面逐个说明。4.2 创建项目结构与地图数据在 Scratch 中“地图”不用图片而是用列表存储。我设计了一个 11×11 的地图1表示墙壁0表示空地。在地图周围全部放上墙内部预留几条通道。比如这样1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1在 Scratch 中创建列表地图然后逐格填入这些数字。为了方便读取任意位置的地图值我习惯把所有格子存成一个列表用“行 × 列”索引来访问。定义一个自定义积木获取地图值(x) (y)返回列表 第 ((y - 1) * 11 x) 项。如果 x、y 超出边界直接返回 1表示墙。这一步是整个 3D 迷宫的基础一定要仔细填表。地图填错了后面射线检测就会出现“明明有墙却穿过去”的怪问题。4.3 编写射线投射渲染器下面来看最核心的 3D 渲染模块。我给渲染器角色添加如下逻辑当绿旗被点击 重复执行 清空 将画笔颜色设为 #222222 填充背景 渲染所有屏幕列 渲染怪物其中渲染所有屏幕列是关键。我们设定屏幕列从 1 到 480每隔 30 列采样一次可以提速但为了画面完整我建议每 2 列画一条竖线这样画面不至于太粗糙。对应积木逻辑定义 渲染所有屏幕列 将变量 列号 设为 1 重复直到 列号 480 将变量 射线角度 设为 (玩家方向 - 30 (列号 / 480) * 60) 将变量 射线X 设为 玩家X 将变量 射线Y 设为 玩家Y 将变量 距离 设为 0 重复执行直到 距离 200 或 获取地图值(向下取整 射线X) (向下取整 射线Y) [1] 将 rayX 增加 (cos 射线角度) 将 rayY 增加 (sin 射线角度) 将 距离 增加 0.02 如果 距离 200 那么 墙高度 5000 / 距离 移到 x: (列号 - 240) y: (0 - 墙高度 / 2) 设置画笔颜色为 (根据距离选择亮度) 将画笔粗细设为 2 面朝 90 度 移动 (墙高度) 步这段逻辑就是射线投射的核心从玩家位置出发沿着射线角度一小步一小步前进直到撞到地图里的墙。一旦撞到墙就用距离计算墙高度再落笔画出一条竖条。这里有一个需要重点解释的参数cos 射线角度和sin 射线角度。Scratch 的运算积木里有运算 ... 的余弦和运算 ... 的正弦但在 Scratch 中角度单位默认是“度”而数学公式里用的是弧度。好在 Scratch 积木内部已经做了角度转换所以我们直接填入角度数值即可不需要手动转弧度。为了让画面有“恐怖感”不是所有墙壁都使用同一种颜色。我根据距离把墙颜色从亮到暗渐变定义 根据距离选择颜色(距离) 如果 距离 3 那么 设置画笔颜色为 #aaaaaa 否则 如果 距离 8 那么 设置画笔颜色为 #555555 否则 设置画笔颜色为 #222222这样就能模拟出“距离越远越黑”的灯光衰减效果整个走廊看起来有纵深感恐怖气氛也就出来了。4.4 玩家移动与碰撞检测玩家控制需要考虑两件事第一按哪个键做什么操作第二怎么防止玩家穿墙。玩家当前位置用变量玩家X和玩家Y表示玩家方向用玩家方向表示。移动逻辑如下当按下 [w] 键 将 新X 设为 (玩家X 0.1 * cos 玩家方向) 将 新Y 设为 (玩家Y 0.1 * sin 玩家方向) 如果 获取地图值(向下取整 新X) (向下取整 新Y) [0] 那么 将 玩家X 设为 新X 将 玩家Y 设为 新Y为什么这里要加0.1这个 0.1 是每帧移动的步长也可以理解为移动速度。步长太大容易导致碰撞检测“跳格子”穿过墙角步长太小画面又显得很慢。经过测试0.05到0.1之间的速度在 11×11 地图中体验比较合适。转向逻辑类似按左方向键时玩家方向减少 3按右方向键时玩家方向增加 3。之所以不用当按下左键然后用等待是为了让转向更平滑。当按下 [向左键] 将 玩家方向 设为 (玩家方向 - 3) 当按下 [向右键] 将 玩家方向 设为 (玩家方向 3)如果把移动方向从“前后左右”改成“转向 前进”会更接近真实第一人称游戏。我这里采用 W/S 控制前进后退A/D 控制平移方向键控制转向大家可以根据自己习惯调整。有一个细节容易被忽略玩家初始位置和初始方向必须有意义。如果你把玩家放在墙里射线投射一开始就会碰到墙画面会全黑。推荐把玩家初始位置设为(1.5, 1.5)也就是地图左上角空地中心初始方向设为0朝右看。4.5 怪物 AI 与跳跃惊吓恐怖游戏的高潮是“怪物突然出现”。在 Scratch 里实现跳跃惊吓不需要复杂的 AI只需要一个状态变量和一个距离判断。我创建一个怪物角色初始隐藏。每帧执行以下逻辑当绿旗被点击 重复执行 将 怪物X 设为 7.5 将 怪物Y 设为 8.5 将 玩家到怪物距离 设为 计算距离(玩家X, 玩家Y, 怪物X, 怪物Y) 如果 玩家到怪物距离 4 那么 如果 怪物可见 0 那么 将 怪物可见 设为 1 播放声音 [幽灵低语] 否则 在渲染器中绘制怪物 否则 将 怪物可见 设为 0这里有两个关键点第一当怪物首次进入可见范围时播放一个低沉音效并且让怪物画面“突然出现”这是恐怖效果的引爆点。建议不要一进范围就播放可以加一个很小的随机延迟增加不确定性。第二绘制怪物时要结合 3D 投影。怪物的屏幕位置应该根据其相对于玩家的角度和距离计算定义 计算怪物屏幕位置 将 相对X 设为 (怪物X - 玩家X) 将 相对Y 设为 (怪物Y - 玩家Y) 将 怪物屏幕X 设为 (240 (相对X * cos 玩家方向 相对Y * sin 玩家方向) * 焦距)这里我不打算展开太复杂的坐标旋转你只需要知道怪物的位置要经过投影和方向旋转才能正确显示在屏幕对应位置。如果怪物老是出现在屏幕正中央那说明你漏掉了方向旋转那一步。怪物靠近玩家到一定距离比如小于 1.2时玩家生命值减少如果 玩家到怪物距离 1.2 那么 将 生命值 设为 (生命值 - 1) 等待 0.5 秒4.6 灯光、亮度与手电筒效果Scratch 3.0 中每个角色都有一个“亮度”视觉效果可以在外观模块中找到。用法是将 [亮度] 特效设定为 (50)亮度特效值越大角色看起来越亮设为 0 时恢复正常。这个特效可以用于很多地方最常见的是做“闪电闪烁”和“灯光引导”。在这款恐怖游戏里我建议在玩家靠近出口或某个安全区域时把中央区域的灯光调亮给玩家一点“喘息”的节奏而在怪物出现时把整体亮度调低让画面更压抑。另外可以在屏幕上做一个类似“手电筒”的效果在画完 3D 走廊后再叠加一个黑色半透明渐变大圆中央透明、边缘变暗。但 Scratch 没有半透明画笔所以比较简单的做法是在画走廊时用距离控制亮度本质上已经模拟了“手电筒照亮前方一小块区域”的效果。如果你想更精细可以每次画柱子时根据“该列像素距离屏幕中央的偏移量”来调整颜色深浅实现类似手电筒聚光的效果如果 列号 100 且 列号 380 那么 设置画笔颜色为 #cccccc 否则 设置画笔颜色为 #333333这样屏幕中间的视野范围更亮两侧偏暗看起来就像玩家戴了个头灯。配合上一节的距离亮度画面层次会丰富很多。4.7 心跳音效与血量进度条恐怖游戏的节奏感非常重要。玩家刚进入走廊时一切安静当怪物出现时画面突然变暗、心跳声响起当怪物靠近时心跳声加快。Scratch 里实现“心跳加速”有两种简单方式方式一在玩家靠近怪物的时候用更短的间隔循环播放心跳声音片段。方式二从一开始就循环播放心跳声但通过调整音量来模拟距离感。距离越近音量越大。我推荐方式二因为循环播放比反复触发声音片段更稳定。具体逻辑当绿旗被点击 重复执行 将 心跳间隔 设为 (1 - (1 / (玩家到怪物距离 0.5))) 等待 心跳间隔 秒 播放声音 [心跳声]这里心跳间隔越小心跳越快。距离越近分母越小心跳间隔越短。你可以根据实际效果调整公式里的常数。血量进度条这里可以直接用到“进度条”的通用做法。在 Scratch 里画一个进度条通常是用“画笔 变量”实现第一层画一个灰色底条表示血量上限第二层用红色画当前血量血量减少时红色层变短。实现逻辑当绿旗被点击 重复执行 清空画笔 设置画笔颜色为 #444444 将画笔粗细设为 10 移到 x: (-100) y: (160) 移动 (200) 步 设置画笔颜色为 #ff0000 将画笔粗细设为 10 移到 x: (-100) y: (160) 移动 (生命值 * 20) 步因为生命值初始设为 10最大值 10所以生命值 * 20正好是 200 步对应满血。每扣一滴血红色条就变短一点玩家能直观看到自己的生存压力。4.8 游戏结束与重新开始生命值归零后游戏要进入结束状态停止玩家操作并显示“游戏结束”信息。我习惯用一个游戏状态变量来控制游戏状态 0游戏进行中游戏状态 1游戏结束游戏状态 2胜利过关。在玩家控制模块中先判断游戏状态 0再执行移动指令防止结束后玩家还能乱动。结束画面可以简单用另一个角色显示或者在舞台上通过“说”积木弹出。重置游戏时需要把所有变量恢复到初始值并清空画笔定义 重置游戏 将 玩家X 设为 1.5 将 玩家Y 设为 1.5 将 玩家方向 设为 0 将 生命值 设为 10 将 游戏状态 设为 0 将 怪物可见 设为 0 全部清除画笔这里特别提醒“全部清除画笔”很重要否则结束画面上会残留 3D 走廊的痕迹干扰文字显示。4.9 运行与试玩预期效果把上面几个模块拼接起来点击绿旗后你应该会看到屏幕中央出现一条黑白渐变的 3D 走廊移动鼠标方向键可以转向按 W 键前进走廊透视关系正确越近的墙越高越大走到某一位置时远处出现怪物剪影同时响起低沉音效亮度突然变暗怪物靠近后玩家血量条变短心跳声加快血量归零时画面停止提示游戏结束。如果跑起来发现画面闪烁很严重可以考虑降低渲染精度比如每 3 列画一根柱子画面会粗一些但帧率更稳定。也可以把舞台分辨率调小比如用 360×360 的模式减轻画笔压力。5. 常见问题与排查思路做 Scratch 3D 项目时新手最容易遇到下面几类问题。我整理成表格方便大家快速对照排查。问题现象常见原因解决思路画面全黑什么都看不到玩家初始位置在墙里或射线距离初始值过大把玩家初始位置放在空地格子中心比如(1.5, 1.5)并检查地图列表数据画面闪烁严重画笔绘制速度太慢或舞台刷新频率不够降低渲染列数比如每 3 列画一次关闭“屏幕刷新”优化自定义积木或者用“循环不刷新屏幕”加速玩家能穿墙碰撞检测只在按下 W 时触发平移时没有检测所有移动方向都要执行“新坐标是否为墙”的判断步长不要太大怪物没有出现在正确位置怪物没有参与方向旋转或绘制顺序不对怪物屏幕坐标必须基于玩家方向做旋转怪物绘制要在墙壁绘制之后怪物被墙挡住后仍然显示没有做怪物与墙的遮挡判断对比“怪物距离”和“该列墙壁距离”墙壁距离更近时隐藏怪物心跳声音反复重叠声音很吵多个声音播放指令同时触发使用“停止所有声音”再播放或改成循环播放并调节音量Scratch 编辑器卡顿画笔模块每帧绘制大量线条降低分辨率减少屏幕列数拆掉无关角色和脚本用“绿色旗帜”统一启动广播消息混乱多个角色同时响应多个“当收到消息”没有区分状态在消息处理器里先判断游戏状态再执行对应逻辑其中“画面闪烁”是最常见的性能问题。Scratch 的画笔和动态实时渲染天然较吃性能建议开启编辑器左下角的“turbo mode”加速模式也就是点击绿旗前先按一下“加速模式”按钮。开启后循环执行速度会明显提升但要注意部分动画和等待积木会受影响。另外如果你的游戏在网页版运行卡顿可以试试离线桌面版因为桌面版不依赖浏览器渲染画笔模块的运行效率通常会更高。6. 最佳实践与工程建议6.1 变量命名与初始化Scratch 项目做到后面变量会越加越多。如果变量名随意比如a、b、x、y过两天你自己都看不懂。我建议统一命名规则玩家相关玩家X、玩家Y、玩家方向、玩家状态怪物相关怪物X、怪物Y、怪物可见、怪物距离渲染相关列号、射线距离、墙高度游戏控制生命值、游戏状态、当前关卡变量初始化也非常重要。很多 3D 画面异常其实是变量没有在绿旗点击时初始化导致的。你可以在开发者后台给每个变量设置初始值也可以在重置游戏自定义积木里统一赋值。6.2 使用“不刷新屏幕”优化渲染Scratch 3.0 的自定义积木右下角有一个勾选项“运行时不刷新屏幕”。这个选项在做 3D 渲染时极为关键。默认情况下Scratch 在每条积木执行后都会刷新舞台这会极大地拖慢画笔画线的速度。如果我们在“渲染所有屏幕列”这个自定义积木上勾选“运行时不刷新屏幕”那么画笔会在后台连续绘制几百条线最后一次性显示结果帧率会大幅提升。但要注意勾选“不刷新屏幕”后循环里无法实时看到中间过程所以它只适合封装“复杂的纯计算任务”不适合做动画过渡。6.3 用“消息广播”代替大量等待积木很多新手喜欢用等待 1 秒来控制游戏节奏但等待积木会让整个脚本“卡住”导致按键响应变慢。更好的做法是使用“广播消息”来协调角色。比如怪物出现时可以在玩家距离判断处广播怪物出现如果 怪物可见 1 而且 玩家到怪物距离 3 那么 广播 [怪物出现]其他角色收到广播后可以播放音效、切换灯光亮度、弹出提示。这样逻辑之间解耦不会因为某个角色脚本卡住而影响整个游戏。6.4 克隆体管理如果需要做成多个怪物或动态灯光可能会用到克隆体。但克隆体是 Scratch 里最容易出坑的功能之一克隆体数量过多时会卡顿克隆体没有清理会造成幽灵角色。建议遵循三条原则每个克隆体只负责一件事比如一个怪物或者一个光源克隆体诞生时必须确定自己的“生命周期”比如玩家离开一定范围后就删除克隆体在“当作为克隆体启动时”里第一行就设置好私有变量防止多个克隆体互相干扰。实际上本文的单一怪物方案不需要克隆体直接用角色隐藏/显示即可。如果你以后想做“多个怪物追逐玩家”再把怪物角色设计成克隆体模板。6.5 项目备份与版本管理Scratch 项目是图形化编程没有 Git 分支但依然可以做版本管理每次重大功能完成后点击“文件 → 保存到电脑”导出 sb3 文件文件名加上版本号比如恐怖迷宫_v1.0.sb3、恐怖迷宫_v1.1.sb3准备一个“实验文档”记录每个版本改了什么、出现了什么问题、怎么解决的。这样即使做坏了某个功能也能快速退回上一个稳定版本不会因为一次修改导致整个项目崩溃。6.6 安全与合规提示如果这个作品要发布到 Scratch 社区请注意恐怖题材在社区中可能会被标记为“恐怖/horror”发布前查看社区准则声音素材尽量使用 Scratch 自带库或使用自己原创/有授权的声音不要在作品描述里附带任何个人隐私、联系方式或外部下载链接对低龄用户恐怖程度需要适当降低比如把怪物设计得滑稽一些减少跳跃惊吓的音量。7. 踩坑经验与学习路线整个项目做完后我最大的感受是Scratch 不是只能做 2D它的限制更多来自“思维方式”而非“功能”。射线投射、深度排序、亮度衰减、碰撞检测这些在游戏引擎里是一条条现成功能但在 Scratch 中你必须自己一步步拆出来。这个过程虽然慢却能帮你把计算机图形学的核心概念理解得非常通透。如果你想继续进阶可以从这几个方向入手给迷宫增加更多房间和道具比如钥匙、门、出口做个 2.5D 视角的追尾跑酷游戏研究精灵缩放与地面速度的关系尝试用画笔 列表渲染一个简单的 3D 地形理解高度图的概念把怪物 AI 升级成简单的路径追踪比如“沿墙走”或者“朝玩家方向直线移动”在 UI 上继续完善进度条加入“血量回血”“护盾”等机制用 Scratch 做出一个完整的“第一人称解谜游戏”把光照和音效玩出更多花样。做 3D 项目时如果遇到画面不对优先检查三件事地图数据对不对、玩家坐标在哪、射线角度算没算对。这三个要素只要有一个出错画面就会完全不对劲。调试时可以加一些“调试角色”实时显示坐标和距离帮助定位问题。这款“走廊灯光恐怖”小游戏是我觉得 Scratch 3D 项目里性价比最高的入门练手作代码量不大但原理覆盖全面做完之后你对“3D 是怎么渲染出来的”会有非常直观的理解。如果这篇文章对你有帮助可以收藏备用也欢迎把做好的作品思路记录下来隔一段时间再回头改进你会发现每次重写都能优化很多细节。