#unity #object #version #assets

urex

UnityRustExtractor 和修补工具的测试版本

3 个版本

0.0.3 2023年7月4日
0.0.2 2023年7月4日
0.0.1 2023年6月30日

#978 in 游戏开发

每月 22 次下载

MIT/Apache

1MB
12K SLoC

UnityRustEXtractor 构建状态 最新版本 文档 License_MIT License_APACHE

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 服务器

贡献

CONTRIBUTING.md.

许可

UnityRustEXtractor 主要在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发。

有关详细信息,请参阅 LICENSE-APACHELICENSE-MITCOPYRIGHT.

依赖项

~12MB
~373K SLoC