关于 create-2d-physics
面向 Unity 开发者的 2D 物理技能,指导识别并处理 Core 与 Legacy 两套互不兼容的物理系统。强调依据项目文档操作、保留回滚点并验证运行行为。
主要功能
- 01区分 Core 与 Legacy 物理系统
- 02先建立行为基线并创建回滚点
- 03按 Unity 版本查阅文档与 API
- 04验证场景组件及运行时行为
- 05限制改动范围并清理临时日志
适用场景
- 01为 Unity 场景添加或配置 2D 物理组件
- 02诊断 2D 物理脚本或行为问题
- 03核验物理改动在运行时是否生效
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ unity-technologies/ skills --skill create-2d-physics安装后在 Claude Code 中输入/create-2d-physics确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
SECURITY.mdreferences/2d-physics-core.mdlegacy-2d-physics.md详细介绍
创建和修复 Unity 2D 物理
不要考虑 3D 物理选项。如果证据表明用户指的是 3D,请说明这一点并停止。
重要事项
- 每一步都使用 unity cli(
unity command --format json)以及unity-cli和unity-pipeline技能。 - 进行更改前,先确定当前行为的基线,以便判断后续结果是否确实由你的更改导致。
- 创建还原点,以便在更改失败时回滚。
- 只做用户要求的事。不要更改无关的资源或文件。
- 使用临时的
Debug.Log行验证运行时行为,然后将其移除,因为用户并未要求添加日志,遗留的日志会让脚本和控制台变得杂乱。不要构建用户未要求的静止状态检测或永久日志。参见最后一步。 - 绝不要通过反射类型来发现 API——应改为获取成员页面。系统探测是唯一例外。
向 eval 传递 C#
eval 编译的是语句块,而不是文件,因此编写代码时不要使用 using 指令,并使用完全限定的类型。对你想读取的内容使用 return;结果会出现在 data.result.result。如果代码无法编译,请在此处查找错误:
| 错误 | 原因 | 修复方法 |
|---|---|---|
CS0210 | 编译器将 using 指令视为资源释放语句 | 移除该指令,并使用限定类型名 |
CS0246 / CS0103 | 类型未限定,例如 Rigidbody2D 或 PhysicsWorld | 使用完整名称,例如 UnityEngine.Rigidbody2D 或 Unity.U2D.Physics.PhysicsWorld |
CS0104 | 单独使用 Object,与 object 冲突 | 使用 UnityEngine.Object |
步骤 0:物理系统类型
Unity 有两种 2D 物理系统。它们不共享代码,也不会相互交互。在编写任何物理代码之前,先确认使用的是哪一种——针对错误系统给出的答案虽然能编译、运行,却不会产生任何效果。
按照以下顺序,根据请求、场景和现有脚本进行判断:
- 先检查场景组件和现有脚本,因为组件是可靠的信号。
- 检查用户请求的措辞:“添加碰撞体”是组件相关的表述,“生成一千个”是脚本相关的表述。
- 如果仍不确定安装了哪些系统,运行以下探测程序。
- 如果仍无法确定使用哪种方案,请停止并询问——提供全部三种方案,绝不要替用户选择。
| 信号 | 系统 |
|---|---|
| Physics Pose、Area、Constraint 或 Simulation 组件 | 核心组件,要求 6000.7+ 并安装相应软件包 |
| Rigidbody 2D、Collider 2D、Joint 2D、Effector 2D | 旧版 |
脚本中使用 Unity.U2D.Physics 或 UnityEngine.LowLevelPhysics2D 类型 | 脚本中的核心系统 |
Rigidbody2D、Collider2D、Physics2D 类型 | 旧版 |
| 两者都存在 | 分离的模拟。说明这一点,并分别处理 |
| 没有信号 | 停止并询问,提供上述三种方案 |
说明:
- 旧版 = Rigidbody 2D 和 Collider 2D 组件。
- 核心组件 = Physics Pose 和 Physics Area,需要
com.unity.2d.physics和 Unity 6000.7+。 - 脚本中的核心系统 =
Unity.U2D.PhysicsAPI,无需安装软件包。
探测程序:
unity command eval --code 'var r = ""; foreach (var n in new[] { "UnityEngine.Rigidbody2D", "Unity.U2D.Physics.PhysicsWorld", "UnityEngine.LowLevelPhysics2D.PhysicsWorld", "Unity.U2D.Physics.PhysicsPose" }) { var f = false; foreach (var a in System.AppDomain.CurrentDomain.GetAssemblies()) if (a.GetType(n) != null) f = true; r += f + ","; } return r;'
探测结果依次为:存在旧版系统、存在 Unity.U2D.Physics 核心系统、存在 UnityEngine.LowLevelPhysics2D 核心系统、存在核心组件。如果任一核心系统的值为 true,则核心系统存在;值为 true 的那一项会给出命名空间。false 表示排除对应方案。
完整主题地图
在继续执行工作流或进行诊断之前:
- 打开并阅读涵盖你打算执行或修复的具体主题的文档页面,并检查是否有遗漏。
- 在回复中列出你阅读的文件名。
这是因为你对 Unity 的训练知识可能已经过时、有误,或不适用于当前 Unity 版本。
优先使用 WebFetch,而非 WebSearch——速度更快,而且能直接打开准确的参考资料。只获取所需内容。获取前,将 <VERSION> 替换为以下内容:
- docs.unity3d.com 上的软件包:软件包版本,例如
@6.6或@2.0。如果不确定,请检查软件包版本。 - docs.unity.com:产品版本,例如
7000.0
对于 docs.unity.com 上的引擎页面,请使用 Unity 版本,例如 6000.7。页面为 Markdown 格式,URL 以 .md 结尾。请在 Packages/packages-lock.json 中查找软件包版本,因为 manifest.json 可能包含版本范围或 Git URL,而非已解析的版本。
如果 Editor 安装文件夹中有 Data/Documentation 文件夹(例如 ...Unity/Hub/Editor/6000.6.0b2/Editor/Data/Documentation),请阅读 en/Manual 文件夹中的 HTML 文件。否则,请使用下方参考资料中列出的在线 .md 页面。
确定路径后,请在操作前阅读匹配的参考资料:
- 2D Physics Core 参考资料 - 组件、配置组件、通过脚本创建实体、所有权以及完整的 Core 主题地图。
- 旧版 2D Physics 参考资料 - 旧版手册主题地图。
API 参考
Core 和旧版 API(Unity.U2D.Physics 或 UnityEngine.LowLevelPhysics2D,以及 UnityEngine.Rigidbody2D、Collider2D、Physics2D)属于 Unity 引擎。它们按 Unity 版本进行版本管理,因此在使用特定类或方法之前,请先确认项目的 Unity 版本。
- 使用
unity-cliskill 检查项目的 Unity 版本。 - 如果 Editor 安装文件夹中有
Data/Documentation文件夹,请在其中的en/ScriptReference文件夹内 grep HTML 文件,并跳过剩余步骤。 - 否则,获取并缓存
https://docs.unity3d.com/<VERSION>/Documentation/ScriptReference/xrefmap.yml(将<VERSION>替换为项目的 Unity 主版本号和次版本号)。该文件列出了每个公共 API 成员的完全限定名称,作为uid(例如:uid: 'UnityEngine.Rigidbody2D.AddForce(UnityEngine.Vector2,UnityEngine.ForceMode2D)')。 - 在本地 grep yml 文件以查找类或方法,而不是每次查找都重新获取文件。该文件很大(约 6 MB),请勿读取整个文件。
- 将
uid转换为 Markdown 页面:删除方括号中的参数,将其转换为小写,把.替换为/,并添加.md。然后获取https://docs.unity.com/en-us/engine/<VERSION>/script-reference/<converted uid>。例如,UnityEngine.Rigidbody2D.AddForce(UnityEngine.Vector2,UnityEngine.ForceMode2D)=>https://docs.unity.com/en-us/engine/<VERSION>/script-reference/unityengine/rigidbody2d/addforce.md。所有重载都在同一页面上。- 构造函数使用
ctor(例如unityengine/vector2/ctor.md),索引器使用item(例如unityengine/vector2/item.md)。 - 页面中的链接以
/engine/开头。在它们前面添加https://docs.unity.com/en-us。 - 如果该 Unity 版本没有对应页面,请改用
xrefmap.yml条目中的href(例如href: 'Rigidbody2D.AddForce.html'=>https://docs.unity3d.com/<VERSION>/Documentation/ScriptReference/Rigidbody2D.AddForce.html)。
- 构造函数使用
Core 组件(Physics Pose、Area、Constraint、Simulation)位于 com.unity.2d.physics 包的 Unity.U2D.Physics 命名空间中。它们按包版本而非 Unity 版本进行版本管理,因此在使用特定类或方法之前,请先确认已安装的包版本。
- 使用
unity-cliskill 检查已安装的包版本。 - 获取并缓存
https://docs.unity3d.com/Packages/com.unity.2d.physics@<version>/xrefmap.yml(将<version>替换为已安装包的主版本号和次版本号)。此文件会将每个公共 API 成员的完全限定名称映射到其文档页面href(例如:href: api/Unity.U2D.Physics.PhysicsPose.html=>https://docs.unity3d.com/Packages/com.unity.2d.physics@<version>/api/Unity.U2D.Physics.PhysicsPose.html)。 - 在本地 grep yml 文件以查找类或方法,而不是每次查找都重新获取文件。请勿读取整个文件。
始终使用与项目 Unity 版本和已安装包版本匹配的文档,而不要依赖训练知识,因为 API 常会在不同版本中被标记为过时,你记得的成员在项目使用的版本中可能已过时或已移除。
示例
请按以下优先顺序选择示例:所用类型或成员页面上的 C# 示例;现有项目脚本(遵循其风格);示例项目 https://github.com/Unity-Technologies/PhysicsExamples2D。在自行设计模式之前,请先检查以上三者。
最后一步
物理设置的更改会影响运行时行为,因此仅成功编译还不够。请按顺序运行以下检查。如果任何一项检查失败,请重新阅读文档页面,找出遗漏之处,修复后再次运行检查。
- 使用
console_status检查项目是否没有控制台错误。 - 读回你所做的更改,因为更改即使能成功编译,也可能不起作用:
- 对于你添加到场景中或配置过的组件,使用
eval检查每个组件是否存在于其 GameObject 上,以及其属性是否为你设置的值,例如 Collider 2D 的isTrigger,或 Core 组件类型页面上列出的成员。 - 对于脚本,读回脚本并检查它是否使用了 步骤 0 中的系统和命名空间,并且明确设置了每个 Core 刚体的
type。
- 对于你添加到场景中或配置过的组件,使用
- 添加临时的
Debug.Log行,打印你更改的行为,例如刚体的位置或速度,或接触回调、触发器回调是否触发。 - 进入 Play 模式,检查控制台是否显示预期的日志行且仍然没有错误。你也可以通过
eval读取世界状态。不要截图,因为这会耗费太多时间。 - 退出 Play 模式,移除临时的
Debug.Log行,并再次检查控制台是否没有错误。
最终报告
简短清单:你更改了什么以及原因、使用了哪种物理系统,以及还有哪些事项需要用户决定或处理。