502 lines
14 KiB
Markdown
502 lines
14 KiB
Markdown
## actor.spawn v2.0 (全能生成)
|
||
|
||
|
||
- **Method**:`actor.spawn`
|
||
- **Params**:
|
||
- `instances`: 数组,支持单体/批量统一入口。每个元素:
|
||
- `asset_id`: 推荐字段,智能解析三级回落:
|
||
1) 别名(内置):`cube` `sphere` `cylinder` `cone` `plane` `point_light` `spot_light` `directional_light` `rect_light` `camera`
|
||
2) 资源路径:如 `/Game/Environment/Props/SM_Table_01.SM_Table_01`(静态网格自动生成 `AStaticMeshActor` 并绑定 Mesh);或蓝图类路径 `/Game/BP_Enemy.BP_Enemy_C`(直接 Spawn 类)
|
||
3) 类名:如 `BP_Enemy_C` 或 `/Script/Engine.PointLight`
|
||
- 兼容字段:`preset`(旧别名)、`class`(旧类路径)
|
||
- `name`:可选,强制命名
|
||
- `mesh`:可选,覆盖静态网格路径(优先级高于解析出的 Mesh)
|
||
- `transform`:可选对象,或顶层字段 `location/rotation/scale`(向后兼容)
|
||
- `location` `{x,y,z}`,`rotation` `{pitch,yaw,roll}`,`scale` `{x,y,z}`
|
||
- 兼容:旧字段 `batch` 会被转为 `instances`
|
||
- **Response**:
|
||
- `count`: 成功创建数量
|
||
- `created`: 数组,对应输入顺序,失败位置为 `null`
|
||
- `name`,`path`,`class`
|
||
- `asset_id`(若输入使用 asset_id)
|
||
- `type`(解析出的类型名)
|
||
- `preset`(若走了别名)
|
||
- **示例**:
|
||
```json
|
||
{
|
||
"ver": "2.0",
|
||
"method": "actor.spawn",
|
||
"params": {
|
||
"instances": [
|
||
{ "asset_id": "point_light", "transform": { "location": { "z": 500 } } },
|
||
{ "asset_id": "/Game/Environment/Props/SM_Table_01.SM_Table_01", "transform": { "location": { "x": 200 } } },
|
||
{ "asset_id": "/Game/Blueprints/Characters/BP_NPC_Guard.BP_NPC_Guard_C", "name": "Guard_01", "transform": { "location": { "x": -200 }, "rotation": { "yaw": 90 } } }
|
||
]
|
||
}
|
||
}
|
||
```
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"result": {
|
||
"count": 3,
|
||
"created": [
|
||
{ "name": "PointLight_4", "type": "PointLight" },
|
||
{ "name": "SM_Table_01_2", "type": "StaticMeshActor" },
|
||
{ "name": "Guard_01", "type": "BP_NPC_Guard_C" }
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
## actor.get_info v2.0 (场景感知 / 统一 Selector)
|
||
|
||
- **Method**:`actor.get_info`
|
||
- **Params**:
|
||
- `targets`: 对象(复用 `actor.set_transform` / `actor.destroy` 选择器)
|
||
- `names`: 可选,字符串数组,按 Label 精准查找
|
||
- `paths`: 可选,字符串数组,按对象路径查找
|
||
- `filter`: 可选,场景扫描筛选
|
||
- `class`: 类名包含匹配(模糊,忽略大小写)
|
||
- `name_pattern`: 名称通配匹配(Wildcard)
|
||
- `exclude_classes`: 数组,排除类名(全等匹配,忽略大小写)
|
||
- `return_transform`: `true`/`false`,默认 `true`。返回 `transform`(location/rotation/scale),若只想看列表可置 `false` 节省 Token。
|
||
- `return_bounds`: `true`/`false`,默认 `false`。返回组件包围盒尺寸 `bounds {x,y,z}`(堆叠/避障需要尺寸时再开)。
|
||
- `limit`: 整数,默认 `50`,限制返回数量保护上下文。
|
||
- **Response**:
|
||
- `count`: 实际返回的数量(受 limit 截断)
|
||
- `total_found`: 真实匹配总数(可提示还有更多)
|
||
- `actors`: 数组
|
||
- 基础:`name`, `class`, `path`
|
||
- 可选:`transform`(`location/rotation/scale`,需 `return_transform=true`)、`bounds`(需 `return_bounds=true`)
|
||
|
||
- **示例 1:精准查询(椅子还在吗?在哪?)**
|
||
```json
|
||
{
|
||
"ver": "2.0",
|
||
"method": "actor.get_info",
|
||
"params": {
|
||
"targets": {
|
||
"names": ["Chair_01"]
|
||
},
|
||
"return_transform": true
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 2:环境扫描(看看有哪些灯,最多 5 个)**
|
||
```json
|
||
{
|
||
"ver": "2.0",
|
||
"method": "actor.get_info",
|
||
"params": {
|
||
"targets": {
|
||
"filter": {
|
||
"class": "Light"
|
||
}
|
||
},
|
||
"limit": 5,
|
||
"return_transform": true
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例响应**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"result": {
|
||
"count": 2,
|
||
"total_found": 15,
|
||
"actors": [
|
||
{
|
||
"name": "PointLight_1",
|
||
"class": "PointLight",
|
||
"path": "/Game/Maps/Level1.PointLight_1",
|
||
"transform": {
|
||
"location": { "x": 100, "y": 200, "z": 300 },
|
||
"rotation": { "pitch": 0, "yaw": 0, "roll": 0 },
|
||
"scale": { "x": 1, "y": 1, "z": 1 }
|
||
}
|
||
},
|
||
{
|
||
"name": "SpotLight_Hallway",
|
||
"class": "SpotLight",
|
||
"path": "/Game/Maps/Level1.SpotLight_Hallway",
|
||
"transform": {
|
||
"location": { "x": 500, "y": 200, "z": 300 },
|
||
"rotation": { "pitch": 0, "yaw": 0, "roll": 0 },
|
||
"scale": { "x": 1, "y": 1, "z": 1 }
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## actor.inspect v2.0 (按需内省 / 防止 Token 爆炸)
|
||
|
||
- **Method**:`actor.inspect`
|
||
- **Params**:
|
||
- `targets`: 对象(统一 Selector,推荐单体,也可批量)
|
||
- `names/paths/filter` 同 `actor.get_info`
|
||
- `properties`: 字符串数组;为空/缺省时使用默认白名单
|
||
- 默认白名单:`Mobility`, `bHidden`, `CollisionProfileName`, `Tags`
|
||
- **Response**:
|
||
- `count`: 返回的 actor 数量
|
||
- `actors`: 数组
|
||
- `name`, `class`, `path`
|
||
- `props`: 仅包含请求的属性键值
|
||
|
||
- **示例 1:默认查询(常用核心属性)**
|
||
```json
|
||
{
|
||
"ver": "2.0",
|
||
"method": "actor.inspect",
|
||
"params": {
|
||
"targets": { "names": ["MyCube"] }
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 2:定向查询(只看灯光关键参数)**
|
||
```json
|
||
{
|
||
"ver": "2.0",
|
||
"method": "actor.inspect",
|
||
"params": {
|
||
"targets": { "names": ["PointLight_1"] },
|
||
"properties": ["Intensity", "LightColor", "AttenuationRadius"]
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例响应**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"result": {
|
||
"count": 1,
|
||
"actors": [
|
||
{
|
||
"name": "PointLight_1",
|
||
"class": "PointLight",
|
||
"path": "/Game/Maps/Level1.PointLight_1",
|
||
"props": {
|
||
"Intensity": 5000.0,
|
||
"LightColor": { "r": 255, "g": 255, "b": 255, "a": 255 },
|
||
"AttenuationRadius": 1000.0
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## actor.set_property v1.0(通用属性修改 / 带智能提示)
|
||
|
||
- **Method**:`actor.set_property`
|
||
- **Params**:
|
||
- `targets`: 统一 Selector(names/paths/filter)
|
||
- `properties`: 对象,键为属性名,值为目标值。示例:`{"Intensity": 10000.0, "LightColor": {"r": 255, "g": 0, "b": 0}}`
|
||
- **行为与防呆**:
|
||
- 自动 Actor → RootComponent → 其他组件 递归查找属性(避免点光源/网格属性找不到)
|
||
- **特殊属性拦截白名单**(调用专用函数,而非简单反射修改):
|
||
- `ActorLabel` / `Label`:调用 `SetActorLabel()`,自动处理名称冲突(若重名则自动加后缀)
|
||
- `FolderPath`:调用 `SetFolderPath()`,正确刷新世界大纲文件夹归类
|
||
- `SimulatePhysics` / `bSimulatePhysics`:调用 `SetSimulatePhysics()`,触发物理状态重建
|
||
- `Mobility`:调用 `SetMobility()`,正确处理光照/导航网格失效。值可为 `"Static"` / `"Stationary"` / `"Movable"`
|
||
- `Hidden` / `bHidden` / `HiddenInGame`:调用 `SetActorHiddenInGame()`,**运行时隐藏**(编辑器视图中仍可见)
|
||
- `HiddenInEditor` / `bHiddenInEditor` / `bHiddenEd`:调用 `SetIsTemporarilyHiddenInEditor()`,**编辑器隐藏**(在编辑器视图中立即隐藏/显示)
|
||
- `Tags`:Actor 标签数组,支持三种模式:
|
||
- 数组覆盖:`["tag1", "tag2"]` 替换所有标签
|
||
- 单字符串:`"tag1"` 添加单个标签(不覆盖)
|
||
- 增删对象:`{ "add": ["tag1"], "remove": ["tag2"] }` 精确控制增删
|
||
- 属性不存在:不会直接 404,会返回 `suggestions`(按编辑距离排序),提示可能的正确属性名
|
||
- 类型不匹配:返回 `expected_type` 及 `current_value`,帮助 AI 校正格式/类型
|
||
- 支持类型:数字(整型/浮点)、bool、string/name/text、FVector、FRotator、FLinearColor、FColor;其它结构会提示不支持
|
||
- **Response**:
|
||
- `count`: 成功修改的 Actor 数量
|
||
- `actors`: 数组
|
||
- `name`, `class`, `path`
|
||
- `updated`: 成功写入的键值
|
||
- `errors`: 可选数组,包含 `{ property, error, suggestions?, expected_type?, current_value? }`;对于 ActorLabel 名称冲突场景,会返回 `{ property, warning, requested, actual }`
|
||
|
||
- **示例**
|
||
```json
|
||
{
|
||
"method": "actor.set_property",
|
||
"params": {
|
||
"targets": { "names": ["PointLight_1"] },
|
||
"properties": {
|
||
"Intensity": 10000.0,
|
||
"LightColor": { "r": 255, "g": 0, "b": 0 }
|
||
}
|
||
}
|
||
}
|
||
```
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"result": {
|
||
"count": 1,
|
||
"actors": [
|
||
{
|
||
"name": "PointLight_1",
|
||
"class": "PointLight",
|
||
"updated": {
|
||
"Intensity": 10000.0,
|
||
"LightColor": { "r": 255, "g": 0, "b": 0, "a": 1 }
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 2:重命名 Actor(修改 ActorLabel)**
|
||
```json
|
||
{
|
||
"method": "actor.set_property",
|
||
"params": {
|
||
"targets": { "names": ["Floor"] },
|
||
"properties": {
|
||
"ActorLabel": "MainFloor"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"result": {
|
||
"count": 1,
|
||
"actors": [
|
||
{
|
||
"name": "MainFloor",
|
||
"class": "StaticMeshActor",
|
||
"updated": {
|
||
"ActorLabel": "MainFloor"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 3:归类到大纲文件夹(FolderPath)**
|
||
```json
|
||
{
|
||
"method": "actor.set_property",
|
||
"params": {
|
||
"targets": { "filter": { "class": "SpotLight" } },
|
||
"properties": {
|
||
"FolderPath": "Lighting/SpotLights"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 4:开启物理模拟(SimulatePhysics)**
|
||
```json
|
||
{
|
||
"method": "actor.set_property",
|
||
"params": {
|
||
"targets": { "names": ["Cup_01"] },
|
||
"properties": {
|
||
"SimulatePhysics": true,
|
||
"Mobility": "Movable"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 5:隐藏 Actor - 运行时隐藏(bHidden)**
|
||
```json
|
||
{
|
||
"method": "actor.set_property",
|
||
"params": {
|
||
"targets": { "names": ["DebugHelper"] },
|
||
"properties": {
|
||
"bHidden": true
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 6:隐藏 Actor - 编辑器隐藏(HiddenInEditor)**
|
||
```json
|
||
{
|
||
"method": "actor.set_property",
|
||
"params": {
|
||
"targets": { "names": ["ConstructionGuide"] },
|
||
"properties": {
|
||
"HiddenInEditor": true
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 7:添加标签 - 单个标签**
|
||
```json
|
||
{
|
||
"method": "actor.set_property",
|
||
"params": {
|
||
"targets": { "filter": { "name_pattern": "test_*" } },
|
||
"properties": {
|
||
"Tags": "test"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 8:设置标签 - 覆盖所有标签**
|
||
```json
|
||
{
|
||
"method": "actor.set_property",
|
||
"params": {
|
||
"targets": { "names": ["Player_Start"] },
|
||
"properties": {
|
||
"Tags": ["PlayerSpawn", "Important", "DoNotDelete"]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
- **示例 9:增删标签 - 精确控制**
|
||
```json
|
||
{
|
||
"method": "actor.set_property",
|
||
"params": {
|
||
"targets": { "names": ["OldActor"] },
|
||
"properties": {
|
||
"Tags": { "add": ["NewTag"], "remove": ["DeprecatedTag"] }
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## actor.destroy v2.0 (统一 Selector)
|
||
|
||
- **Method**:`actor.destroy`
|
||
- **Params**:
|
||
- `targets`: 对象(与 `actor.set_transform` 选择器一致)
|
||
- `names`: 可选,字符串数组,按 Label 匹配
|
||
- `paths`: 可选,字符串数组,按对象路径匹配
|
||
- `filter`: 可选,对场景扫描筛选
|
||
- `class`: 类名包含匹配(模糊,忽略大小写)
|
||
- `name_pattern`: 名称通配匹配(Wildcard)
|
||
- `exclude_classes`: 数组,排除类名(全等匹配,忽略大小写)
|
||
- 兼容:旧字段 `name/path` 会被自动转换;`actor.destroy_batch` 的 `batch` 会被转换为 `targets.names/paths`
|
||
- **Response**:
|
||
- `count`: 成功删除的数量
|
||
- `target_count`: 被选中的数量
|
||
- `deleted_actors`: 数组,包含已删除的 `name/path/class`
|
||
- **示例**:
|
||
```json
|
||
{
|
||
"method": "actor.destroy",
|
||
"params": {
|
||
"targets": {
|
||
"names": ["Cube_1", "Sphere_Test_3"]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"result": {
|
||
"count": 2,
|
||
"deleted_actors": ["Cube_1", "Sphere_Test_3"]
|
||
}
|
||
}
|
||
```
|
||
```json
|
||
{
|
||
"method": "actor.destroy",
|
||
"params": {
|
||
"targets": {
|
||
"filter": {
|
||
"class": "DecalActor",
|
||
"name_pattern": "*_Debug_*"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
|
||
## actor.set_transform (统一变换接口)
|
||
- 结 构:`targets`(选择器) + `operation`(操作)
|
||
- `targets` 字段:
|
||
- `names`: 字符串数组,指定 Actor 名称。
|
||
- `paths`: 字符串数组,指定 Actor 路径。
|
||
- `filter`: 筛选器对象,支持 `class` (包含匹配), `name_pattern` (通配符), `exclude_classes` (排除类名数组)。
|
||
- `operation` 字段:
|
||
- `space`: `"World"` (默认) 或 `"Local"`。
|
||
- `snap_to_floor`: `true` (执行贴地)。
|
||
- `set`: 绝对值设置 (`location`, `rotation`, `scale`)。
|
||
- `add`: 增量设置 (`location`, `rotation`, `scale`),支持负数。
|
||
- `multiply`: 倍乘设置 (`location`, `rotation`, `scale`)。
|
||
- 计算顺序:先应用 `set`,再 `add`,最后 `multiply`;若 `space = "Local"`,增量位移会按本次最终旋转(累积后的 `rotation`)进行方向变换。
|
||
- 示例 1:单体绝对设置(Z=200)
|
||
```json
|
||
{
|
||
"ver":"1.0","type":"req","id":"t1","method":"actor.set_transform",
|
||
"params":{
|
||
"targets": {"names": ["MyCube"]},
|
||
"operation": {
|
||
"set": {"location": {"z": 200}}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
- 示例 2:批量增量(所有灯光 Z 轴上移 500,局部坐标系)
|
||
```json
|
||
{
|
||
"ver":"1.0","type":"req","id":"t2","method":"actor.set_transform",
|
||
"params":{
|
||
"targets": {
|
||
"filter": {"class": "Light"}
|
||
},
|
||
"operation": {
|
||
"space": "Local",
|
||
"add": {"location": {"z": 500}}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
- 示例 3:多选倍乘(Cube_1 和 Sphere_2 放大 2 倍)
|
||
```json
|
||
{
|
||
"ver":"1.0","type":"req","id":"t3","method":"actor.set_transform",
|
||
"params":{
|
||
"targets": {
|
||
"names": ["Cube_1", "Sphere_2"]
|
||
},
|
||
"operation": {
|
||
"multiply": {"scale": {"x": 2, "y": 2, "z": 2}}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
- 响应(code 200):
|
||
```json
|
||
{"ver":"1.0","type":"res","id":"t1","code":200,"result":{"count":1,"actors":[{"name":"MyCube",...}]}}
|
||
```
|
||
|
||
|
||
|
||
|
||
|
||
|