mcpField
S
scenario-unity-2d

scenario-unity-2d

github.com/scenario-labs开发1.2k236 次安装1 天前更新
代码仓库

关于 scenario-unity-2d

面向 Unity 6.3 开发者与美术人员的 2D 工作技能,涵盖像素画、关卡、光照、动画、相机和角色控制。它以可复现的测量、测试与质量门槛指导制作流程。

主要功能

  1. 01像素画导入与相机校准
  2. 02图集和 Tilemap 构建
  3. 032D 光照成本评估
  4. 04角色控制器与动画配置
  5. 05PlayMode 测试和画面审查

适用场景

  1. 01搭建像素风 2D 项目
  2. 02创建并检查 Tilemap 关卡
  3. 03调试角色跳跃手感
  4. 04评估光照与相机表现

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/scenario-labs/skills --skill scenario-unity-2d

安装后在 Claude Code 中输入/scenario-unity-2d确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
critique.md
expert-notes.md
gui-paths.md
procedures.md
sources.md
scripts/AgentKit/TwoD/
AnimJobs.cs
AtlasJobs.cs
Audit2D.cs
CameraJobs.cs
CinemachineJobs.cs
LevelJobs.cs
LightJobs.cs
PhysicsJobs.cs
SpriteJobs.cs
TilemapJobs.cs
TwoDSetup.cs
TwoDUtil.cs
scripts/Runtime/TwoD/
AgentKit.TwoD.Runtime.asmdef
CameraShake2D.cs
FallDampingSwitch.cs
Hazard2D.cs
HitStop.cs
PlatformerAnimatorBridge.cs
PlatformerController2D.cs
PlatformerStats.cs
TopDownMover2D.cs
scripts/Runtime/TwoDCinemachine/
AgentKit.TwoD.Cinemachine.asmdef
Cinemachine2DRig.cs
CinemachineFallDamping.cs
CinemachineRoomSwap.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 中的易错点)。

立场(专家级补充)

  1. 像素完美是一套流程,而 URP 已内置相机。 每个精灵都使用相同的 PPU(瓦片像素 = 1 单位)、Point、Compression None、整数像素枢轴点,Assets PPU = 精灵 PPU。在 URP 中永远不要安装 com.unity.2d.pixel-perfect:它是内置渲染管线的组件(6.3 Manual)。实测:1080p 下 6 x 6 像素块全部均匀一致。
  2. 根据需要像素化的内容选择 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%。
  3. 在 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 检查;按可同时显示的内容分组是没有任何工具能代劳的步骤。
  4. 控制器负责速度;宽容度属于设计,每种技巧都应有开关。 在 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 步内停下)。
  5. 灯光通过排序图层进行路由,成本按灯光批次计算。 只有当所有可见灯光要么同时照亮相邻排序图层,要么都不照亮时,这些图层才会共用一个灯光批次;法线、阴影和灯光通道会对每个批次各运行一次(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。
  6. 精灵动画绝不混合,并跟随控制器。 关闭 Exit time,duration 设为 0,关闭 Any State 自我转换;动画参数应根据控制器执行的动作设置,而非根据输入设置(Brackeys hkaysu1Z-N8 [00:16:17]、[00:18:57])。
  7. 镜头和反馈效果也是手感的一部分。 上升时采用较松的垂直阻尼,下降速度超过阈值后改用较紧的阻尼,在垂直速度为 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])。
  8. 坦诚面对仅支持 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)。

工作流

  1. 项目。 TwoDSetup.ProjectSetup:从后往前排列排序层(层数尽量少:它们会影响光照批处理),设置 Player 和 Ground 层。门槛:读回层级顺序;不使用像素完美包;使用 Input System;固定步长为 0.02 s。
  2. 导入。 使用 SpriteJobs.ImportPixelArt(切片、像素轴心点、_NormalMap)或 ImportHD(PPU = 高度 / (2 x 正交尺寸),电子书第 21 页);形状瓦片使用 SetPhysicsOutline(16 px 精灵会生成 4 点矩形)。门槛:AuditSprites 错误数为 0;PPU 统一。
  3. 图集。 对每个可同时显示的分组运行 AtlasJobs.BuildAtlas,将受光与不受光资源分开,像素图集页不压缩。门槛:1 页、0 项问题,并写明分组规则。
  4. 关卡。 使用 TilemapJobs.CreateRuleTile + BuildLevel;通过 CreateRuleOverrideTile 更换皮肤;Composite 设置为 Merge、Outlines、Static;仅在运行时编辑时使用逐瓦片碰撞体,然后使用 Use Delaunay Mesh。门槛:rule_mismatches == 0(也要读回更换皮肤后的结果);落体探测误差在 0.05 个单位内;截图中没有接缝。
  5. 角色与动画。 使用 AnimJobs.BuildSpriteAnimator、LevelJobs.Populate(玩家、带内缩命中框的 Hazard2D 尖刺、单向平台)。门槛:LintAnimator 错误数为 0;命中框与美术资源的比例低于 1。
  6. 光照。 运行 LightJobs.LightRig,然后运行 LightJobs.LightCost(配置;相机创建后再检查一次引擎)。门槛:Audit2D 错误数为 0;复刻的光照批次数 = URP 自身的计数;说明每处批次中断和每个覆盖视图一半以上的光源为何合理;法线开关状态的成对截图有所不同。
  7. 相机。 运行 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 正常,已检查联系表。
  8. 手感。 使用模拟输入运行 PlayMode 测试(ut_run.run_tests(P, "PlayMode", graphics=True))。门槛:顶点 = 50 Hz 预测值,时间窗口误差不超过一个步长;30/60/144 fps 下每次按键只触发一次跳跃;逐项进行切换 A/B 测试;写明方法和空中漂移数值。手感本身由人来评判:发布切换项和数值。
  9. 交付。 Audit2D.Scene 无问题;AgentProfile.PlayModeTimings 预算通过;报告每个步骤及其 Unity 调用,然后标注 Verified 和 Assumed。

数值

数值参照来源
PPU = H / (2 x ortho size):4K Size 5 时为 216HD 美术,最接近的缩放电子书第 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 sTarodev 统计数据(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 下编译)。

评论

支持 Markdown