关于 scenario-unity-2d
面向 Unity 6.3 开发者与美术人员的 2D 工作技能,涵盖像素画、关卡、光照、动画、相机和角色控制。它以可复现的测量、测试与质量门槛指导制作流程。
主要功能
- 01像素画导入与相机校准
- 02图集和 Tilemap 构建
- 032D 光照成本评估
- 04角色控制器与动画配置
- 05PlayMode 测试和画面审查
适用场景
- 01搭建像素风 2D 项目
- 02创建并检查 Tilemap 关卡
- 03调试角色跳跃手感
- 04评估光照与相机表现
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-unity-2d安装后在 Claude Code 中输入/scenario-unity-2d确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/AgentKit/TwoD/AnimJobs.csAtlasJobs.csAudit2D.csCameraJobs.csCinemachineJobs.csLevelJobs.csLightJobs.csPhysicsJobs.csSpriteJobs.csTilemapJobs.csTwoDSetup.csTwoDUtil.csscripts/Runtime/TwoD/AgentKit.TwoD.Runtime.asmdefCameraShake2D.csFallDampingSwitch.csHazard2D.csHitStop.csPlatformerAnimatorBridge.csPlatformerController2D.csPlatformerStats.csTopDownMover2D.csscripts/Runtime/TwoDCinemachine/AgentKit.TwoD.Cinemachine.asmdefCinemachine2DRig.csCinemachineFallDamping.csCinemachineRoomSwap.cs详细介绍
Unity 2D(开发者和美术人员)
在 Unity 6.3 中进行专业的 2D 开发,需要将一系列相互关联的设置用数据和画面验证:从美术资源到相机统一使用一个 PPU;评估图集时看实际节省了什么;将瓦片和光照作为数据创作并计算成本;让相机按整像素移动;并通过测量而非断言来检验控制器的手感。以下所有内容均通过批处理作业和 PlayMode 测试在 Unity 6000.3.21f1 中运行(references/procedures.md)。如果你的可用技能中缺少此处提到的同级技能,请让用户安装它(npx skills add scenario-labs/skills --skill <name>);若无法获得用户协助,请根据工具架构继续操作,并标明这一缺口。
必备背景: scenario-unity-expert(通道、审查流程、6.3 中的易错点)。
立场(专家级补充)
- 像素完美是一套流程,而 URP 已内置相机。 每个精灵都使用相同的 PPU(瓦片像素 = 1 单位)、Point、Compression None、整数像素枢轴点,Assets PPU = 精灵 PPU。在 URP 中永远不要安装
com.unity.2d.pixel-perfect:它是内置渲染管线的组件(6.3 Manual)。实测:1080p 下 6 x 6 像素块全部均匀一致。 - 根据需要像素化的内容选择 Grid Snapping,并在运动中判断像素效果。 Pixel Snapping 只对精灵进行吸附;灯光、泛光、粒子仍保持屏幕分辨率(2qeNu2QApAM [00:01:47]);Upscale Render Texture 会将所有内容像素化。Retro AA 与 Point 的取舍是闪烁还是模糊(Manual),在 URP 17.3 中,它仅在 Stretch Fill 下生效。实测亚像素平移时:整数取景以完整美术像素为单位移动(刚性度 0.9997);Stretch Fill Point 每帧有 0.6% 的像素闪烁,Retro AA 为 0.3%,但柔化程度是前者的两倍;不使用 Pixel Perfect Camera 时为 2.8%。
- 在 SRP Batcher 下,图集减少的是纹理,而不是批次或 SetPass。 实测批次 21/21、SetPass 2/2,绑定纹理由 20 降至 1(Unity hXlpnwD-TgY [00:05:55]、[00:07:32]);只有使用率较高时内存才会下降。只在图集上压缩一次,但像素艺术图集页保持 None:压缩会改变像素颜色(2qeNu2QApAM [00:02:24])。
AuditAtlases可复现 6.3 Sprite Atlas Analyzer 的报告及 Read/Write 检查;按可同时显示的内容分组是没有任何工具能代劳的步骤。 - 控制器负责速度;宽容度属于设计,每种技巧都应有开关。 在 Update 中锁存输入;在 FixedUpdate 中处理碰撞、跳跃、水平移动、重力和应用操作;土狼时间和输入缓冲使用时间戳窗口(Tarodev 源码)。遵循“响应玩家意图”(Thorson,GMTK yorTG9at90g [00:11:03]),因此土狼时间、输入缓冲、可变跳跃、下落速度限制、跳跃顶点滞空和拐角修正都应提供开关,以便进行 A/B 测试(Tarodev 3sWTzMsmdx8 [00:02:24]);危险物的碰撞箱应小于美术图像(GMTK [00:09:28])。有两项选择属于手感设计,不应设为默认值:可变高度方法(精确的速度削减 50%、平滑的重力 x3、按住时持续上升;Dawnosaur 2S3g8CgBG1g [00:00:36])和空中摩擦力(Tarodev 的 AirDeceleration 30 在松开后仍漂移 3.1 单位,即 5.7 个角色身宽;Celeste 的“巨大空中摩擦力”会让角色几乎垂直下落,GMTK [00:04:14];240 可在 3 步内停下)。
- 灯光通过排序图层进行路由,成本按灯光批次计算。 只有当所有可见灯光要么同时照亮相邻排序图层,要么都不照亮时,这些图层才会共用一个灯光批次;法线、阴影和灯光通道会对每个批次各运行一次(URP 17.3 源码)。一盏不照亮 Characters 图层的玩家补光(Sasquatch 1h-hSlffawM [00:01:35])将演示关卡的批次从 1 拆成 4,并使灯光覆盖范围从 0.99 个屏幕增至 3.64 个屏幕。成本来自填充率(电子书第 131 页):在 4K 下运行 6 次测试,阴影增加 x5.4 至 x5.9,批次拆分增加 +72% 至 +101%,法线贴图增加 +15% 至 +36%,大灯与小灯的差异为 +8% 至 +43%(数据嘈杂)。区域不可完全漆黑(Global 0.25,GDC YhrwKF_i-BI [00:11:43]);在灯光上启用法线贴图(GDC [00:12:31]);低端设备使用 Fast。
- 精灵动画绝不混合,并跟随控制器。 关闭 Exit time,duration 设为 0,关闭 Any State 自我转换;动画参数应根据控制器执行的动作设置,而非根据输入设置(Brackeys hkaysu1Z-N8 [00:16:17]、[00:18:57])。
- 镜头和反馈效果也是手感的一部分。 上升时采用较松的垂直阻尼,下降速度超过阈值后改用较紧的阻尼,在垂直速度为 0 时恢复(滞回),并使用 lerp 过渡(Sasquatch 9dzBrLUIF8g [00:05:37]、[00:07:14]):在下落 40 单位时,固定 0.6 秒的阻尼会让角色脚部到达屏幕底边;切换阻尼后,角色仍能在视野中保持低于底边 3.2 至 3.4 单位。根据退出方向,在触发器 EXIT 时切换房间镜头([00:14:43]);边界应恰好终止于秘密房间([00:02:10])。命中停顿使用未缩放时间,时长从 20 毫秒(Nijman AJdEqssNZ-U [00:18:22])到 67 毫秒(Celeste,GMTK [00:08:40]);延长停顿而非叠加,并提供关闭震动的选项(Nijman [00:32:14])。
- 坦诚面对仅支持 GUI 的编辑器。 Tile Palette、Rule Tile 检视器、AutoTile 遮罩、Sprite Editor、Skinning Editor 和 Animator 窗口都是鼠标工具。Agent 通过
Tilemap.SetTiles、RuleTile.m_TilingRules、RuleOverrideTile.ApplyOverrides、ISpriteEditorDataProvider、AnimatorController创作;骨骼绑定和 AutoTile 遮罩仍由人工处理(references/gui-paths.md)。
首先确认
只询问一次:像素艺术还是高清(默认:像素艺术,16 PPU,320 x 180);目标屏幕,包括 21:9 和手机;相机模型(静态房间、带偏移和下落阻尼的跟随、朝动作方向提前移动);实时 2D 光照还是绘制光照,以及最低配置;控制器配置(精准型:控制速度,空中摩擦力大;动量型:空中摩擦力小;丰富物理型:带力的 Dynamic 物体;俯视型:速度);跳跃高度(以瓦片为单位)和变高度方法;危险物和单向平台;输入设备。然后运行 ut_2d.project(P)。
工作流
- 项目。
TwoDSetup.ProjectSetup:从后往前排列排序层(层数尽量少:它们会影响光照批处理),设置 Player 和 Ground 层。门槛:读回层级顺序;不使用像素完美包;使用 Input System;固定步长为 0.02 s。 - 导入。 使用
SpriteJobs.ImportPixelArt(切片、像素轴心点、_NormalMap)或ImportHD(PPU = 高度 / (2 x 正交尺寸),电子书第 21 页);形状瓦片使用SetPhysicsOutline(16 px 精灵会生成 4 点矩形)。门槛:AuditSprites错误数为 0;PPU 统一。 - 图集。 对每个可同时显示的分组运行
AtlasJobs.BuildAtlas,将受光与不受光资源分开,像素图集页不压缩。门槛:1 页、0 项问题,并写明分组规则。 - 关卡。 使用
TilemapJobs.CreateRuleTile+BuildLevel;通过CreateRuleOverrideTile更换皮肤;Composite 设置为 Merge、Outlines、Static;仅在运行时编辑时使用逐瓦片碰撞体,然后使用 Use Delaunay Mesh。门槛:rule_mismatches == 0(也要读回更换皮肤后的结果);落体探测误差在 0.05 个单位内;截图中没有接缝。 - 角色与动画。 使用
AnimJobs.BuildSpriteAnimator、LevelJobs.Populate(玩家、带内缩命中框的Hazard2D尖刺、单向平台)。门槛:LintAnimator错误数为 0;命中框与美术资源的比例低于 1。 - 光照。 运行
LightJobs.LightRig,然后运行LightJobs.LightCost(配置;相机创建后再检查一次引擎)。门槛:Audit2D错误数为 0;复刻的光照批次数 = URP 自身的计数;说明每处批次中断和每个覆盖视图一半以上的光源为何合理;法线开关状态的成对截图有所不同。 - 相机。 运行
CameraJobs.SetupPixelPerfect、CapturePixelPerfect;用ut_2d.shimmer_check为亚像素平移(ut_2d.pan_shots)评分;跟随相机通过CinemachineJobs.Setup(固定使用 CM 3.1.7),并配合CinemachineFallDamping和CinemachineRoomSwap。门槛:1080p 和 720p 下pixel_block_check>= 0.999,平移时最小刚性度 >= 0.99,21:9 下void_columns为 0,bounds_hide_secrets正常,已检查联系表。 - 手感。 使用模拟输入运行 PlayMode 测试(
ut_run.run_tests(P, "PlayMode", graphics=True))。门槛:顶点 = 50 Hz 预测值,时间窗口误差不超过一个步长;30/60/144 fps 下每次按键只触发一次跳跃;逐项进行切换 A/B 测试;写明方法和空中漂移数值。手感本身由人来评判:发布切换项和数值。 - 交付。
Audit2D.Scene无问题;AgentProfile.PlayModeTimings预算通过;报告每个步骤及其 Unity 调用,然后标注 Verified 和 Assumed。
数值
| 数值 | 参照 | 来源 |
|---|---|---|
| PPU = H / (2 x ortho size):4K Size 5 时为 216 | HD 美术,最接近的缩放 | 电子书第 21 页 |
| 320 x 180:x4 为 720p,x6 为 1080p,x8 为 1440p,x12 为 4K;16 PPU 时 ortho 为 5.625 | 像素参照 | 手册;[新增] 算术计算 |
| MaxSpeed 14,Accel 120,GroundDecel 60,AirDecel 30,JumpPower 36,FallAccel 110,MaxFall 40,release x3,Coyote 0.15 s,Buffer 0.2 s | Tarodev 统计数据(u/s,u/s^2) | Tarodev 仓库 |
| 50 Hz 时顶点高度为 5.536(公式计算为 5.89),上升用时 0.32 s;轻按跳跃:重力 x3 时为 2.08,cut 0.5 时为 1.81,持续按住(JumpPower 18.7)时为 5.52 的 1.78 倍 | 上述统计数据 | 实测、回放 |
| 以最高速度在顶点松开按键后的空中漂移:AirDecel 30 时为 3.13 个单位(24 步),240 时为 0.27(3 步) | 0.55 单位的碰撞体 | 实测 |
| Celeste:约 6 帧达到最高速度,3 帧停下,跳跃高度约为角色身高的 3 倍(Mario 为 4 倍,Meat Boy 为 6 倍) | 60 fps 帧 | GMTK [00:02:01]、[00:03:42] |
| 顶点区间:按住时,低于 5 u/s 的部分将重力设为 x0.5(增加 +0.08 s);角落微移 0.25 个单位 | 新增技巧 | Dawnosaur [00:02:06];[新增] |
| 危险物碰撞箱内缩:左右各 2 px,顶部 3 px;相当于一个 16 x 8 尖刺的 0.75 x 0.625 | 美术 | [新增] 数值 |
| 下落阻尼:松弛时 0.6 s,紧实时 0.1 s;低于 -15 u/s 时切换,回到 0 时切回,混合时间 0.2 s | 跟随镜头 | [新增] 数值;规则来自 Sasquatch |
| 命中停顿 0.02 到 0.07 s | 实际时间 | Nijman;GMTK |
| 全局光照 0.25;光照渲染比例 0.5(模板) | 光照 | GDC;观察所得 |
| 每页一个图集;浪费标记 > 400 KB | 每个图集 | hXlpnwD-TgY |
| 精灵动画剪辑每秒 12 个采样 | 逐帧 | Brackeys [00:03:42] |
质量门槛
- **可测量:**审计结果为 0 个错误(
AuditSprites、AuditAtlases、Audit2D、LintAnimator);rule_mismatches == 0;跌落探测 < 0.05;pixel_block_check>= 0.999;平移刚性 >= 0.99; 21:9 时void_columns为 0;光照批次 replica = engine;PlayMode 套件 0 次失败;通过ut_stat.summarize_csv检查帧预算。 - **视觉:**每张截图都要经过
ut_review.review_images,并制作一张供你打开查看的联系表;像素边缘使用 2x 裁剪图;光照对比图;critique.md的 A 到 H 部分。
常见错误
| 常见错误 | 表现 | 修复办法 |
|---|---|---|
| 在 URP 中使用 2D Pixel Perfect 包 | 组件错误,设置被忽略 | URP PixelPerfectCamera |
| 每个精灵的 PPU 不同、使用 Bilinear、压缩 | 模糊、颜色偏移、像素不均匀 | ImportPixelArt + AuditSprites |
| 仅凭静帧判断闪烁 | 画面清晰,运动时像素跳动 | pan_shots + shimmer_check;使用整数 Crop Frame |
| OpenScene 后立即批量捕获 | 只显示 Global 光源 | CameraJobs.WarmLights2D |
| 通过脚本添加 Light2D | 阴影已开启,法线未开启(normalMapQuality 只读) | 设置两者;使用 SerializedObject 设置 m_NormalMapQuality |
| 一个光源跳过某个排序图层 | 光源批次被拆分,每个光源都重新绘制 | 在画面效果允许时使用相同的 Target Sorting Layers;使用 LightCost |
| 在移动设备上使用 Accurate 法线、大型光源和多个阴影 | 帧受填充率限制 | 使用 Fast、更小的光源和 1 到 2 个阴影光源 |
| 通过 Batches 或 SetPass 判断图集效果 | “图集毫无作用” | 检查已使用的纹理和内存 |
| 压缩像素艺术图集页 | 平坦像素出现颜色偏移 | 像素图集页的 Compression 设为 None |
_timeJumpWasPressed = 0(Tarodev) | 首次落地时出现虚假跳跃 | float.MinValue |
| 在 FixedUpdate 中读取输入 | 高帧率下按键输入丢失 | 在 Update 中锁存输入 |
| 地面和天花板射线检测命中触发器或单向平台 | 在触发器上被判定为“接地”,或头撞到平台底部 | 设置 useTriggers = false;跳过单向碰撞体(如 PlatformerController2D) |
| 所有游戏都使用同一个 AirDeceleration | 从小平台上滑落,或完全没有惯性 | 按关卡选择;明确说明漂移程度 |
| 危险区域碰撞框 = 美术图 | 擦到 1 px 就死亡 | 使用 Hazard2D.FitHitbox 缩小碰撞框 |
| 地面上的 Rotated 规则变换 | 墙上长出草 | 使用 Fixed 或 MirrorX |
| 为换肤复制 Rule Tile | 规则修复被重复应用或遗漏 | 使用 Rule Override Tile |
| 混合精灵过渡 | 切换延迟且模糊 | 关闭退出时间,将持续时间设为 0 |
| 跟随摄像机使用固定垂直阻尼 | 玩家掉出画面 | 使用 CinemachineFallDamping |
| 进入触发器时切换房间 | 玩家转身返回时摄像机错误 | 按方向在退出时切换 |
旧版 Input.GetAxis | 运行时异常(模板) | 使用 Input System 动作 |
交接内容
- **接收:**来自 scenario-game-assets、scenario-sprite-pipeline、scenario-textures 的精灵和图块(PNG、预期 PPU、调色板);来自 scenario-unity-architecture 的输入操作;来自 scenario-unity-rendering-lighting 的管线资源。
- **交付:**向 scenario-unity-animation 提供 Cinemachine 3 Rig(边界、正交、像素比例、下落阻尼、房间切换);向 scenario-unity-shaders 提供 Sprite Custom Lit 和 Sort 3D as 2D 着色器;向 scenario-unity-vfx 提供像素网格粒子;向 scenario-unity-performance 提供光照批次、填充和基准数据;向 scenario-unity-mobile 提供纹理格式;向 scenario-unity-web 提供 Web 大小数据;向 scenario-unity-pipeline-automation 提供后处理器和 CI 运行结果;向 scenario-unity-ui 提供 HUD;向 scenario-unity-gameplay 提供非平台跳跃游戏物理。每个数据包都包含作业 ID、审计计数、PlayMode 指标和联系表。
Unity 6.3 注意事项
UnityEngine.Rendering.Universal.PixelPerfectCamera(URP 17.3):提供 Grid Snapping 下拉菜单;Filter Mode 没有公共 setter;每次渲染前,摄像机位置都会取整至像素网格。- Universal 2D 模板:仅使用 Input System、Sprite Atlas V2、2D Tooling 1.0.3(Window > Analysis > Sprite Atlas Analyzer)、Tilemap Extras 6.0.2(AutoTile 蒙版:没有公共 API)、2D Animation 13.0.5,并启用 SRP Batcher。Window > 2D > Light Batching Debugger 可查看
LightCost计算的光照批次。 Rigidbody2D.linearVelocity、bodyType;Physics2D.autoSyncTransforms已弃用;LowLevelPhysics2D 在 6.5 中重命名为 PhysicsCore2D。- 2D 中的 3D:使用 Mesh2D-Lit-Default 和 Sort 3D as 2D;2D 光源通过 Sorting Group 照亮网格。
- Cinemachine 默认版本为 2.10.7:固定
com.unity.cinemachine版本为 3.1.7;核心功能在 6.6 中提供。运行时图集将在 6.4 中推出;PVRTC 在 6.4 中移除。
参考资料
references/procedures.md:P0 至 P14 流程、Unity API、实时测试、测量结果。references/expert-notes.md:专家原则、时间戳、决策条件。references/critique.md:评估标准(导入、图集、图块、光照、摄像机、手感、动画与表现力、报告)。references/gui-paths.md:相关操作的窗口和菜单。references/sources.md:来源、凭据、时间戳、修订历史。scripts/ut_2d.py:安装、分辨率和手感计算(跳跃方法、空中漂移)、美术生成器、pixel_block_check、shimmer_check、void_columns、bounds_hide_secrets、指标。scripts/AgentKit/TwoD/:编辑器作业(设置、精灵、图集、Tilemap、关卡、光照与光照成本、摄像机、Cinemachine、动画、审计、LowLevelPhysics2D)。scripts/Runtime/TwoD/:PlatformerController2D、PlatformerStats、Hazard2D、FallDampingSwitch、PlatformerAnimatorBridge、HitStop、CameraShake2D、TopDownMover2D;scripts/Runtime/TwoDCinemachine/:Cinemachine2DRig、CinemachineFallDamping、CinemachineRoomSwap(仅在 CM3 下编译)。