mcpField
C
create-2d-physics

create-2d-physics

github.com/unity-technologies开发1.2k1.3k 次安装1 天前更新
代码仓库

关于 create-2d-physics

面向 Unity 开发者的 2D 物理技能,指导识别并处理 Core 与 Legacy 两套互不兼容的物理系统。强调依据项目文档操作、保留回滚点并验证运行行为。

主要功能

  1. 01区分 Core 与 Legacy 物理系统
  2. 02先建立行为基线并创建回滚点
  3. 03按 Unity 版本查阅文档与 API
  4. 04验证场景组件及运行时行为
  5. 05限制改动范围并清理临时日志

适用场景

  1. 01为 Unity 场景添加或配置 2D 物理组件
  2. 02诊断 2D 物理脚本或行为问题
  3. 03核验物理改动在运行时是否生效

安装

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

$npx skills add https://github.com/unity-technologies/skills --skill create-2d-physics

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

包含的文件

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

SECURITY.md
references/
2d-physics-core.md
legacy-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 物理系统。它们不共享代码,也不会相互交互。在编写任何物理代码之前,先确认使用的是哪一种——针对错误系统给出的答案虽然能编译、运行,却不会产生任何效果。

按照以下顺序,根据请求、场景和现有脚本进行判断:

  1. 先检查场景组件和现有脚本,因为组件是可靠的信号。
  2. 检查用户请求的措辞:“添加碰撞体”是组件相关的表述,“生成一千个”是脚本相关的表述。
  3. 如果仍不确定安装了哪些系统,运行以下探测程序。
  4. 如果仍无法确定使用哪种方案,请停止并询问——提供全部三种方案,绝不要替用户选择。
信号系统
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.Physics API,无需安装软件包。

探测程序:

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 表示排除对应方案。

完整主题地图

在继续执行工作流或进行诊断之前:

  1. 打开并阅读涵盖你打算执行或修复的具体主题的文档页面,并检查是否有遗漏。
  2. 在回复中列出你阅读的文件名。

这是因为你对 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 页面。

确定路径后,请在操作前阅读匹配的参考资料:

API 参考

Core 和旧版 API(Unity.U2D.Physics 或 UnityEngine.LowLevelPhysics2D,以及 UnityEngine.Rigidbody2D、Collider2D、Physics2D)属于 Unity 引擎。它们按 Unity 版本进行版本管理,因此在使用特定类或方法之前,请先确认项目的 Unity 版本。

  1. 使用 unity-cli skill 检查项目的 Unity 版本。
  2. 如果 Editor 安装文件夹中有 Data/Documentation 文件夹,请在其中的 en/ScriptReference 文件夹内 grep HTML 文件,并跳过剩余步骤。
  3. 否则,获取并缓存 https://docs.unity3d.com/<VERSION>/Documentation/ScriptReference/xrefmap.yml(将 <VERSION> 替换为项目的 Unity 主版本号和次版本号)。该文件列出了每个公共 API 成员的完全限定名称,作为 uid(例如:uid: 'UnityEngine.Rigidbody2D.AddForce(UnityEngine.Vector2,UnityEngine.ForceMode2D)')。
  4. 在本地 grep yml 文件以查找类或方法,而不是每次查找都重新获取文件。该文件很大(约 6 MB),请勿读取整个文件。
  5. 将 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 版本进行版本管理,因此在使用特定类或方法之前,请先确认已安装的包版本。

  1. 使用 unity-cli skill 检查已安装的包版本。
  2. 获取并缓存 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)。
  3. 在本地 grep yml 文件以查找类或方法,而不是每次查找都重新获取文件。请勿读取整个文件。

始终使用与项目 Unity 版本和已安装包版本匹配的文档,而不要依赖训练知识,因为 API 常会在不同版本中被标记为过时,你记得的成员在项目使用的版本中可能已过时或已移除。

示例

请按以下优先顺序选择示例:所用类型或成员页面上的 C# 示例;现有项目脚本(遵循其风格);示例项目 https://github.com/Unity-Technologies/PhysicsExamples2D。在自行设计模式之前,请先检查以上三者。

最后一步

物理设置的更改会影响运行时行为,因此仅成功编译还不够。请按顺序运行以下检查。如果任何一项检查失败,请重新阅读文档页面,找出遗漏之处,修复后再次运行检查。

  1. 使用 console_status 检查项目是否没有控制台错误。
  2. 读回你所做的更改,因为更改即使能成功编译,也可能不起作用:
    • 对于你添加到场景中或配置过的组件,使用 eval 检查每个组件是否存在于其 GameObject 上,以及其属性是否为你设置的值,例如 Collider 2D 的 isTrigger,或 Core 组件类型页面上列出的成员。
    • 对于脚本,读回脚本并检查它是否使用了 步骤 0 中的系统和命名空间,并且明确设置了每个 Core 刚体的 type。
  3. 添加临时的 Debug.Log 行,打印你更改的行为,例如刚体的位置或速度,或接触回调、触发器回调是否触发。
  4. 进入 Play 模式,检查控制台是否显示预期的日志行且仍然没有错误。你也可以通过 eval 读取世界状态。不要截图,因为这会耗费太多时间。
  5. 退出 Play 模式,移除临时的 Debug.Log 行,并再次检查控制台是否没有错误。

最终报告

简短清单:你更改了什么以及原因、使用了哪种物理系统,以及还有哪些事项需要用户决定或处理。

评论

支持 Markdown