protected void LoadAllUnityArchives(ZipFile arc, string archiveFilename) { foreach (ZipEntry entry in arc) { if (entry.Name.EndsWith(".unity3d", StringComparison.OrdinalIgnoreCase)) { string assetBundlePath = entry.Name; if (assetBundlePath.Contains('/')) { assetBundlePath = assetBundlePath.Remove(0, assetBundlePath.IndexOf('/') + 1); } AssetBundle getBundleFunc() { AssetBundle bundle; if (entry.CompressionMethod == CompressionMethod.Stored) { long index = (long)locateZipEntryMethodInfo.Invoke(arc, new object[] { entry }); if (DebugLogging.Value) { Logger.Log(LogLevel.Debug, $"Streaming {entry.Name} ({archiveFilename}) unity3d file from disk, offset {index}"); } bundle = AssetBundle.LoadFromFile(archiveFilename, 0, (ulong)index); } else { Logger.Log(LogLevel.Debug, $"Cannot stream {entry.Name} ({archiveFilename}) unity3d file from disk, loading to RAM instead"); var stream = arc.GetInputStream(entry); byte[] buffer = new byte[entry.Size]; stream.Read(buffer, 0, (int)entry.Size); BundleManager.RandomizeCAB(buffer); bundle = AssetBundle.LoadFromMemory(buffer); } if (bundle == null) { Logger.Log(LogLevel.Error, $"Asset bundle \"{entry.Name}\" ({Path.GetFileName(archiveFilename)}) failed to load. It might have a conflicting CAB string."); } return(bundle); } BundleManager.AddBundleLoader(getBundleFunc, assetBundlePath, out string warning); if (!string.IsNullOrEmpty(warning)) { Logger.Log(LogLevel.Warning, $"{warning}"); } } } }