1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using UnityEngine;
- using UnityFS;
- namespace HybridCLR.Editor.UnityBinFileReader
- {
- public class Dataunity3dPatcher
- {
- public void ApplyPatch(string dataunity3dFile, List<string> hotUpdateAssemblies)
- {
- var reader = new BundleFileReader();
- using (var fs = new EndianBinaryReader(new MemoryStream(File.ReadAllBytes(dataunity3dFile))))
- {
- reader.Load(fs);
- }
- var info = reader.CreateBundleFileInfo();
- //Debug.Log($"name:{info.signature} version:{info.version} files:{info.files.Count}");
- //foreach (var file in info.files)
- //{
- // Debug.Log($"file:{file.file} size:{file.data.Length}");
- //}
- var globalgamemanagersFile = info.files.Find(f => f.file == "globalgamemanagers");
- //Debug.LogFormat("gobalgamemanagers origin size:{0}", globalgamemanagersFile.data.Length);
- var ggdBinFile = new UnityBinFile();
- ggdBinFile.LoadFromStream(new MemoryStream(globalgamemanagersFile.data));
- ggdBinFile.AddScriptingAssemblies(hotUpdateAssemblies);
- byte[] patchedGlobalgamedatasBytes = ggdBinFile.CreatePatchedBytes();
- //Debug.LogFormat("gobalgamemanagers post patche size:{0}", patchedGlobalgamedatasBytes.Length);
- globalgamemanagersFile.data = patchedGlobalgamedatasBytes;
- var writer = new BundleFileWriter(info);
- var output = new MemoryStream();
- writer.Write(new EndianBinaryWriter(output));
- Debug.Log($"patch file:{dataunity3dFile} size:{output.Length}");
- string bakFile = dataunity3dFile + ".bak";
- if (!File.Exists(bakFile))
- {
- File.Copy(dataunity3dFile, bakFile);
- }
- File.WriteAllBytes(dataunity3dFile, output.ToArray());
- }
- }
- }
|