GlobalgamedatasPatcher.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using UnityEngine;
  8. using UnityFS;
  9. namespace HybridCLR.Editor.UnityBinFileReader
  10. {
  11. public class Dataunity3dPatcher
  12. {
  13. public void ApplyPatch(string dataunity3dFile, List<string> hotUpdateAssemblies)
  14. {
  15. var reader = new BundleFileReader();
  16. using (var fs = new EndianBinaryReader(new MemoryStream(File.ReadAllBytes(dataunity3dFile))))
  17. {
  18. reader.Load(fs);
  19. }
  20. var info = reader.CreateBundleFileInfo();
  21. //Debug.Log($"name:{info.signature} version:{info.version} files:{info.files.Count}");
  22. //foreach (var file in info.files)
  23. //{
  24. // Debug.Log($"file:{file.file} size:{file.data.Length}");
  25. //}
  26. var globalgamemanagersFile = info.files.Find(f => f.file == "globalgamemanagers");
  27. //Debug.LogFormat("gobalgamemanagers origin size:{0}", globalgamemanagersFile.data.Length);
  28. var ggdBinFile = new UnityBinFile();
  29. ggdBinFile.LoadFromStream(new MemoryStream(globalgamemanagersFile.data));
  30. ggdBinFile.AddScriptingAssemblies(hotUpdateAssemblies);
  31. byte[] patchedGlobalgamedatasBytes = ggdBinFile.CreatePatchedBytes();
  32. //Debug.LogFormat("gobalgamemanagers post patche size:{0}", patchedGlobalgamedatasBytes.Length);
  33. globalgamemanagersFile.data = patchedGlobalgamedatasBytes;
  34. var writer = new BundleFileWriter(info);
  35. var output = new MemoryStream();
  36. writer.Write(new EndianBinaryWriter(output));
  37. Debug.Log($"patch file:{dataunity3dFile} size:{output.Length}");
  38. string bakFile = dataunity3dFile + ".bak";
  39. if (!File.Exists(bakFile))
  40. {
  41. File.Copy(dataunity3dFile, bakFile);
  42. }
  43. File.WriteAllBytes(dataunity3dFile, output.ToArray());
  44. }
  45. }
  46. }