# Gakumas纹理替换功能融合说明

## 概述

本项目已成功将 `gakumas-texture-TL` 项目的纹理替换功能完整集成到主项目中。现在只需要使用 `version.dll` 一个文件即可同时实现文字翻译和纹理替换功能。

## 主要改动

### 1. 新增模块

#### TextureReplace模块 (`src/GakumasLocalify/TextureReplace.h/cpp`)
- 负责纹理替换的核心功能
- 包含资源映射配置加载
- 图片文件加载和Unity Texture2D对象创建
- 待替换请求管理

### 2. Hook集成

#### 修改 `src/GakumasLocalify/Hook.cpp`
- 在 `AssetBundle_LoadAssetAsync` Hook中添加纹理替换检测
- 在 `AssetBundleRequest_GetResult` Hook中返回替换后的纹理
- 在初始化流程中调用 `TextureReplace::Initialize()`

### 3. 配置系统

#### Config配置项 (`src/GakumasLocalify/config/`)
- 添加 `enableTextureReplace` 配置项
- 在 `Config.hpp` 中声明
- 在 `Config.cpp` 中实现加载和保存

### 4. 资源目录结构

```
resource/local-files/textures/
├── asset_mapping.txt       # 资源映射配置文件
├── comic/                  # 漫画图片
│   ├── 1ko/               # 一格漫画
│   └── 4ko/               # 四格漫画
├── general_report/        # 好感度偶像档案
├── ui/                    # UI按钮图片
└── tutorial/              # 教程图片
```

## 使用方法

### 1. 启用纹理替换功能

编辑 `resource/localizationConfig.json`，添加或修改:
```json
{
  "enableTextureReplace": true
}
```

### 2. 配置资源映射

编辑 `resource/local-files/textures/asset_mapping.txt`:
```
# 格式: assetId=本地文件路径
img_general_comic_0001=comic/1ko/img_general_comic_0001.png
img_general_comic4_0000=comic/4ko/img_general_comic4_0000.png
img_general_report_akapen_amao-001=general_report/amao/img_general_report_akapen_amao-001.png
```

### 3. 放置图片文件

将替换用的图片文件放置到对应的子目录中:
- `comic/1ko/` - 一格漫画
- `comic/4ko/` - 四格漫画
- `general_report/` - 好感度档案
- `ui/` - UI按钮
- `tutorial/` - 教程图片

### 4. 启动游戏

只需要将编译生成的 `version.dll` 放到游戏目录即可,无需其他DLL文件。

## 技术细节

### Hook工作流程

1. **AssetBundle_LoadAssetAsync Hook**
   - 拦截Unity的资源加载请求
   - 检查资源名称是否在映射表中
   - 如果需要替换,加载本地图片文件
   - 创建Unity Texture2D对象
   - 将替换信息存储到待处理映射表中

2. **AssetBundleRequest_GetResult Hook**
   - 拦截Unity获取加载结果的请求
   - 检查是否有待替换的纹理
   - 如果有,返回替换后的纹理对象
   - 否则返回原始资源

3. **自动清理机制**
   - 每30秒自动清理超时(60秒)的待处理请求
   - 防止内存泄漏

### IL2CPP API使用

通过动态获取IL2CPP函数指针实现:
- `il2cpp_domain_get` - 获取应用域
- `il2cpp_class_from_name` - 查找类
- `il2cpp_object_new` - 创建对象
- `il2cpp_runtime_invoke` - 调用方法

### 与xinput1_3.dll版本的区别

| 特性 | xinput1_3.dll版本 | version.dll集成版本 |
|------|-------------------|---------------------|
| DLL数量 | 2个 (version.dll + xinput1_3.dll) | 1个 (version.dll) |
| 功能集成 | 分离 | 统一 |
| 配置管理 | 独立配置 | 统一配置系统 |
| 日志系统 | 独立日志 | 统一日志系统 |
| 维护性 | 需要维护两套代码 | 单一代码库 |

## 迁移指南

如果你之前使用xinput1_3.dll版本:

1. 备份你的图片文件和 `asset_mapping.txt`
2. 将 `asset_mapping.txt` 复制到 `resource/local-files/textures/`
3. 将所有图片文件按目录结构复制到 `resource/local-files/textures/` 对应子目录
4. 在 `resource/localizationConfig.json` 中设置 `"enableTextureReplace": true`
5. 删除游戏目录中的 `xinput1_3.dll`
6. 使用新编译的 `version.dll` 替换原有的文件

## 注意事项

1. **性能影响**: 纹理替换只对配置文件中列出的资源生效,不会影响其他资源的加载性能

2. **图片格式**: 支持PNG、JPG等Unity支持的常见图片格式

3. **路径分隔符**: 在 `asset_mapping.txt` 中,可以使用正斜杠(/)或反斜杠(\\)

4. **日志输出**: 纹理替换相关的日志会输出到控制台和日志文件中,前缀为 "TextureReplace:"

5. **错误处理**: 如果本地文件不存在或加载失败,会自动使用游戏原始资源

## 调试

启用调试模式查看详细日志:
```json
{
  "enableConsole": true,
  "dbgMode": true,
  "enableTextureReplace": true
}
```

日志会显示:
- 初始化过程
- 加载的映射数量
- 每次资源替换的详细信息
- 错误和警告信息

## 常见问题

**Q: 纹理没有被替换?**
A: 检查以下几点:
1. `enableTextureReplace` 是否设置为 `true`
2. `asset_mapping.txt` 中的资源ID是否正确
3. 图片文件是否存在于指定路径
4. 查看日志输出是否有错误信息

**Q: 游戏启动后控制台显示什么?**
A: 如果启用纹理替换,会看到:
```
TextureReplace: Initializing texture replacement system...
TextureReplace: Created texture directories at: ...
TextureReplace: IL2CPP API initialized successfully
TextureReplace: Loaded X asset mappings
TextureReplace: Texture replacement system initialized successfully
```

**Q: 可以动态添加新的替换图片吗?**
A: 可以,修改 `asset_mapping.txt` 并添加新图片后,重启游戏即可生效

## 开发者信息

- 原xinput1_3版本: gakumas-texture-TL项目
- 集成版本: 本项目
- 集成时间: 2025年11月26日

## 技术支持

如遇到问题,请:
1. 检查日志输出
2. 确认配置文件格式正确
3. 验证图片文件可以正常打开
4. 查看游戏目录权限设置
