[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HSX47FDES52B3WAZRQTM4K":3,"skill-same:01M6HSX47FDES52B3WAZRQTM4K":49},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":23,"linkOnly":24,"markdownContent":25,"markdownBody":26,"frontMatter":27,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":34,"install":35,"resources":48},"01M6HSX47FDES52B3WAZRQTM4K","unreal-modeling",null,"通过 GeometryScript + UCP 进行程序化网格建模。当用户要求创建、修改、修复、简化、UV、布尔、变形或以其他方式处理网格时使用。","welflau\u002Fai-dev-system","welflau","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7010385?v=4","01M6HPTDGF18RFY07M229P8CTM","01M6HPTDMRMZCJPYBFEA9XVVYT",3,"MIT","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fuse_skills\u002Funreal-modeling\u002FSKILL.md",[],[18,19,20,21,22],"unreal","modeling","unreal modeling","ucp","uv","2026-11-10 10:12:30",false,"---\nname: unreal-modeling\ndescription: 通过 GeometryScript + UCP 进行程序化网格建模。当用户要求创建、修改、修复、简化、UV、布尔、变形或以其他方式处理网格时使用。\n---\n\n# 网格建模\n\n建模通过两条路径完成：**MeshOperationLibrary**（生命周期管理 + 类型桥接）和 **GeometryScript 原生库**（600+ 函数，通过 UCP 通用 `call` 直接调用）。\n\n**前置条件**：UE 编辑器运行中，UCP 插件已启用。传输层规则见 `unreal-client-protocol`。\n\n## MeshOperationLibrary\n\nCDO：`\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary`\n\n### 生命周期\n\n| 函数 | 参数 | 说明 |\n|------|------|------|\n| `CreateDynamicMesh` | — | 创建空的临时 DynamicMesh，返回对象路径 |\n| `ReleaseDynamicMesh` | `Mesh` | 标记 mesh 等待 GC 回收 |\n| `ReleaseAllDynamicMeshes` | — | 释放所有已跟踪的 mesh |\n| `ListDynamicMeshes` | — | 列出所有已跟踪 mesh 的路径 |\n\n### 摘要\n\n| 函数 | 参数 | 说明 |\n|------|------|------|\n| `GetMeshSummary` | `TargetMesh` | 返回 JSON：vertexCount、triangleCount、uvSetCount、bounds、hasNormals、hasVertexColors、hasMaterialIDs、hasPolygroups、isClosed、isDense |\n\n### 资产读写\n\n| 函数 | 参数 | 说明 |\n|------|------|------|\n| `CopyFromStaticMesh` | `TargetMesh`, `SourceStaticMesh` | 将 StaticMesh 加载到 DynamicMesh（默认选项） |\n| `CopyToStaticMesh` | `SourceMesh`, `TargetStaticMesh` | 将 DynamicMesh 写回已有 StaticMesh |\n| `CopyToNewStaticMeshAsset` | `SourceMesh`, `AssetPath` | 创建新 StaticMesh 资产，返回资产路径 |\n\n### Selection 桥接\n\nGeometryScript 的 `FGeometryScriptMeshSelection` 内部使用不可序列化的 `TSharedPtr` 存储数据，无法通过 JSON 传递。以下函数从可序列化的输入创建 Selection：\n\n| 函数 | 参数 | 说明 |\n|------|------|------|\n| `SelectAllTriangles` | `TargetMesh` | 选择全部三角形 |\n| `SelectTrianglesByIDs` | `TargetMesh`, `TriangleIDs`(int 数组) | 按 ID 选择三角形 |\n| `SelectVerticesByIDs` | `TargetMesh`, `VertexIDs`(int 数组) | 按 ID 选择顶点 |\n| `SelectPolygroupByID` | `TargetMesh`, `PolygroupID`, `GroupLayer` | 按 Polygroup 选择 |\n| `SelectMaterialByID` | `TargetMesh`, `MaterialID` | 按材质 ID 选择 |\n| `GetSelectionIDs` | `Selection` | 从 Selection 提取 ID 数组 |\n\n### 数据类型桥接\n\nGeometryScript 的列表类型（`FGeometryScriptIndexList`、`FGeometryScriptVectorList` 等）将数据存储在不可序列化的 `TSharedPtr\u003CTArray\u003C...>>` 中。用 `Make*` 从数组创建，用 `Get*Array` 提取：\n\n| Make 函数 | Get 函数 | 桥接类型 |\n|-----------|----------|----------|\n| `MakeIndexList(Indices, IndexType)` | `GetIndexListArray` | `FGeometryScriptIndexList` |\n| `MakeVectorList(Vectors)` | `GetVectorListArray` | `FGeometryScriptVectorList` |\n| `MakePolyPath(Points, bClosedLoop)` | `GetPolyPathArray` | `FGeometryScriptPolyPath` |\n| `MakeSimplePolygon(Vertices)` | `GetSimplePolygonArray` | `FGeometryScriptSimplePolygon` |\n| `MakeColorList(Colors)` | `GetColorListArray` | `FGeometryScriptColorList` |\n| `MakeUVList(UVs)` | `GetUVListArray` | `FGeometryScriptUVList` |\n| `MakeScalarList(Scalars)` | `GetScalarListArray` | `FGeometryScriptScalarList` |\n| `MakeTriangleList(Triangles)` | `GetTriangleListArray` | `FGeometryScriptTriangleList` |\n\n## 直接调用 GeometryScript\n\nGeometryScript 函数是标准的 `BlueprintCallable` 静态函数，通过 UCP 通用 `call` + CDO 路径调用。\n\n### CDO 路径格式\n\n```\n\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_\u003C类名>\n```\n\n示例：`\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshRepairFunctions`\n\n### 参数规则\n\n- **`UDynamicMesh*`**：传路径字符串，如 `\"\u002FEngine\u002FTransient.DynamicMesh_0\"`\n- **`USTRUCT` Options**：传 JSON 对象，只写需要覆盖的字段，省略的字段使用默认值\n- **`UENUM`**：传字符串，即枚举值名，如 `\"Automatic\"`、`\"AttributeAware\"`\n- **`out` 参数**（如 `Outcome`、`NumFilledHoles`）：输入时省略，结果中自动返回\n- **`Debug`**：省略（默认 nullptr）\n- **`WorldContextObject`**：UCP 自动注入\n\n### 返回值\n\n多数 GeometryScript 函数返回 `UDynamicMesh*`（同一个对象，原地修改）。响应中包含 mesh 路径和所有 out 参数。\n\n## 标准工作流\n\n### 示例 1：加载 → 简化 → 写回\n\n```json\n\u002F\u002F 1. 创建工作 mesh\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CreateDynamicMesh\"}\n\n\u002F\u002F 2. 从 StaticMesh 加载\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CopyFromStaticMesh\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"SourceStaticMesh\":\"\u002FGame\u002FMeshes\u002FSM_Rock.SM_Rock\"}}\n\n\u002F\u002F 3. 简化到 5000 三角形\n{\"object\":\"\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshSimplifyFunctions\",\"function\":\"ApplySimplifyToTriangleCount\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"TriangleCount\":5000,\"Options\":{\"Method\":\"AttributeAware\"}}}\n\n\u002F\u002F 4. 写回\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CopyToStaticMesh\",\"params\":{\"SourceMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"TargetStaticMesh\":\"\u002FGame\u002FMeshes\u002FSM_Rock.SM_Rock\"}}\n\n\u002F\u002F 5. 释放\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"ReleaseDynamicMesh\",\"params\":{\"Mesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\"}}\n```\n\n### 示例 2：创建图元 → 保存为新资产\n\n```json\n\u002F\u002F 1. 创建 mesh\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CreateDynamicMesh\"}\n\n\u002F\u002F 2. 追加 Box 图元\n{\"object\":\"\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshPrimitiveFunctions\",\"function\":\"AppendBox\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"PrimitiveOptions\":{},\"DimensionX\":100,\"DimensionY\":100,\"DimensionZ\":100}}\n\n\u002F\u002F 3. 自动生成 UV\n{\"object\":\"\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshUVFunctions\",\"function\":\"AutoGenerateXAtlasMeshUVs\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"UVSetIndex\":0,\"Options\":{}}}\n\n\u002F\u002F 4. 保存为新资产\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CopyToNewStaticMeshAsset\",\"params\":{\"SourceMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"AssetPath\":\"\u002FGame\u002FGenerated\u002FSM_Box\"}}\n\n\u002F\u002F 5. 释放\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"ReleaseDynamicMesh\",\"params\":{\"Mesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\"}}\n```\n\n### 示例 3：布尔合并\n\n```json\n\u002F\u002F 1-2. 创建两个 mesh 并填充（CreateDynamicMesh + AppendSphere \u002F AppendBox）\n\n\u002F\u002F 3. 布尔合并\n{\"object\":\"\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshBooleanFunctions\",\"function\":\"ApplyMeshBoolean\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"TargetTransform\":{\"Rotation\":{\"X\":0,\"Y\":0,\"Z\":0,\"W\":1},\"Translation\":{\"X\":0,\"Y\":0,\"Z\":0},\"Scale3D\":{\"X\":1,\"Y\":1,\"Z\":1}},\"ToolMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_1\",\"ToolTransform\":{\"Rotation\":{\"X\":0,\"Y\":0,\"Z\":0,\"W\":1},\"Translation\":{\"X\":50,\"Y\":0,\"Z\":0},\"Scale3D\":{\"X\":1,\"Y\":1,\"Z\":1}},\"BooleanOperation\":\"Union\",\"Options\":{}}}\n\n\u002F\u002F 4. 释放 mesh B\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"ReleaseDynamicMesh\",\"params\":{\"Mesh\":\"\u002FEngine\u002FTransient.DynamicMesh_1\"}}\n```\n\n## GeometryScript 库索引\n\n每个库对应一个域 Skill，包含完整的函数签名、Options 结构体字段、枚举值和 JSON 示例：\n\n| 域 Skill | 覆盖的库 |\n|----------|----------|\n| `unreal-modeling-primitives` | MeshPrimitiveFunctions、MeshModelingFunctions、PolyPathFunctions、SimplePolygonFunctions、PolygonListFunctions |\n| `unreal-modeling-meshops` | MeshRepairFunctions、MeshSimplifyFunctions、RemeshingFunctions、MeshBooleanFunctions、MeshVoxelFunctions、MeshDecompositionFunctions、MeshBasicEditFunctions、MeshSubdivideFunctions、OpenSubdivFunctions |\n| `unreal-modeling-uv` | MeshUVFunctions |\n| `unreal-modeling-normals` | MeshNormalsFunctions |\n| `unreal-modeling-deform` | MeshDeformFunctions、MeshTransformFunctions |\n| `unreal-modeling-query` | MeshQueryFunctions、MeshSpatialFunctions、MeshSamplingFunctions、ContainmentFunctions、MeshComparisonFunctions、MeshGeodesicFunctions |\n| `unreal-modeling-selection` | MeshSelectionFunctions |\n| `unreal-modeling-attributes` | MeshVertexColorFunctions、MeshPolygroupFunctions、MeshMaterialFunctions |\n| `unreal-modeling-asset` | StaticMeshFunctions、CreateNewAssetFunctions、CollisionFunctions、EditorDynamicMeshFunctions |\n\n## 关键规则\n\n1. **先创建再操作**：调用 GeometryScript 前必须有 DynamicMesh（通过 `CreateDynamicMesh` 或 `CopyFromStaticMesh` 获取）\n2. **用完即释放**：调用 `ReleaseDynamicMesh` 避免临时对象堆积\n3. **原地修改**：多数 GeometryScript 函数原地修改 mesh 并返回同一个 `UDynamicMesh*`\n4. **Options 可选**：USTRUCT Options 参数有合理默认值，只传需要覆盖的字段\n5. **不可序列化类型用桥接函数**：当 GeometryScript 函数需要 `FGeometryScriptMeshSelection`、`FGeometryScriptIndexList`、`FGeometryScriptPolyPath` 等类型时，用 MeshOperationLibrary 的桥接函数从普通数组创建\n6. **用 `DescribeObject` 探索**：对任意 GeometryScript CDO 调用 `DescribeObject` 可查看完整函数列表和签名\n","# 网格建模\n\n建模通过两条路径完成：**MeshOperationLibrary**（生命周期管理 + 类型桥接）和 **GeometryScript 原生库**（600+ 函数，通过 UCP 通用 `call` 直接调用）。\n\n**前置条件**：UE 编辑器运行中，UCP 插件已启用。传输层规则见 `unreal-client-protocol`。\n\n## MeshOperationLibrary\n\nCDO：`\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary`\n\n### 生命周期\n\n| 函数 | 参数 | 说明 |\n|------|------|------|\n| `CreateDynamicMesh` | — | 创建空的临时 DynamicMesh，返回对象路径 |\n| `ReleaseDynamicMesh` | `Mesh` | 标记 mesh 等待 GC 回收 |\n| `ReleaseAllDynamicMeshes` | — | 释放所有已跟踪的 mesh |\n| `ListDynamicMeshes` | — | 列出所有已跟踪 mesh 的路径 |\n\n### 摘要\n\n| 函数 | 参数 | 说明 |\n|------|------|------|\n| `GetMeshSummary` | `TargetMesh` | 返回 JSON：vertexCount、triangleCount、uvSetCount、bounds、hasNormals、hasVertexColors、hasMaterialIDs、hasPolygroups、isClosed、isDense |\n\n### 资产读写\n\n| 函数 | 参数 | 说明 |\n|------|------|------|\n| `CopyFromStaticMesh` | `TargetMesh`, `SourceStaticMesh` | 将 StaticMesh 加载到 DynamicMesh（默认选项） |\n| `CopyToStaticMesh` | `SourceMesh`, `TargetStaticMesh` | 将 DynamicMesh 写回已有 StaticMesh |\n| `CopyToNewStaticMeshAsset` | `SourceMesh`, `AssetPath` | 创建新 StaticMesh 资产，返回资产路径 |\n\n### Selection 桥接\n\nGeometryScript 的 `FGeometryScriptMeshSelection` 内部使用不可序列化的 `TSharedPtr` 存储数据，无法通过 JSON 传递。以下函数从可序列化的输入创建 Selection：\n\n| 函数 | 参数 | 说明 |\n|------|------|------|\n| `SelectAllTriangles` | `TargetMesh` | 选择全部三角形 |\n| `SelectTrianglesByIDs` | `TargetMesh`, `TriangleIDs`(int 数组) | 按 ID 选择三角形 |\n| `SelectVerticesByIDs` | `TargetMesh`, `VertexIDs`(int 数组) | 按 ID 选择顶点 |\n| `SelectPolygroupByID` | `TargetMesh`, `PolygroupID`, `GroupLayer` | 按 Polygroup 选择 |\n| `SelectMaterialByID` | `TargetMesh`, `MaterialID` | 按材质 ID 选择 |\n| `GetSelectionIDs` | `Selection` | 从 Selection 提取 ID 数组 |\n\n### 数据类型桥接\n\nGeometryScript 的列表类型（`FGeometryScriptIndexList`、`FGeometryScriptVectorList` 等）将数据存储在不可序列化的 `TSharedPtr\u003CTArray\u003C...>>` 中。用 `Make*` 从数组创建，用 `Get*Array` 提取：\n\n| Make 函数 | Get 函数 | 桥接类型 |\n|-----------|----------|----------|\n| `MakeIndexList(Indices, IndexType)` | `GetIndexListArray` | `FGeometryScriptIndexList` |\n| `MakeVectorList(Vectors)` | `GetVectorListArray` | `FGeometryScriptVectorList` |\n| `MakePolyPath(Points, bClosedLoop)` | `GetPolyPathArray` | `FGeometryScriptPolyPath` |\n| `MakeSimplePolygon(Vertices)` | `GetSimplePolygonArray` | `FGeometryScriptSimplePolygon` |\n| `MakeColorList(Colors)` | `GetColorListArray` | `FGeometryScriptColorList` |\n| `MakeUVList(UVs)` | `GetUVListArray` | `FGeometryScriptUVList` |\n| `MakeScalarList(Scalars)` | `GetScalarListArray` | `FGeometryScriptScalarList` |\n| `MakeTriangleList(Triangles)` | `GetTriangleListArray` | `FGeometryScriptTriangleList` |\n\n## 直接调用 GeometryScript\n\nGeometryScript 函数是标准的 `BlueprintCallable` 静态函数，通过 UCP 通用 `call` + CDO 路径调用。\n\n### CDO 路径格式\n\n```\n\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_\u003C类名>\n```\n\n示例：`\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshRepairFunctions`\n\n### 参数规则\n\n- **`UDynamicMesh*`**：传路径字符串，如 `\"\u002FEngine\u002FTransient.DynamicMesh_0\"`\n- **`USTRUCT` Options**：传 JSON 对象，只写需要覆盖的字段，省略的字段使用默认值\n- **`UENUM`**：传字符串，即枚举值名，如 `\"Automatic\"`、`\"AttributeAware\"`\n- **`out` 参数**（如 `Outcome`、`NumFilledHoles`）：输入时省略，结果中自动返回\n- **`Debug`**：省略（默认 nullptr）\n- **`WorldContextObject`**：UCP 自动注入\n\n### 返回值\n\n多数 GeometryScript 函数返回 `UDynamicMesh*`（同一个对象，原地修改）。响应中包含 mesh 路径和所有 out 参数。\n\n## 标准工作流\n\n### 示例 1：加载 → 简化 → 写回\n\n```json\n\u002F\u002F 1. 创建工作 mesh\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CreateDynamicMesh\"}\n\n\u002F\u002F 2. 从 StaticMesh 加载\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CopyFromStaticMesh\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"SourceStaticMesh\":\"\u002FGame\u002FMeshes\u002FSM_Rock.SM_Rock\"}}\n\n\u002F\u002F 3. 简化到 5000 三角形\n{\"object\":\"\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshSimplifyFunctions\",\"function\":\"ApplySimplifyToTriangleCount\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"TriangleCount\":5000,\"Options\":{\"Method\":\"AttributeAware\"}}}\n\n\u002F\u002F 4. 写回\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CopyToStaticMesh\",\"params\":{\"SourceMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"TargetStaticMesh\":\"\u002FGame\u002FMeshes\u002FSM_Rock.SM_Rock\"}}\n\n\u002F\u002F 5. 释放\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"ReleaseDynamicMesh\",\"params\":{\"Mesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\"}}\n```\n\n### 示例 2：创建图元 → 保存为新资产\n\n```json\n\u002F\u002F 1. 创建 mesh\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CreateDynamicMesh\"}\n\n\u002F\u002F 2. 追加 Box 图元\n{\"object\":\"\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshPrimitiveFunctions\",\"function\":\"AppendBox\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"PrimitiveOptions\":{},\"DimensionX\":100,\"DimensionY\":100,\"DimensionZ\":100}}\n\n\u002F\u002F 3. 自动生成 UV\n{\"object\":\"\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshUVFunctions\",\"function\":\"AutoGenerateXAtlasMeshUVs\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"UVSetIndex\":0,\"Options\":{}}}\n\n\u002F\u002F 4. 保存为新资产\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"CopyToNewStaticMeshAsset\",\"params\":{\"SourceMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"AssetPath\":\"\u002FGame\u002FGenerated\u002FSM_Box\"}}\n\n\u002F\u002F 5. 释放\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"ReleaseDynamicMesh\",\"params\":{\"Mesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\"}}\n```\n\n### 示例 3：布尔合并\n\n```json\n\u002F\u002F 1-2. 创建两个 mesh 并填充（CreateDynamicMesh + AppendSphere \u002F AppendBox）\n\n\u002F\u002F 3. 布尔合并\n{\"object\":\"\u002FScript\u002FGeometryScriptingCore.Default__GeometryScriptLibrary_MeshBooleanFunctions\",\"function\":\"ApplyMeshBoolean\",\"params\":{\"TargetMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_0\",\"TargetTransform\":{\"Rotation\":{\"X\":0,\"Y\":0,\"Z\":0,\"W\":1},\"Translation\":{\"X\":0,\"Y\":0,\"Z\":0},\"Scale3D\":{\"X\":1,\"Y\":1,\"Z\":1}},\"ToolMesh\":\"\u002FEngine\u002FTransient.DynamicMesh_1\",\"ToolTransform\":{\"Rotation\":{\"X\":0,\"Y\":0,\"Z\":0,\"W\":1},\"Translation\":{\"X\":50,\"Y\":0,\"Z\":0},\"Scale3D\":{\"X\":1,\"Y\":1,\"Z\":1}},\"BooleanOperation\":\"Union\",\"Options\":{}}}\n\n\u002F\u002F 4. 释放 mesh B\n{\"object\":\"\u002FScript\u002FUnrealClientProtocolEditor.Default__MeshOperationLibrary\",\"function\":\"ReleaseDynamicMesh\",\"params\":{\"Mesh\":\"\u002FEngine\u002FTransient.DynamicMesh_1\"}}\n```\n\n## GeometryScript 库索引\n\n每个库对应一个域 Skill，包含完整的函数签名、Options 结构体字段、枚举值和 JSON 示例：\n\n| 域 Skill | 覆盖的库 |\n|----------|----------|\n| `unreal-modeling-primitives` | MeshPrimitiveFunctions、MeshModelingFunctions、PolyPathFunctions、SimplePolygonFunctions、PolygonListFunctions |\n| `unreal-modeling-meshops` | MeshRepairFunctions、MeshSimplifyFunctions、RemeshingFunctions、MeshBooleanFunctions、MeshVoxelFunctions、MeshDecompositionFunctions、MeshBasicEditFunctions、MeshSubdivideFunctions、OpenSubdivFunctions |\n| `unreal-modeling-uv` | MeshUVFunctions |\n| `unreal-modeling-normals` | MeshNormalsFunctions |\n| `unreal-modeling-deform` | MeshDeformFunctions、MeshTransformFunctions |\n| `unreal-modeling-query` | MeshQueryFunctions、MeshSpatialFunctions、MeshSamplingFunctions、ContainmentFunctions、MeshComparisonFunctions、MeshGeodesicFunctions |\n| `unreal-modeling-selection` | MeshSelectionFunctions |\n| `unreal-modeling-attributes` | MeshVertexColorFunctions、MeshPolygroupFunctions、MeshMaterialFunctions |\n| `unreal-modeling-asset` | StaticMeshFunctions、CreateNewAssetFunctions、CollisionFunctions、EditorDynamicMeshFunctions |\n\n## 关键规则\n\n1. **先创建再操作**：调用 GeometryScript 前必须有 DynamicMesh（通过 `CreateDynamicMesh` 或 `CopyFromStaticMesh` 获取）\n2. **用完即释放**：调用 `ReleaseDynamicMesh` 避免临时对象堆积\n3. **原地修改**：多数 GeometryScript 函数原地修改 mesh 并返回同一个 `UDynamicMesh*`\n4. **Options 可选**：USTRUCT Options 参数有合理默认值，只传需要覆盖的字段\n5. **不可序列化类型用桥接函数**：当 GeometryScript 函数需要 `FGeometryScriptMeshSelection`、`FGeometryScriptIndexList`、`FGeometryScriptPolyPath` 等类型时，用 MeshOperationLibrary 的桥接函数从普通数组创建\n6. **用 `DescribeObject` 探索**：对任意 GeometryScript CDO 调用 `DescribeObject` 可查看完整函数列表和签名\n",{"name":5,"description":7},"main","18d0e63d1313ca87098f614aa7c1e2dcf6de79c7","backend\u002Fskills\u002Fuse_skills\u002Funreal-modeling",1,"https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system","https:\u002F\u002Fgithub.com\u002Fwelflau","2026-11-10 11:14:25",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add welflau\u002Fai-dev-system --skill unreal-modeling",{"tool":41,"command":42},"bunx","bunx skills add welflau\u002Fai-dev-system --skill unreal-modeling",{"tool":44,"command":45},"pnpm","pnpm dlx skills add welflau\u002Fai-dev-system --skill unreal-modeling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fuse_skills\u002Funreal-modeling\u002FSKILL.md",true,[],[50,85,117,142,168,192],{"skillNo":51,"name":52,"nameZh":6,"description":53,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":54,"licenseFileUrl":55,"sourceHtmlUrl":56,"categories":57,"keywords":63,"publishedAt":23},"01M6HSTDP4M3JFXEBK91VFB4PA","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FSKILL.md",[58],{"categoryNo":59,"categoryName":60,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","routing","state management","state","file","Tailwind","use","single-file","simple","ui components","multi","for","single",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":54,"licenseFileUrl":89,"sourceHtmlUrl":90,"categories":91,"keywords":101,"publishedAt":23},"01M6HSDXH0JSP8R3QTNY9XZ8HN","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FSKILL.md",[92,93,96],{"categoryNo":59,"categoryName":60,"taxonomyType":61,"taxonomyTypeDesc":62},{"categoryNo":94,"categoryName":95,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":97,"categoryName":98,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[69,102,103,70,65,71,72,104,105,106,66,107,108,109,78,110,111,112,113,114,115,116],"design","frontend design","react components","create","code","examples","applications","landing","ui design","pages","aesthetics","web ui","with","generic","when",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":54,"licenseFileUrl":121,"sourceHtmlUrl":122,"categories":123,"keywords":125,"publishedAt":23},"01M6HSA77QYVP7A72HREGTDN2C","algorithmic-art","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FSKILL.md",[124],{"categoryNo":94,"categoryName":95,"taxonomyType":61,"taxonomyTypeDesc":62},[126,127,128,105,106,129,130,131,132,78,133,134,135,136,114,137,138,139,140,141,116],"algorithmic art","Art","algorithmic","flow","js","work","interactive","generative art","exploration","systems","users","Existing","request","generative","copyright","fields",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":54,"licenseFileUrl":146,"sourceHtmlUrl":147,"categories":148,"keywords":150,"publishedAt":23},"01M6HS9HE0X390Y6RQKTY1YNGJ","theme-factory","Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors\u002Ffonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FSKILL.md",[149],{"categoryNo":94,"categoryName":95,"taxonomyType":61,"taxonomyTypeDesc":62},[151,152,153,154,155,156,66,157,158,159,109,160,161,111,162,114,163,164,165,83,166,167],"theme factory","factory","theme","docs","toolkit","generate","SET","fly","slides","styling","artifact","themes","you","fonts","can","apply","new",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":177,"publishedAt":23},"01M6HS74GASM6FJ77F83EY679E","browsing","Use when you need direct browser control - teaches Chrome DevTools Protocol for controlling existing browser sessions, multi-tab management, form automation, and content extraction via use_browser MCP tool","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fsuperpowers-chrome\u002Fskills\u002Fbrowsing\u002FSKILL.md",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000023","Skill与智能体开发",[170,178,179,180,181,182,183,184,185,186,187,78,188,189,190,191,82,163,83,137],"MCP","automation","chrome","sessions","protocol","browser","devtools","chrome devtools","tool","direct","browser control","control","via","form",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":54,"licenseFileUrl":196,"sourceHtmlUrl":197,"categories":198,"keywords":205,"publishedAt":23},"01M6HS6BZT2CKDNQ6YF20DXN4T","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FSKILL.md",[199,202],{"categoryNo":200,"categoryName":201,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":203,"categoryName":204,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000016","图像与多媒体",[206,207,208,209,210,211,212,213,214,78,215,136,216,217,218,83,138,116],"slack gif creator","slack","gif","creator","validation","Tools","constraints","Animation","knowledge","me","make","Utilities","concepts"]