1
0
Fork 0
gkms-localify-dmm-texture/TEXTURE_REPLACE_INTEGRATION.md

192 lines
5.6 KiB
Markdown

# 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. 查看游戏目录权限设置