3 个版本
0.0.3 | 2023年7月4日 |
---|---|
0.0.2 | 2023年7月4日 |
0.0.1 | 2023年6月30日 |
#978 in 游戏开发
每月 22 次下载
1MB
12K SLoC
UnityRustEXtractor
Unity 引擎资源文件的提取器和修补工具的测试版本。目前它几乎什么都不能做,请稍后再查看。
依赖项
此项目使用以下依赖项
示例
解析普通 BundleFile 并转储其对象
use std::{
fs::{DirBuilder, File},
io::{Seek, Write},
path::Path,
};
use urex::files::{BundleFile, SerializedFile};
use urex::config::ExtractionConfig;
let mut reader = File::open(fp).unwrap();
let export_dir = Path::new("dump");
// parse the bundle file
let config = ExtractionConfig::new();
let mut bundle = BundleFile::from_reader(&mut reader, &config).unwrap();
// iterate over the files in the bundle
for directory in &bundle.m_DirectoryInfo {
// generate export dir for cab
let export_cab_dir = export_dir.join(&directory.path);
// seek to the start of the file in the bundle
bundle
.m_BlockReader
.seek(std::io::SeekFrom::Start(directory.offset as u64))
.unwrap();
// try to parse the file as a SerializedFile
match SerializedFile::from_reader(&mut bundle.m_BlockReader, &config) {
Ok(serialized) => {
// iterate over objects
for object in &serialized.m_Objects {
// get a helper object to parse the object
let mut handler =
serialized.get_object_handler(object, &mut bundle.m_BlockReader);
// try to get the name
let name = match handler.peak_name() {
Ok(name) => format!("{}_{}", object.m_PathID, name),
Err(_) => format!("{}", object.m_PathID),
};
// ensure that the parent directory exists
let dst_path = export_cab_dir.join(name);
DirBuilder::new()
.recursive(true)
.create(dst_path.parent().unwrap())
.unwrap_or_else(|_| panic!("Failed to create {:?}", dst_path.parent()));
// parse the object as json
let json = handler.parse_as_json().unwrap();
// println!("{:?}", json);
File::create(format!("{}.json", dst_path.to_string_lossy()))
.unwrap()
.write_all(json.to_string().as_bytes())
.unwrap();
// parse the object as yaml
let yaml = handler.parse_as_yaml().unwrap().unwrap();
// println!("{:?}", yaml);
File::create(format!("{}.yaml", dst_path.to_string_lossy()))
.unwrap()
.write_all(serde_yaml::to_string(&yaml).unwrap().as_bytes())
.unwrap();
// parse the object as msgpack
let msgpack = handler.parse_as_msgpack().unwrap();
File::create(format!("{}.msgpack", dst_path.to_string_lossy()))
.unwrap()
.write_all(&msgpack)
.unwrap();
// serialize as actual class
// note: a small part of the object classes isn't implemented yet
if object.m_ClassID == urex::objects::map::AssetBundle {
let ab = handler
.parse::<urex::objects::classes::AssetBundle>()
.unwrap();
println!("{:?}", ab);
}
}
}
Err(e) => {
// TODO - try to filter out resource files
println!(
"Failed to parse {} as SerializedFile.",
&directory.path.to_string()
);
}
}
}
解析由 UnityCN 加密的 BundleFile 并处理移除的 Unity 版本
let mut reader = File::open(fp).unwrap();
let config = ExtractionConfig {
unitycn_key: Some("Decryption Key".as_bytes().try_into().unwrap()),
fallback_unity_version: "2020.3.0f1".to_owned(),
};
let bundle = crate::files::BundleFile::from_reader(&mut reader, &config).unwrap();
读取 UnityCN 加密的 BundleFile
注意
待办事项
-
解析器
- WebFile
- SerializedFile
-
对象类
- 生成器
- 解析器
- 编写器
- 导出函数
-
测试
- 正常测试
- 人工测试文件
- 100% 覆盖率
-
其他
- 功能配置
寻求帮助
待办事项
- 文档
- GitHub 问题讨论
- Discord 服务器
贡献
许可
UnityRustEXtractor 主要在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发。
有关详细信息,请参阅 LICENSE-APACHE、LICENSE-MIT 和 COPYRIGHT.
依赖项
~12MB
~373K SLoC