# 关卡工具接口

## 多维资产查询 `level.query_assets`
对场景或项目中的资产进行多维度查询和性能分析，返回“罪证”与优化建议，便于技术美术排查。

### 协议定义
```json
{
  "method": "level.query_assets",
  "description": "对场景或项目中的资产进行多维度查询和性能分析。",
  "params": {
    "scope": {                 // 范围
      "type": "Level | ContentBrowser | Selection",
      "path": "/Game/Props"    // 可选，限制文件夹
    },
    "conditions": {            // 查询条件（可组合）
      "min_triangles": 50000,
      "min_texture_size": 2048,
      "max_texture_size": 0,
      "shader_complexity_index": 0,
      "missing_collision": true,
      "nanite_enabled": false,
      "shadow_casting": true,
      "class_filter": "StaticMeshActor"
    },
    "sort_by": "TriangleCount | TextureMemory | DiskSize",
    "limit": 20
  }
}
```

### 响应（带智能建议）
```json
{
  "code": 200,
  "result": {
    "count": 5,
    "assets": [
      {
        "name": "SM_CoffeeCup",
        "path": "/Game/Props/SM_CoffeeCup.SM_CoffeeCup",
        "type": "StaticMesh",
        "stats": {
          "triangles": 120000,
          "texture_res": "4096 x 4096",
          "nanite": false
        },
        "suggestion": "High poly count (120k) for a small object. Consider enabling Nanite or reducing LOD."
      }
    ]
  }
}
```

### 高级玩法示例
- **垃圾资产猎人**：查高面数且未开启 Nanite 的静态网格  
  ```json
  {
    "conditions": {
      "min_triangles": 100000,
      "nanite_enabled": false,
      "class_filter": "StaticMeshActor"
    }
  }
  ```
- **显存杀手定位**：按纹理显存排序，取 Top N  
  ```json
  { "scope": { "type": "Level" }, "sort_by": "TextureMemory", "limit": 10 }
  ```
- **碰撞体检查**：查缺失碰撞的选中对象或特定命名物  
  ```json
  { "scope": { "type": "Selection" }, "conditions": { "missing_collision": true } }
  ```
- **光影优化**：筛大半径且投射阴影的灯光  
  ```json
  {
    "conditions": {
      "class_filter": "PointLight",
      "shadow_casting": true,
      "min_radius": 5000
    }
  }
  ```

### 前端可视化建议
- Query Builder 拖拽式组合条件，生成 JSON 调用。
- 结果卡片展示缩略图与“罪证”文本，支持一键修复（调用 `actor.set_property` 等）。

### 提示
- 这是接口契约文档，具体查询/统计逻辑需后端实现（如三角面数、贴图尺寸、Nanite 状态、碰撞体检测、材质复杂度等）。可分阶段支持：先实现核心指标，再逐步补齐高级字段。

---

## 批量组织Actor到文件夹 `level.organize_actors`
批量将场景中的Actor归类到指定的世界大纲文件夹，支持按类名过滤。

### 协议定义
```json
{
  "method": "level.organize_actors",
  "description": "批量将场景中的Actor归类到指定的世界大纲文件夹。",
  "params": {
    "folder_path": "Lighting/Indoor",    // 必需：目标文件夹路径
    "filter": {                          // 可选：Actor过滤条件（与actor.get的filter格式相同）
      "class_contains": "PointLight"      // 按类名过滤（包含匹配，忽略大小写）
    }
  }
}
```

### 简化用法（直接传class参数）
```json
{
  "method": "level.organize_actors",
  "params": {
    "folder_path": "Lighting/Indoor",
    "class": "PointLight"                 // 简化用法：直接传类名
  }
}
```

### 响应
```json
{
  "code": 200,
  "result": {
    "count": 5,                           // 成功设置的Actor数量
    "total_found": 5,                     // 匹配到的Actor总数
    "actors": [
      {
        "name": "PointLight_1",
        "class": "PointLight",
        "path": "/Game/Levels/MainLevel:PointLight_1",
        "folder_path": "Lighting/Indoor"
      }
    ]
  }
}
```

### 使用示例
- **将所有点光源归类到室内灯光文件夹**
  ```json
  {
    "folder_path": "Lighting/Indoor",
    "class": "PointLight"
  }
  ```
- **将所有聚光灯归类到聚光灯文件夹**
  ```json
  {
    "folder_path": "Lighting/SpotLights",
    "filter": {
      "class_contains": "SpotLight"
    }
  }
  ```
- **将所有静态网格Actor归类到道具文件夹**
  ```json
  {
    "folder_path": "Props/StaticMeshes",
    "filter": {
      "class_contains": "StaticMeshActor"
    }
  }
  ```

### 注意事项
- 此功能仅在编辑器模式下可用（`WITH_EDITOR`）
- 文件夹路径使用斜杠分隔，如 `"Lighting/Indoor"`
- 如果文件夹不存在，UE会自动创建
- 操作支持撤销（Ctrl+Z）
- filter参数支持与`actor.get`相同的所有过滤选项（class_contains, name_pattern, exclude_classes, property_match等）

