# DecorateConfigEditor 修改清单

## 版本更新日期：2025-12-26

---

## 📋 功能限制

### 1. AreaId 限制
- **限制内容**：禁止编辑 AreaId = 1 或 2 的配置
- **实现位置**：
  - `OnLoadConfigClicked()` - 读取配置时检查
  - `OnSaveConfigClicked()` - 保存配置时检查
  - `CreateNewAreaConfig()` - 创建新场景时检查
- **提示信息**："AreaId 1 和 2 包含特殊处理，不支持通过此工具编辑。如需修改请联系编辑器作者。"
- **原因**：AreaId 1和2包含特殊处理逻辑，避免误操作

### 2. 步骤数量限制
- **限制内容**：步骤数量固定为 25，不允许修改
- **实现位置**：
  - `BindUIControls()` - UI加载时禁用步骤数量输入框
  - `OnLoadConfigClicked()` - 强制设置为25
  - `CreateNewAreaConfig()` - 新场景默认25步
  - UXML界面 - 添加提示文字："不可修改，如需调整请联系编辑器作者"
- **UI表现**：StepCountField 输入框禁用（灰色不可编辑）

### 3. 不存在的AreaId处理
- **处理逻辑**：
  - 读取配置时，如果指定的AreaId不存在，弹出提示框
  - 提示信息："未找到AreaId=X的配置。如需创建新场景，请点击'创建新场景'按钮。"
  - **不进行任何自动创建**，只提示用户
- **实现位置**：`OnLoadConfigClicked()`

### 4. 创建新场景流程
- **新增按钮**："创建新场景"按钮（在配置管理区域）
- **操作流程**：
  1. 点击"创建新场景"按钮
  2. 弹出输入对话框，要求输入AreaId
  3. 验证AreaId（不能是1或2，不能是已存在的）
  4. 创建25个默认步骤配置
  5. 自动记录bg初始状态（如果bg节点已设置）
  6. 允许用户进行编辑
  7. **此时配置未保存到文件**，需要手动点击"保存配置"
- **新增类**：`InputDialogWindow` - 用于输入AreaId的弹窗

---

## 🎯 Spine相关特殊处理

### 1. UI中隐藏Spine操作
- **实现位置**：`ParseAndCreateActionGroups()`
- **处理逻辑**：
  ```csharp
  // 跳过所有spine相关操作，用户不可见不可编辑
  if (actionType.Contains("spine")) continue;
  ```
- **支持的spine类型**：
  - `init_spine` - 初始化spine
  - `replace_spine` - 替换spine
  - 任何包含"spine"关键字的操作

### 2. 保存时保留Spine配置
- **实现位置**：`UpdateRowActionString()`
- **处理逻辑**：
  1. 从原始Action字符串中提取所有spine操作
  2. 将spine操作放在新Action字符串的**最前面**
  3. 后面跟用户编辑的其他操作
- **代码示例**：
  ```csharp
  // 保存原有的spine操作（放在最前面）
  List<string> spineActions = new List<string>();
  if (!string.IsNullOrEmpty(row.Action))
  {
      string[] oldActions = row.Action.Split('@');
      foreach (string oldAction in oldActions)
      {
          if (oldAction.Contains("spine"))
          {
              spineActions.Add(oldAction);
          }
      }
  }
  // 先添加spine操作
  actionStrings.AddRange(spineActions);
  ```

### 3. 场景还原时跳过Spine
- **实现位置**：
  - `ApplyInitAction()` - 跳过 init_spine
  - `ApplyStepAction()` - 跳过所有spine操作
- **效果**：用户在预览场景时，spine相关操作不会执行，但配置保持完整

---

## ✨ 新增功能

### 1. reset_pos 操作支持
- **操作格式**：`reset_pos#节点路径,x=y`
- **示例**：`reset_pos#bg/clearObj/my_sg_2,-156=-838`
- **功能**：重置指定GameObject的位置（RectTransform.anchoredPosition）

#### UI实现：
- **类型**：固定2个字段
  - ObjectField：选择目标GameObject
  - TextField：输入位置坐标（格式：x=y，如：-156=-838）
- **位置**：与clear、add、replace、replace_image并列
- **添加按钮**："+ ResetPos"

#### 代码实现：
1. **CreateActionGroup()** - 创建reset_pos UI组
   ```csharp
   else if (actionType == "reset_pos")
   {
       ObjectField objField = new ObjectField("目标节点:");
       TextField posField = new TextField("位置(x=y):");
   }
   ```

2. **ParseAndCreateActionGroups()** - 解析现有reset_pos配置
   ```csharp
   else if (actionType == "reset_pos")
   {
       string[] pathParts = paths.Split(',');
       // 解析节点和位置
   }
   ```

3. **UpdateRowActionString()** - 生成reset_pos字符串
   ```csharp
   else if (actionType == "reset_pos")
   {
       actionStrings.Add($"reset_pos#{targetPath},{position}");
   }
   ```

4. **ApplyResetPosAction()** - 应用reset_pos操作
   ```csharp
   private void ApplyResetPosAction(string paths)
   {
       // 解析x=y格式
       string[] posParts = positionStr.Split('=');
       rt.anchoredPosition = new Vector2(x, y);
   }
   ```

### 2. 只读Action字符串显示
- **位置**：每个步骤编辑区域的顶部
- **显示内容**：当前步骤的完整Action配置字符串
- **特性**：
  - 只读（不可编辑）
  - 灰色显示（opacity: 0.7）
  - 多行显示（multiline）
  - 实时更新：当用户编辑操作组时，自动更新显示
- **UI元素名称**：`ActionDisplay`
- **更新位置**：`UpdateRowActionString()` 末尾

---

## 🔧 代码结构优化

### 新增文件
无新增文件，所有修改在现有文件中

### 新增类
1. **InputDialogWindow**（EditorWindow）
   - 用途：创建新场景时输入AreaId
   - 包含字段：
     - `message` - 提示信息
     - `inputValue` - 用户输入的值
     - `confirmed` - 是否确认
   - 方法：`OnGUI()` - 绘制输入界面

### 新增方法
1. **OnCreateNewSceneClicked()** - 处理"创建新场景"按钮点击
2. **ShowInputDialog()** - 显示输入对话框
3. **ApplyResetPosAction()** - 应用reset_pos操作

### 修改的方法
1. **BindUIControls()** - 禁用步骤数量输入框
2. **OnLoadConfigClicked()** - 添加AreaId和配置存在检查
3. **OnSaveConfigClicked()** - 添加AreaId限制检查
4. **CreateNewAreaConfig()** - 改为弹窗输入AreaId，添加验证
5. **ParseAndCreateActionGroups()** - 跳过spine，支持reset_pos
6. **CreateActionGroup()** - 支持reset_pos类型
7. **UpdateRowActionString()** - 保留spine操作，支持reset_pos
8. **ApplyStepAction()** - 跳过所有spine操作
9. **ApplyInitAction()** - 跳过init_spine
10. **CreateStepEditItem()** - 添加只读Action显示

---

## 📝 配置文件格式说明

### Action字符串格式
```
操作1@操作2@操作3...
```

### 支持的操作类型
| 操作类型 | 格式 | 示例 | UI编辑 |
|---------|------|------|--------|
| clear | `clear#路径1,路径2,...` | `clear#bg/clearObj/3,bg/clearObj/4` | ✅ 可编辑 |
| add | `add#路径1,路径2,...` | `add#bg/addObj/5,bg/addObj/6` | ✅ 可编辑 |
| replace | `replace#旧路径,新路径` | `replace#bg/clearObj/1,bg/addObj/1` | ✅ 可编辑 |
| replace_image | `replace_image#节点路径,图片路径` | `replace_image#bg,BG/s3_bg_2` | ✅ 可编辑 |
| reset_pos | `reset_pos#节点路径,x=y` | `reset_pos#bg/clearObj/2,-156=-838` | ✅ 可编辑 |
| init_spine | `init_spine#...` | - | ❌ 自动保留 |
| replace_spine | `replace_spine#...` | - | ❌ 自动保留 |

### Spine操作处理策略
- **读取时**：spine操作不显示在UI中
- **编辑时**：用户无法看到和修改spine操作
- **保存时**：spine操作放在Action字符串的最前面，原样保留
- **预览时**：spine操作不执行（避免spine加载问题）

---

## ⚠️ 注意事项

1. **AreaId限制**
   - AreaId 1和2不可通过编辑器修改
   - 如需修改，需要直接编辑配置文件或联系编辑器作者

2. **步骤数量固定**
   - 所有场景固定25步
   - 如需修改步骤数量，需要修改编辑器代码

3. **Spine无感知**
   - 用户在UI中完全看不到spine相关配置
   - 但spine配置不会丢失，保存时会自动保留

4. **新场景创建**
   - 创建新场景后，配置仅在内存中，需手动保存
   - 保存前可以预览场景效果

5. **reset_pos坐标格式**
   - 必须使用 `x=y` 格式（使用等号=分隔）
   - 示例：`-156=-838` 或 `100=200`
   - 不支持其他分隔符（如逗号或冒号）

6. **配置完整性**
   - 只读Action显示帮助验证配置正确性
   - 建议每次编辑后检查只读显示的内容

---

## 🐛 已知问题

无

---

## 📞 联系方式

如需对编辑器进行调整或遇到问题，请联系编辑器作者（你）。

---

## 📊 测试检查清单

- [ ] 尝试编辑AreaId=1，验证拒绝
- [ ] 尝试编辑AreaId=2，验证拒绝
- [ ] 尝试修改步骤数量，验证输入框禁用
- [ ] 读取不存在的AreaId，验证提示正确
- [ ] 创建新场景，输入AreaId=1，验证拒绝
- [ ] 创建新场景，输入AreaId=3，验证成功
- [ ] 创建新场景，输入已存在的AreaId，验证拒绝
- [ ] 编辑包含spine的配置，验证spine不显示在UI
- [ ] 保存包含spine的配置，验证spine保留在最前面
- [ ] 添加reset_pos操作，验证可正常添加和编辑
- [ ] 预览包含reset_pos的步骤，验证位置正确设置
- [ ] 编辑操作后，验证只读Action显示实时更新
- [ ] 新建场景不保存直接关闭，验证配置文件未改变
