Improve file import

fixed bug
This commit is contained in:
Perfare 2018-03-01 03:42:43 +08:00
parent 4ef160de34
commit 3d60c5a7f6
28 changed files with 344 additions and 376 deletions

View File

@ -27,7 +27,7 @@ namespace Unity_Studio
public AssetBundle(AssetPreloadData preloadData) public AssetBundle(AssetPreloadData preloadData)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
var m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); var m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());

View File

@ -38,7 +38,7 @@ namespace Unity_Studio
public AudioClip(AssetPreloadData preloadData, bool readSwitch) public AudioClip(AssetPreloadData preloadData, bool readSwitch)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
if (sourceFile.platform == -2) if (sourceFile.platform == -2)
@ -107,7 +107,10 @@ namespace Unity_Studio
if (!File.Exists(resourceFilePath)) if (!File.Exists(resourceFilePath))
{ {
var findFiles = Directory.GetFiles(Path.GetDirectoryName(sourceFile.filePath), resourceFileName, SearchOption.AllDirectories); var findFiles = Directory.GetFiles(Path.GetDirectoryName(sourceFile.filePath), resourceFileName, SearchOption.AllDirectories);
if (findFiles.Length > 0) { resourceFilePath = findFiles[0]; } if (findFiles.Length > 0)
{
resourceFilePath = findFiles[0];
}
} }
if (File.Exists(resourceFilePath)) if (File.Exists(resourceFilePath))
{ {
@ -119,7 +122,7 @@ namespace Unity_Studio
} }
else else
{ {
if (UnityStudio.assetsfileandstream.TryGetValue(resourceFileName, out var reader)) if (UnityStudio.resourceFileReaders.TryGetValue(resourceFileName.ToUpper(), out var reader))
{ {
reader.Position = m_Offset; reader.Position = m_Offset;
m_AudioData = reader.ReadBytes((int)m_Size); m_AudioData = reader.ReadBytes((int)m_Size);

View File

@ -12,7 +12,7 @@ namespace Unity_Studio
public BuildSettings(AssetPreloadData preloadData) public BuildSettings(AssetPreloadData preloadData)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
int levels = a_Stream.ReadInt32(); int levels = a_Stream.ReadInt32();

View File

@ -13,7 +13,7 @@ namespace Unity_Studio
public unityFont(AssetPreloadData preloadData, bool readSwitch) public unityFont(AssetPreloadData preloadData, bool readSwitch)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
if (sourceFile.platform == -2) if (sourceFile.platform == -2)

View File

@ -25,7 +25,7 @@ namespace Unity_Studio
if (preloadData != null) if (preloadData != null)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
uniqueID = preloadData.uniqueID; uniqueID = preloadData.uniqueID;

View File

@ -19,7 +19,7 @@ namespace Unity_Studio
public Material(AssetPreloadData preloadData) public Material(AssetPreloadData preloadData)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
if (sourceFile.platform == -2) if (sourceFile.platform == -2)

View File

@ -331,7 +331,7 @@ namespace Unity_Studio
//Stream = new EndianStream(File.OpenRead(sourceFile.filePath), sourceFile.endianType); //Stream = new EndianStream(File.OpenRead(sourceFile.filePath), sourceFile.endianType);
//Stream.endian = sourceFile.endianType; //Stream.endian = sourceFile.endianType;
var version = MeshPD.sourceFile.version; var version = MeshPD.sourceFile.version;
a_Stream = MeshPD.sourceFile.a_Stream; a_Stream = MeshPD.sourceFile.assetsFileReader;
a_Stream.Position = MeshPD.Offset; a_Stream.Position = MeshPD.Offset;
bool m_Use16BitIndices = true; //3.5.0 and newer always uses 16bit indices bool m_Use16BitIndices = true; //3.5.0 and newer always uses 16bit indices
uint m_MeshCompression = 0; uint m_MeshCompression = 0;

View File

@ -14,7 +14,7 @@ namespace Unity_Studio
public MeshFilter(AssetPreloadData preloadData) public MeshFilter(AssetPreloadData preloadData)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
if (sourceFile.platform == -2) if (sourceFile.platform == -2)

View File

@ -18,7 +18,7 @@ namespace Unity_Studio
public MeshRenderer(AssetPreloadData preloadData) public MeshRenderer(AssetPreloadData preloadData)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
if (sourceFile.platform == -2) if (sourceFile.platform == -2)

View File

@ -12,7 +12,7 @@ namespace Unity_Studio
public MonoBehaviour(AssetPreloadData preloadData, bool readSwitch) public MonoBehaviour(AssetPreloadData preloadData, bool readSwitch)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
var m_GameObject = sourceFile.ReadPPtr(); var m_GameObject = sourceFile.ReadPPtr();

View File

@ -13,7 +13,7 @@ namespace Unity_Studio
public MovieTexture(AssetPreloadData preloadData, bool readSwitch) public MovieTexture(AssetPreloadData preloadData, bool readSwitch)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());

View File

@ -13,7 +13,7 @@ namespace Unity_Studio
public PlayerSettings(AssetPreloadData preloadData) public PlayerSettings(AssetPreloadData preloadData)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;

View File

@ -16,7 +16,7 @@ namespace Unity_Studio
public Shader(AssetPreloadData preloadData, bool readSwitch) public Shader(AssetPreloadData preloadData, bool readSwitch)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
if (sourceFile.platform == -2) if (sourceFile.platform == -2)

View File

@ -21,7 +21,7 @@ namespace Unity_Studio
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var version = preloadData.sourceFile.version; var version = preloadData.sourceFile.version;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
if (sourceFile.platform == -2) if (sourceFile.platform == -2)

View File

@ -21,7 +21,7 @@ namespace Unity_Studio
public Sprite(AssetPreloadData preloadData, bool readSwitch) public Sprite(AssetPreloadData preloadData, bool readSwitch)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var reader = preloadData.sourceFile.a_Stream; var reader = preloadData.sourceFile.assetsFileReader;
reader.Position = preloadData.Offset; reader.Position = preloadData.Offset;
var version = sourceFile.version; var version = sourceFile.version;

View File

@ -16,7 +16,7 @@ namespace Unity_Studio
public SpriteAtlas(AssetPreloadData preloadData) public SpriteAtlas(AssetPreloadData preloadData)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var reader = preloadData.sourceFile.a_Stream; var reader = preloadData.sourceFile.assetsFileReader;
reader.Position = preloadData.Offset; reader.Position = preloadData.Offset;
var m_Name = reader.ReadAlignedString(reader.ReadInt32()); var m_Name = reader.ReadAlignedString(reader.ReadInt32());

View File

@ -14,7 +14,7 @@ namespace Unity_Studio
public TextAsset(AssetPreloadData preloadData, bool readSwitch) public TextAsset(AssetPreloadData preloadData, bool readSwitch)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
if (sourceFile.platform == -2) if (sourceFile.platform == -2)

View File

@ -91,7 +91,7 @@ namespace Unity_Studio
public Texture2D(AssetPreloadData preloadData, bool readSwitch) public Texture2D(AssetPreloadData preloadData, bool readSwitch)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
version = sourceFile.version; version = sourceFile.version;
@ -171,7 +171,10 @@ namespace Unity_Studio
if (!File.Exists(resourceFilePath)) if (!File.Exists(resourceFilePath))
{ {
var findFiles = Directory.GetFiles(Path.GetDirectoryName(sourceFile.filePath), resourceFileName, SearchOption.AllDirectories); var findFiles = Directory.GetFiles(Path.GetDirectoryName(sourceFile.filePath), resourceFileName, SearchOption.AllDirectories);
if (findFiles.Length > 0) { resourceFilePath = findFiles[0]; } if (findFiles.Length > 0)
{
resourceFilePath = findFiles[0];
}
} }
if (File.Exists(resourceFilePath)) if (File.Exists(resourceFilePath))
{ {
@ -183,7 +186,7 @@ namespace Unity_Studio
} }
else else
{ {
if (UnityStudio.assetsfileandstream.TryGetValue(resourceFileName, out var reader)) if (UnityStudio.resourceFileReaders.TryGetValue(resourceFileName.ToUpper(), out var reader))
{ {
reader.Position = offset; reader.Position = offset;
image_data = reader.ReadBytes(image_data_size); image_data = reader.ReadBytes(image_data_size);

View File

@ -17,7 +17,7 @@ namespace Unity_Studio
public Transform(AssetPreloadData preloadData) public Transform(AssetPreloadData preloadData)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
if (sourceFile.platform == -2) if (sourceFile.platform == -2)

View File

@ -15,7 +15,7 @@ namespace Unity_Studio
public VideoClip(AssetPreloadData preloadData, bool readSwitch) public VideoClip(AssetPreloadData preloadData, bool readSwitch)
{ {
var sourceFile = preloadData.sourceFile; var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream; var a_Stream = preloadData.sourceFile.assetsFileReader;
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
@ -47,38 +47,49 @@ namespace Unity_Studio
} }
//StreamedResource m_ExternalResources //StreamedResource m_ExternalResources
var m_Source = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); var m_Source = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
if (m_Source != "")
m_Source = Path.Combine(Path.GetDirectoryName(sourceFile.filePath), m_Source.Replace("archive:/", ""));
var m_Offset = a_Stream.ReadUInt64(); var m_Offset = a_Stream.ReadUInt64();
var m_Size = a_Stream.ReadUInt64(); var m_Size = a_Stream.ReadUInt64();
var m_HasSplitAlpha = a_Stream.ReadBoolean(); var m_HasSplitAlpha = a_Stream.ReadBoolean();
if (readSwitch) if (readSwitch)
{ {
if (string.IsNullOrEmpty(m_Source)) if (!string.IsNullOrEmpty(m_Source))
{ {
if (m_Size > 0) var resourceFileName = Path.GetFileName(m_Source);
m_VideoData = a_Stream.ReadBytes((int)m_Size); var resourceFilePath = Path.GetDirectoryName(sourceFile.filePath) + "\\" + resourceFileName;
} if (!File.Exists(resourceFilePath))
else if (File.Exists(m_Source) || File.Exists(m_Source = Path.Combine(Path.GetDirectoryName(sourceFile.filePath), Path.GetFileName(m_Source))))
{
using (var reader = new BinaryReader(File.OpenRead(m_Source)))
{ {
reader.BaseStream.Position = (long)m_Offset; var findFiles = Directory.GetFiles(Path.GetDirectoryName(sourceFile.filePath), resourceFileName, SearchOption.AllDirectories);
m_VideoData = reader.ReadBytes((int)m_Size); if (findFiles.Length > 0)
{
resourceFilePath = findFiles[0];
}
}
if (File.Exists(resourceFilePath))
{
using (var reader = new BinaryReader(File.OpenRead(resourceFilePath)))
{
reader.BaseStream.Position = (long)m_Offset;
m_VideoData = reader.ReadBytes((int)m_Size);
}
}
else
{
if (UnityStudio.resourceFileReaders.TryGetValue(resourceFileName.ToUpper(), out var reader))
{
reader.Position = (long)m_Offset;
m_VideoData = reader.ReadBytes((int)m_Size);
}
else
{
MessageBox.Show($"can't find the resource file {resourceFileName}");
}
} }
} }
else else
{ {
if (UnityStudio.assetsfileandstream.TryGetValue(Path.GetFileName(m_Source), out var reader)) if (m_Size > 0)
{ m_VideoData = a_Stream.ReadBytes((int)m_Size);
reader.Position = (long)m_Offset;
m_VideoData = reader.ReadBytes((int)m_Size);
}
else
{
MessageBox.Show($"can't find the resource file {Path.GetFileName(m_Source)}");
}
} }
} }
else else

View File

@ -10,10 +10,11 @@ namespace Unity_Studio
{ {
public class AssetsFile public class AssetsFile
{ {
public EndianBinaryReader a_Stream; public EndianBinaryReader assetsFileReader;
public string filePath; public string filePath;
public string bundlePath; public string bundlePath;
public string fileName; public string fileName;
public string upperFileName;
public int fileGen; public int fileGen;
public bool valid; public bool valid;
public string m_Version = "2.5.0f5"; public string m_Version = "2.5.0f5";
@ -144,52 +145,53 @@ namespace Unity_Studio
public class UnityShared public class UnityShared
{ {
public int Index = -1; //actual index in main list public int Index = -2; //-2 - Prepare, -1 - Missing
public string aName = ""; public string aName = "";
public string fileName = ""; public string fileName = "";
} }
public AssetsFile(string fullName, EndianBinaryReader fileStream) public AssetsFile(string fullName, EndianBinaryReader reader)
{ {
a_Stream = fileStream; assetsFileReader = reader;
filePath = fullName; filePath = fullName;
fileName = Path.GetFileName(fullName); fileName = Path.GetFileName(fullName);
upperFileName = fileName.ToUpper();
try try
{ {
int tableSize = a_Stream.ReadInt32(); int tableSize = assetsFileReader.ReadInt32();
int dataEnd = a_Stream.ReadInt32(); int dataEnd = assetsFileReader.ReadInt32();
fileGen = a_Stream.ReadInt32(); fileGen = assetsFileReader.ReadInt32();
uint dataOffset = a_Stream.ReadUInt32(); uint dataOffset = assetsFileReader.ReadUInt32();
sharedAssetsList[0].fileName = Path.GetFileName(fullName); //reference itself because sharedFileIDs start from 1 sharedAssetsList[0].fileName = Path.GetFileName(fullName); //reference itself because sharedFileIDs start from 1
switch (fileGen) switch (fileGen)
{ {
case 6: //2.5.0 - 2.6.1 case 6: //2.5.0 - 2.6.1
{ {
a_Stream.Position = (dataEnd - tableSize); assetsFileReader.Position = (dataEnd - tableSize);
a_Stream.Position += 1; assetsFileReader.Position += 1;
break; break;
} }
case 7: //3.0.0 beta case 7: //3.0.0 beta
{ {
a_Stream.Position = (dataEnd - tableSize); assetsFileReader.Position = (dataEnd - tableSize);
a_Stream.Position += 1; assetsFileReader.Position += 1;
m_Version = a_Stream.ReadStringToNull(); m_Version = assetsFileReader.ReadStringToNull();
break; break;
} }
case 8: //3.0.0 - 3.4.2 case 8: //3.0.0 - 3.4.2
{ {
a_Stream.Position = (dataEnd - tableSize); assetsFileReader.Position = (dataEnd - tableSize);
a_Stream.Position += 1; assetsFileReader.Position += 1;
m_Version = a_Stream.ReadStringToNull(); m_Version = assetsFileReader.ReadStringToNull();
platform = a_Stream.ReadInt32(); platform = assetsFileReader.ReadInt32();
break; break;
} }
case 9: //3.5.0 - 4.6.x case 9: //3.5.0 - 4.6.x
{ {
a_Stream.Position += 4; //azero assetsFileReader.Position += 4; //azero
m_Version = a_Stream.ReadStringToNull(); m_Version = assetsFileReader.ReadStringToNull();
platform = a_Stream.ReadInt32(); platform = assetsFileReader.ReadInt32();
break; break;
} }
case 14: //5.0.0 beta and final case 14: //5.0.0 beta and final
@ -197,10 +199,10 @@ namespace Unity_Studio
case 16: //??.. no sure case 16: //??.. no sure
case 17: //5.5.0 and up case 17: //5.5.0 and up
{ {
a_Stream.Position += 4; //azero assetsFileReader.Position += 4; //azero
m_Version = a_Stream.ReadStringToNull(); m_Version = assetsFileReader.ReadStringToNull();
platform = a_Stream.ReadInt32(); platform = assetsFileReader.ReadInt32();
baseDefinitions = a_Stream.ReadBoolean(); baseDefinitions = assetsFileReader.ReadBoolean();
break; break;
} }
default: default:
@ -215,7 +217,7 @@ namespace Unity_Studio
byte[] b32 = BitConverter.GetBytes(platform); byte[] b32 = BitConverter.GetBytes(platform);
Array.Reverse(b32); Array.Reverse(b32);
platform = BitConverter.ToInt32(b32, 0); platform = BitConverter.ToInt32(b32, 0);
a_Stream.endian = EndianType.LittleEndian; assetsFileReader.endian = EndianType.LittleEndian;
} }
switch (platform) switch (platform)
@ -267,16 +269,16 @@ namespace Unity_Studio
break; break;
} }
int baseCount = a_Stream.ReadInt32(); int baseCount = assetsFileReader.ReadInt32();
for (int i = 0; i < baseCount; i++) for (int i = 0; i < baseCount; i++)
{ {
if (fileGen < 14) if (fileGen < 14)
{ {
int classID = a_Stream.ReadInt32(); int classID = assetsFileReader.ReadInt32();
string baseType = a_Stream.ReadStringToNull(); string baseType = assetsFileReader.ReadStringToNull();
string baseName = a_Stream.ReadStringToNull(); string baseName = assetsFileReader.ReadStringToNull();
a_Stream.Position += 20; assetsFileReader.Position += 20;
int memberCount = a_Stream.ReadInt32(); int memberCount = assetsFileReader.ReadInt32();
var cb = new List<ClassMember>(); var cb = new List<ClassMember>();
for (int m = 0; m < memberCount; m++) for (int m = 0; m < memberCount; m++)
@ -296,10 +298,10 @@ namespace Unity_Studio
if (fileGen >= 7 && fileGen < 14) if (fileGen >= 7 && fileGen < 14)
{ {
a_Stream.Position += 4; //azero assetsFileReader.Position += 4; //azero
} }
int assetCount = a_Stream.ReadInt32(); int assetCount = assetsFileReader.ReadInt32();
#region asset preload table #region asset preload table
string assetIDfmt = "D" + assetCount.ToString().Length; //format for unique ID string assetIDfmt = "D" + assetCount.ToString().Length; //format for unique ID
@ -309,29 +311,29 @@ namespace Unity_Studio
//each table entry is aligned individually, not the whole table //each table entry is aligned individually, not the whole table
if (fileGen >= 14) if (fileGen >= 14)
{ {
a_Stream.AlignStream(4); assetsFileReader.AlignStream(4);
} }
AssetPreloadData asset = new AssetPreloadData(); AssetPreloadData asset = new AssetPreloadData();
asset.m_PathID = fileGen < 14 ? a_Stream.ReadInt32() : a_Stream.ReadInt64(); asset.m_PathID = fileGen < 14 ? assetsFileReader.ReadInt32() : assetsFileReader.ReadInt64();
asset.Offset = a_Stream.ReadUInt32(); asset.Offset = assetsFileReader.ReadUInt32();
asset.Offset += dataOffset; asset.Offset += dataOffset;
asset.Size = a_Stream.ReadInt32(); asset.Size = assetsFileReader.ReadInt32();
if (fileGen > 15) if (fileGen > 15)
{ {
int index = a_Stream.ReadInt32(); int index = assetsFileReader.ReadInt32();
asset.Type1 = classIDs[index][0]; asset.Type1 = classIDs[index][0];
asset.Type2 = classIDs[index][1]; asset.Type2 = classIDs[index][1];
} }
else else
{ {
asset.Type1 = a_Stream.ReadInt32(); asset.Type1 = assetsFileReader.ReadInt32();
asset.Type2 = a_Stream.ReadUInt16(); asset.Type2 = assetsFileReader.ReadUInt16();
a_Stream.Position += 2; assetsFileReader.Position += 2;
} }
if (fileGen == 15) if (fileGen == 15)
{ {
byte unknownByte = a_Stream.ReadByte(); byte unknownByte = assetsFileReader.ReadByte();
//this is a single byte, not an int32 //this is a single byte, not an int32
//the next entry is aligned after this //the next entry is aligned after this
//but not the last! //but not the last!
@ -356,12 +358,12 @@ namespace Unity_Studio
#region read BuildSettings to get version for unity 2.x files #region read BuildSettings to get version for unity 2.x files
if (asset.Type2 == 141 && fileGen == 6) if (asset.Type2 == 141 && fileGen == 6)
{ {
long nextAsset = a_Stream.Position; long nextAsset = assetsFileReader.Position;
BuildSettings BSettings = new BuildSettings(asset); BuildSettings BSettings = new BuildSettings(asset);
m_Version = BSettings.m_Version; m_Version = BSettings.m_Version;
a_Stream.Position = nextAsset; assetsFileReader.Position = nextAsset;
} }
#endregion #endregion
} }
@ -380,22 +382,22 @@ namespace Unity_Studio
if (fileGen >= 14) if (fileGen >= 14)
{ {
//this looks like a list of assets that need to be preloaded in memory before anytihng else //this looks like a list of assets that need to be preloaded in memory before anytihng else
int someCount = a_Stream.ReadInt32(); int someCount = assetsFileReader.ReadInt32();
for (int i = 0; i < someCount; i++) for (int i = 0; i < someCount; i++)
{ {
int num1 = a_Stream.ReadInt32(); int num1 = assetsFileReader.ReadInt32();
a_Stream.AlignStream(4); assetsFileReader.AlignStream(4);
long m_PathID = a_Stream.ReadInt64(); long m_PathID = assetsFileReader.ReadInt64();
} }
} }
int sharedFileCount = a_Stream.ReadInt32(); int sharedFileCount = assetsFileReader.ReadInt32();
for (int i = 0; i < sharedFileCount; i++) for (int i = 0; i < sharedFileCount; i++)
{ {
var shared = new UnityShared(); var shared = new UnityShared();
shared.aName = a_Stream.ReadStringToNull(); shared.aName = assetsFileReader.ReadStringToNull();
a_Stream.Position += 20; assetsFileReader.Position += 20;
var sharedFilePath = a_Stream.ReadStringToNull(); //relative path var sharedFilePath = assetsFileReader.ReadStringToNull(); //relative path
shared.fileName = Path.GetFileName(sharedFilePath); shared.fileName = Path.GetFileName(sharedFilePath);
sharedAssetsList.Add(shared); sharedAssetsList.Add(shared);
} }
@ -408,14 +410,14 @@ namespace Unity_Studio
private void readBase(List<ClassMember> cb, int level) private void readBase(List<ClassMember> cb, int level)
{ {
string varType = a_Stream.ReadStringToNull(); string varType = assetsFileReader.ReadStringToNull();
string varName = a_Stream.ReadStringToNull(); string varName = assetsFileReader.ReadStringToNull();
int size = a_Stream.ReadInt32(); int size = assetsFileReader.ReadInt32();
int index = a_Stream.ReadInt32(); int index = assetsFileReader.ReadInt32();
int isArray = a_Stream.ReadInt32(); int isArray = assetsFileReader.ReadInt32();
int num0 = a_Stream.ReadInt32(); int num0 = assetsFileReader.ReadInt32();
int flag = a_Stream.ReadInt32(); int flag = assetsFileReader.ReadInt32();
int childrenCount = a_Stream.ReadInt32(); int childrenCount = assetsFileReader.ReadInt32();
cb.Add(new ClassMember cb.Add(new ClassMember
{ {
@ -430,12 +432,12 @@ namespace Unity_Studio
private void readBase5() private void readBase5()
{ {
int classID = a_Stream.ReadInt32(); int classID = assetsFileReader.ReadInt32();
if (fileGen > 15)//5.5.0 and up if (fileGen > 15)//5.5.0 and up
{ {
a_Stream.ReadByte(); assetsFileReader.ReadByte();
int type1; int type1;
if ((type1 = a_Stream.ReadInt16()) >= 0) if ((type1 = assetsFileReader.ReadInt16()) >= 0)
{ {
type1 = -1 - type1; type1 = -1 - type1;
} }
@ -446,35 +448,35 @@ namespace Unity_Studio
classIDs.Add(new[] { type1, classID }); classIDs.Add(new[] { type1, classID });
if (classID == 114) if (classID == 114)
{ {
a_Stream.Position += 16; assetsFileReader.Position += 16;
} }
classID = type1; classID = type1;
} }
else if (classID < 0) else if (classID < 0)
{ {
a_Stream.Position += 16; assetsFileReader.Position += 16;
} }
a_Stream.Position += 16; assetsFileReader.Position += 16;
if (baseDefinitions) if (baseDefinitions)
{ {
int varCount = a_Stream.ReadInt32(); int varCount = assetsFileReader.ReadInt32();
int stringSize = a_Stream.ReadInt32(); int stringSize = assetsFileReader.ReadInt32();
a_Stream.Position += varCount * 24; assetsFileReader.Position += varCount * 24;
var stringReader = new EndianBinaryReader(new MemoryStream(a_Stream.ReadBytes(stringSize))); var stringReader = new EndianBinaryReader(new MemoryStream(assetsFileReader.ReadBytes(stringSize)));
string className = ""; string className = "";
var classVar = new List<ClassMember>(); var classVar = new List<ClassMember>();
//build Class Structures //build Class Structures
a_Stream.Position -= varCount * 24 + stringSize; assetsFileReader.Position -= varCount * 24 + stringSize;
for (int i = 0; i < varCount; i++) for (int i = 0; i < varCount; i++)
{ {
ushort num0 = a_Stream.ReadUInt16(); ushort num0 = assetsFileReader.ReadUInt16();
byte level = a_Stream.ReadByte(); byte level = assetsFileReader.ReadByte();
bool isArray = a_Stream.ReadBoolean(); bool isArray = assetsFileReader.ReadBoolean();
ushort varTypeIndex = a_Stream.ReadUInt16(); ushort varTypeIndex = assetsFileReader.ReadUInt16();
ushort test = a_Stream.ReadUInt16(); ushort test = assetsFileReader.ReadUInt16();
string varTypeStr; string varTypeStr;
if (test == 0) //varType is an offset in the string block if (test == 0) //varType is an offset in the string block
{ {
@ -486,8 +488,8 @@ namespace Unity_Studio
varTypeStr = baseStrings.ContainsKey(varTypeIndex) ? baseStrings[varTypeIndex] : varTypeIndex.ToString(); varTypeStr = baseStrings.ContainsKey(varTypeIndex) ? baseStrings[varTypeIndex] : varTypeIndex.ToString();
} }
ushort varNameIndex = a_Stream.ReadUInt16(); ushort varNameIndex = assetsFileReader.ReadUInt16();
test = a_Stream.ReadUInt16(); test = assetsFileReader.ReadUInt16();
string varNameStr; string varNameStr;
if (test == 0) if (test == 0)
{ {
@ -499,9 +501,9 @@ namespace Unity_Studio
varNameStr = baseStrings.ContainsKey(varNameIndex) ? baseStrings[varNameIndex] : varNameIndex.ToString(); varNameStr = baseStrings.ContainsKey(varNameIndex) ? baseStrings[varNameIndex] : varNameIndex.ToString();
} }
int size = a_Stream.ReadInt32(); int size = assetsFileReader.ReadInt32();
int index = a_Stream.ReadInt32(); int index = assetsFileReader.ReadInt32();
int flag = a_Stream.ReadInt32(); int flag = assetsFileReader.ReadInt32();
if (index == 0) { className = varTypeStr + " " + varNameStr; } if (index == 0) { className = varTypeStr + " " + varNameStr; }
else else
@ -517,7 +519,7 @@ namespace Unity_Studio
} }
} }
stringReader.Dispose(); stringReader.Dispose();
a_Stream.Position += stringSize; assetsFileReader.Position += stringSize;
var aClass = new ClassStruct { ID = classID, Text = className, members = classVar }; var aClass = new ClassStruct { ID = classID, Text = className, members = classVar };
aClass.SubItems.Add(classID.ToString()); aClass.SubItems.Add(classID.ToString());

View File

@ -18,148 +18,113 @@ namespace Unity_Studio
public MemoryStream memStream; public MemoryStream memStream;
} }
public BundleFile(string fileName)
public BundleFile(EndianBinaryReader bundleReader)
{ {
if (Path.GetExtension(fileName) == ".lz4") var signature = bundleReader.ReadStringToNull();
{
byte[] filebuffer;
using (BinaryReader lz4Stream = new BinaryReader(File.OpenRead(fileName)))
{
int version = lz4Stream.ReadInt32();
int uncompressedSize = lz4Stream.ReadInt32();
int compressedSize = lz4Stream.ReadInt32();
int something = lz4Stream.ReadInt32(); //1
var lz4buffer = lz4Stream.ReadBytes(compressedSize);
using (var inputStream = new MemoryStream(lz4buffer))
{
var decoder = new Lz4DecoderStream(inputStream);
filebuffer = new byte[uncompressedSize];
decoder.Read(filebuffer, 0, uncompressedSize);
decoder.Dispose();
}
}
using (var b_Stream = new EndianBinaryReader(new MemoryStream(filebuffer)))
{
readBundle(b_Stream);
}
}
else
{
using (var b_Stream = new EndianBinaryReader(File.OpenRead(fileName)))
{
readBundle(b_Stream);
}
}
}
private void readBundle(EndianBinaryReader b_Stream)
{
var signature = b_Stream.ReadStringToNull();
switch (signature) switch (signature)
{ {
case "UnityWeb": case "UnityWeb":
case "UnityRaw": case "UnityRaw":
case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA": case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA":
{ {
format = b_Stream.ReadInt32(); format = bundleReader.ReadInt32();
versionPlayer = b_Stream.ReadStringToNull(); versionPlayer = bundleReader.ReadStringToNull();
versionEngine = b_Stream.ReadStringToNull(); versionEngine = bundleReader.ReadStringToNull();
if (format < 6) if (format < 6)
{ {
int bundleSize = b_Stream.ReadInt32(); int bundleSize = bundleReader.ReadInt32();
} }
else if (format == 6) else if (format == 6)
{ {
ReadFormat6(b_Stream, true); ReadFormat6(bundleReader, true);
return; return;
} }
short dummy2 = b_Stream.ReadInt16(); short dummy2 = bundleReader.ReadInt16();
int offset = b_Stream.ReadInt16(); int offset = bundleReader.ReadInt16();
int dummy3 = b_Stream.ReadInt32(); int dummy3 = bundleReader.ReadInt32();
int lzmaChunks = b_Stream.ReadInt32(); int lzmaChunks = bundleReader.ReadInt32();
int lzmaSize = 0; int lzmaSize = 0;
long streamSize = 0; long streamSize = 0;
for (int i = 0; i < lzmaChunks; i++) for (int i = 0; i < lzmaChunks; i++)
{ {
lzmaSize = b_Stream.ReadInt32(); lzmaSize = bundleReader.ReadInt32();
streamSize = b_Stream.ReadInt32(); streamSize = bundleReader.ReadInt32();
} }
b_Stream.Position = offset; bundleReader.Position = offset;
switch (signature) switch (signature)
{ {
case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA": //.bytes case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA": //.bytes
case "UnityWeb": case "UnityWeb":
{ {
var lzmaBuffer = b_Stream.ReadBytes(lzmaSize); var lzmaBuffer = bundleReader.ReadBytes(lzmaSize);
using (var lzmaStream = new EndianBinaryReader(SevenZipHelper.StreamDecompress(new MemoryStream(lzmaBuffer)))) using (var lzmaStream = new EndianBinaryReader(SevenZipHelper.StreamDecompress(new MemoryStream(lzmaBuffer))))
{ {
getFiles(lzmaStream, 0); GetAssetsFiles(lzmaStream, 0);
} }
break; break;
} }
case "UnityRaw": case "UnityRaw":
{ {
getFiles(b_Stream, offset); GetAssetsFiles(bundleReader, offset);
break; break;
} }
} }
break; break;
} }
case "UnityFS": case "UnityFS":
format = b_Stream.ReadInt32(); format = bundleReader.ReadInt32();
versionPlayer = b_Stream.ReadStringToNull(); versionPlayer = bundleReader.ReadStringToNull();
versionEngine = b_Stream.ReadStringToNull(); versionEngine = bundleReader.ReadStringToNull();
if (format == 6) if (format == 6)
{ {
ReadFormat6(b_Stream); ReadFormat6(bundleReader);
} }
break; break;
} }
} }
private void getFiles(EndianBinaryReader f_Stream, int offset) private void GetAssetsFiles(EndianBinaryReader reader, int offset)
{ {
int fileCount = f_Stream.ReadInt32(); int fileCount = reader.ReadInt32();
for (int i = 0; i < fileCount; i++) for (int i = 0; i < fileCount; i++)
{ {
var memFile = new MemoryAssetsFile(); var memFile = new MemoryAssetsFile();
memFile.fileName = f_Stream.ReadStringToNull(); memFile.fileName = reader.ReadStringToNull();
int fileOffset = f_Stream.ReadInt32(); int fileOffset = reader.ReadInt32();
fileOffset += offset; fileOffset += offset;
int fileSize = f_Stream.ReadInt32(); int fileSize = reader.ReadInt32();
long nextFile = f_Stream.Position; long nextFile = reader.Position;
f_Stream.Position = fileOffset; reader.Position = fileOffset;
var buffer = f_Stream.ReadBytes(fileSize); var buffer = reader.ReadBytes(fileSize);
memFile.memStream = new MemoryStream(buffer); memFile.memStream = new MemoryStream(buffer);
MemoryAssetsFileList.Add(memFile); MemoryAssetsFileList.Add(memFile);
f_Stream.Position = nextFile; reader.Position = nextFile;
} }
} }
private void ReadFormat6(EndianBinaryReader b_Stream, bool padding = false) private void ReadFormat6(EndianBinaryReader bundleReader, bool padding = false)
{ {
var bundleSize = b_Stream.ReadInt64(); var bundleSize = bundleReader.ReadInt64();
int compressedSize = b_Stream.ReadInt32(); int compressedSize = bundleReader.ReadInt32();
int uncompressedSize = b_Stream.ReadInt32(); int uncompressedSize = bundleReader.ReadInt32();
int flag = b_Stream.ReadInt32(); int flag = bundleReader.ReadInt32();
if (padding) if (padding)
b_Stream.ReadByte(); bundleReader.ReadByte();
byte[] blocksInfoBytes; byte[] blocksInfoBytes;
if ((flag & 0x80) != 0)//at end of file if ((flag & 0x80) != 0)//at end of file
{ {
var position = b_Stream.Position; var position = bundleReader.Position;
b_Stream.Position = b_Stream.BaseStream.Length - compressedSize; bundleReader.Position = bundleReader.BaseStream.Length - compressedSize;
blocksInfoBytes = b_Stream.ReadBytes(compressedSize); blocksInfoBytes = bundleReader.ReadBytes(compressedSize);
b_Stream.Position = position; bundleReader.Position = position;
} }
else else
{ {
blocksInfoBytes = b_Stream.ReadBytes(compressedSize); blocksInfoBytes = bundleReader.ReadBytes(compressedSize);
} }
MemoryStream blocksInfoStream; MemoryStream blocksInfoStream;
switch (flag & 0x3F) switch (flag & 0x3F)
@ -199,7 +164,7 @@ namespace Unity_Studio
uncompressedSize = blocksInfo.ReadInt32(); uncompressedSize = blocksInfo.ReadInt32();
compressedSize = blocksInfo.ReadInt32(); compressedSize = blocksInfo.ReadInt32();
flag = blocksInfo.ReadInt16(); flag = blocksInfo.ReadInt16();
var compressedBytes = b_Stream.ReadBytes(compressedSize); var compressedBytes = bundleReader.ReadBytes(compressedSize);
switch (flag & 0x3F) switch (flag & 0x3F)
{ {
default://None default://None
@ -235,7 +200,7 @@ namespace Unity_Studio
//case 4:LZHAM? //case 4:LZHAM?
} }
} }
using (var assetsData = new EndianBinaryReader(assetsDataStream)) using (var assetsDataReader = new EndianBinaryReader(assetsDataStream))
{ {
var entryinfo_count = blocksInfo.ReadInt32(); var entryinfo_count = blocksInfo.ReadInt32();
for (int i = 0; i < entryinfo_count; i++) for (int i = 0; i < entryinfo_count; i++)
@ -243,10 +208,10 @@ namespace Unity_Studio
var memFile = new MemoryAssetsFile(); var memFile = new MemoryAssetsFile();
var entryinfo_offset = blocksInfo.ReadInt64(); var entryinfo_offset = blocksInfo.ReadInt64();
var entryinfo_size = blocksInfo.ReadInt64(); var entryinfo_size = blocksInfo.ReadInt64();
var unknown = blocksInfo.ReadInt32(); flag = blocksInfo.ReadInt32();
memFile.fileName = blocksInfo.ReadStringToNull(); memFile.fileName = blocksInfo.ReadStringToNull();
assetsData.Position = entryinfo_offset; assetsDataReader.Position = entryinfo_offset;
var buffer = assetsData.ReadBytes((int)entryinfo_size); var buffer = assetsDataReader.ReadBytes((int)entryinfo_size);
memFile.memStream = new MemoryStream(buffer); memFile.memStream = new MemoryStream(buffer);
MemoryAssetsFileList.Add(memFile); MemoryAssetsFileList.Add(memFile);
} }

View File

@ -41,7 +41,7 @@ namespace Unity_Studio
{ {
public static string ViewStruct(this AssetPreloadData asset) public static string ViewStruct(this AssetPreloadData asset)
{ {
var a_Stream = asset.sourceFile.a_Stream; var a_Stream = asset.sourceFile.assetsFileReader;
a_Stream.Position = asset.Offset; a_Stream.Position = asset.Offset;
if (asset.sourceFile.ClassStructures.TryGetValue(asset.Type1, out var classStructure)) if (asset.sourceFile.ClassStructures.TryGetValue(asset.Type1, out var classStructure))
{ {

View File

@ -3,13 +3,15 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using static Unity_Studio.UnityStudio;
namespace Unity_Studio namespace Unity_Studio
{ {
public class PPtr public class PPtr
{ {
//m_FileID 0 means current file //m_FileID 0 means current file
public int m_FileID = -1; public int m_FileID;
//m_PathID acts more like a hash in some games //m_PathID acts more like a hash in some games
public long m_PathID; public long m_PathID;
} }
@ -18,14 +20,28 @@ namespace Unity_Studio
{ {
public static PPtr ReadPPtr(this AssetsFile sourceFile) public static PPtr ReadPPtr(this AssetsFile sourceFile)
{ {
PPtr result = new PPtr(); var result = new PPtr();
var a_Stream = sourceFile.a_Stream; var reader = sourceFile.assetsFileReader;
int FileID = a_Stream.ReadInt32(); int FileID = reader.ReadInt32();
if (FileID >= 0 && FileID < sourceFile.sharedAssetsList.Count) if (FileID >= 0 && FileID < sourceFile.sharedAssetsList.Count)
{ result.m_FileID = sourceFile.sharedAssetsList[FileID].Index; } {
var sharedFile = sourceFile.sharedAssetsList[FileID];
var index = sharedFile.Index;
if (index == -2)
{
var name = sharedFile.fileName.ToUpper();
if (!sharedFileIndex.TryGetValue(name, out index))
{
index = assetsfileList.FindIndex(aFile => aFile.upperFileName == name);
sharedFileIndex.Add(name, index);
}
sharedFile.Index = index;
}
result.m_FileID = index;
}
result.m_PathID = sourceFile.fileGen < 14 ? a_Stream.ReadInt32() : a_Stream.ReadInt64(); result.m_PathID = sourceFile.fileGen < 14 ? reader.ReadInt32() : reader.ReadInt64();
return result; return result;
} }

View File

@ -20,7 +20,7 @@ namespace Unity_Studio
public static List<AssetsFile> assetsfileList = new List<AssetsFile>(); //loaded files public static List<AssetsFile> assetsfileList = new List<AssetsFile>(); //loaded files
public static HashSet<string> assetsfileListHash = new HashSet<string>(); //to improve the loading speed public static HashSet<string> assetsfileListHash = new HashSet<string>(); //to improve the loading speed
public static Dictionary<string, int> sharedFileIndex = new Dictionary<string, int>(); //to improve the loading speed public static Dictionary<string, int> sharedFileIndex = new Dictionary<string, int>(); //to improve the loading speed
public static Dictionary<string, EndianBinaryReader> assetsfileandstream = new Dictionary<string, EndianBinaryReader>(); //use for read res files public static Dictionary<string, EndianBinaryReader> resourceFileReaders = new Dictionary<string, EndianBinaryReader>(); //use for read res files
public static List<AssetPreloadData> exportableAssets = new List<AssetPreloadData>(); //used to hold all assets while the ListView is filtered public static List<AssetPreloadData> exportableAssets = new List<AssetPreloadData>(); //used to hold all assets while the ListView is filtered
private static HashSet<string> exportableAssetsHash = new HashSet<string>(); //avoid the same name asset private static HashSet<string> exportableAssetsHash = new HashSet<string>(); //avoid the same name asset
public static List<AssetPreloadData> visibleAssets = new List<AssetPreloadData>(); //used to build the ListView from all or filtered assets public static List<AssetPreloadData> visibleAssets = new List<AssetPreloadData>(); //used to build the ListView from all or filtered assets
@ -40,108 +40,114 @@ namespace Unity_Studio
public static Action<string> StatusStripUpdate; public static Action<string> StatusStripUpdate;
public static Action<int> ProgressBarMaximumAdd; public static Action<int> ProgressBarMaximumAdd;
public static void LoadAssetsFile(string fileName) public static void LoadFile(string fullName)
{ {
if (!assetsfileListHash.Contains(fileName)) if (CheckBundleFile(fullName, out var reader))
{ {
AssetsFile assetsFile = new AssetsFile(fileName, new EndianBinaryReader(File.OpenRead(fileName))); LoadBundleFile(fullName, reader);
assetsfileList.Add(assetsFile); }
assetsfileListHash.Add(fileName); else
{
LoadAssetsFile(fullName, reader);
}
}
#region for 2.6.x find mainData and get string version private static void LoadAssetsFile(string fullName, EndianBinaryReader reader)
if (assetsFile.fileGen == 6 && Path.GetFileName(fileName) != "mainData") {
var fileName = Path.GetFileName(fullName);
StatusStripUpdate("Loading " + fileName);
if (!assetsfileListHash.Contains(fileName.ToUpper()))
{
var assetsFile = new AssetsFile(fullName, reader);
if (assetsFile.valid)
{ {
AssetsFile mainDataFile = assetsfileList.Find(aFile => aFile.filePath == Path.GetDirectoryName(fileName) + "\\mainData"); assetsfileList.Add(assetsFile);
if (mainDataFile != null) assetsfileListHash.Add(assetsFile.upperFileName);
{
assetsFile.m_Version = mainDataFile.m_Version;
assetsFile.version = mainDataFile.version;
assetsFile.buildType = mainDataFile.buildType;
}
else if (File.Exists(Path.GetDirectoryName(fileName) + "\\mainData"))
{
mainDataFile = new AssetsFile(Path.GetDirectoryName(fileName) + "\\mainData", new EndianBinaryReader(File.OpenRead(Path.GetDirectoryName(fileName) + "\\mainData")));
assetsFile.m_Version = mainDataFile.m_Version; #region for 2.6.x find mainData and get string version
assetsFile.version = mainDataFile.version; if (assetsFile.fileGen == 6 && fileName != "mainData")
assetsFile.buildType = mainDataFile.buildType; {
var mainDataFile = assetsfileList.Find(aFile => aFile.fileName == "mainData");
if (mainDataFile != null)
{
assetsFile.m_Version = mainDataFile.m_Version;
assetsFile.version = mainDataFile.version;
assetsFile.buildType = mainDataFile.buildType;
}
else if (File.Exists(Path.GetDirectoryName(fullName) + "\\mainData"))
{
mainDataFile = new AssetsFile(Path.GetDirectoryName(fullName) + "\\mainData", new EndianBinaryReader(File.OpenRead(Path.GetDirectoryName(fullName) + "\\mainData")));
assetsFile.m_Version = mainDataFile.m_Version;
assetsFile.version = mainDataFile.version;
assetsFile.buildType = mainDataFile.buildType;
}
} }
#endregion
int value = 0;
foreach (var sharedFile in assetsFile.sharedAssetsList)
{
var sharedFilePath = Path.GetDirectoryName(fullName) + "\\" + sharedFile.fileName;
var sharedFileName = sharedFile.fileName;
if (!unityFilesHash.Contains(sharedFileName.ToUpper()))
{
if (!File.Exists(sharedFilePath))
{
var findFiles = Directory.GetFiles(Path.GetDirectoryName(fullName), sharedFileName, SearchOption.AllDirectories);
if (findFiles.Length > 0)
{
sharedFilePath = findFiles[0];
}
}
if (File.Exists(sharedFilePath))
{
unityFiles.Add(sharedFilePath);
unityFilesHash.Add(sharedFileName.ToUpper());
value++;
}
}
}
if (value > 0)
ProgressBarMaximumAdd(value);
} }
#endregion }
}
int value = 0; private static void LoadBundleFile(string fullName, EndianBinaryReader reader)
foreach (var sharedFile in assetsFile.sharedAssetsList) {
var fileName = Path.GetFileName(fullName);
StatusStripUpdate("Decompressing " + fileName);
var bundleFile = new BundleFile(reader);
foreach (var memFile in bundleFile.MemoryAssetsFileList)
{
if (!assetsfileListHash.Contains(memFile.fileName.ToUpper()))
{ {
string sharedFilePath = Path.GetDirectoryName(fileName) + "\\" + sharedFile.fileName; StatusStripUpdate("Loading " + memFile.fileName);
string sharedFileName = sharedFile.fileName; var assetsFile = new AssetsFile(Path.GetDirectoryName(fullName) + "\\" + memFile.fileName, new EndianBinaryReader(memFile.memStream));
if (!unityFilesHash.Contains(sharedFileName)) if (assetsFile.valid)
{ {
if (!File.Exists(sharedFilePath)) assetsFile.bundlePath = fullName;
if (assetsFile.fileGen == 6) //2.6.x and earlier don't have a string version before the preload table
{ {
var findFiles = Directory.GetFiles(Path.GetDirectoryName(fileName), sharedFileName, SearchOption.AllDirectories); //make use of the bundle file version
if (findFiles.Length > 0) { sharedFilePath = findFiles[0]; } assetsFile.m_Version = bundleFile.versionEngine;
assetsFile.version = Array.ConvertAll((from Match m in Regex.Matches(assetsFile.m_Version, @"[0-9]") select m.Value).ToArray(), int.Parse);
assetsFile.buildType = bundleFile.versionEngine.Split(AssetsFile.buildTypeSplit, StringSplitOptions.RemoveEmptyEntries);
} }
if (File.Exists(sharedFilePath)) assetsfileList.Add(assetsFile);
{ assetsfileListHash.Add(assetsFile.upperFileName);
//this would get screwed if the file somehow fails to load
sharedFile.Index = unityFiles.Count;
unityFiles.Add(sharedFilePath);
unityFilesHash.Add(sharedFileName);
value++;
}
} }
else else
{ {
if (!sharedFileIndex.TryGetValue(sharedFilePath, out var index)) resourceFileReaders.Add(assetsFile.upperFileName, assetsFile.assetsFileReader);
{
index = unityFiles.IndexOf(sharedFilePath);
sharedFileIndex.Add(sharedFilePath, index);
}
sharedFile.Index = index;
} }
} }
if (value > 0)
ProgressBarMaximumAdd(value);
}
}
public static void LoadBundleFile(string bundleFileName)
{
StatusStripUpdate("Decompressing " + Path.GetFileName(bundleFileName) + "...");
BundleFile b_File = new BundleFile(bundleFileName);
foreach (var memFile in b_File.MemoryAssetsFileList) //filter unity files
{
StatusStripUpdate("Loading " + memFile.fileName);
//create dummy path to be used for asset extraction
memFile.fileName = Path.GetDirectoryName(bundleFileName) + "\\" + memFile.fileName;
AssetsFile assetsFile = new AssetsFile(memFile.fileName, new EndianBinaryReader(memFile.memStream));
if (assetsFile.valid)
{
assetsFile.bundlePath = bundleFileName;
if (assetsFile.fileGen == 6 && Path.GetFileName(bundleFileName) != "mainData") //2.6.x and earlier don't have a string version before the preload table
{
//make use of the bundle file version
assetsFile.m_Version = b_File.versionEngine;
assetsFile.version = Array.ConvertAll((from Match m in Regex.Matches(assetsFile.m_Version, @"[0-9]") select m.Value).ToArray(), int.Parse);
assetsFile.buildType = b_File.versionEngine.Split(AssetsFile.buildTypeSplit, StringSplitOptions.RemoveEmptyEntries);
}
assetsfileList.Add(assetsFile);
}
assetsfileandstream[assetsFile.fileName] = assetsFile.a_Stream;
}
}
public static void BuildSharedIndex()
{
foreach (var assetsFile in assetsfileList)
{
foreach (var sharedFile in assetsFile.sharedAssetsList)
{
sharedFile.Index = assetsfileList.FindIndex(aFile => aFile.fileName.ToUpper() == sharedFile.fileName.ToUpper());
}
} }
reader.Dispose();
} }
public static void MergeSplitAssets(string dirPath) public static void MergeSplitAssets(string dirPath)
@ -168,16 +174,16 @@ namespace Unity_Studio
} }
} }
public static int extractBundleFile(string bundleFileName) public static int ExtractBundleFile(string bundleFileName)
{ {
int extractedCount = 0; int extractedCount = 0;
if (CheckBundleFile(bundleFileName)) if (CheckBundleFile(bundleFileName, out var reader))
{ {
StatusStripUpdate($"Decompressing {Path.GetFileName(bundleFileName)} ..."); StatusStripUpdate($"Decompressing {Path.GetFileName(bundleFileName)} ...");
var extractPath = bundleFileName + "_unpacked\\"; var extractPath = bundleFileName + "_unpacked\\";
Directory.CreateDirectory(extractPath); Directory.CreateDirectory(extractPath);
var b_File = new BundleFile(bundleFileName); var bundleFile = new BundleFile(reader);
foreach (var memFile in b_File.MemoryAssetsFileList) foreach (var memFile in bundleFile.MemoryAssetsFileList)
{ {
var filePath = extractPath + memFile.fileName.Replace('/', '\\'); var filePath = extractPath + memFile.fileName.Replace('/', '\\');
if (!Directory.Exists(Path.GetDirectoryName(filePath))) if (!Directory.Exists(Path.GetDirectoryName(filePath)))
@ -196,6 +202,7 @@ namespace Unity_Studio
} }
} }
} }
reader.Dispose();
return extractedCount; return extractedCount;
} }
@ -1853,8 +1860,8 @@ namespace Unity_Studio
var exportFullName = exportPath + asset.Text + asset.extension; var exportFullName = exportPath + asset.Text + asset.extension;
if (ExportFileExists(exportFullName)) if (ExportFileExists(exportFullName))
return false; return false;
asset.sourceFile.a_Stream.Position = asset.Offset; asset.sourceFile.assetsFileReader.Position = asset.Offset;
var bytes = asset.sourceFile.a_Stream.ReadBytes(asset.Size); var bytes = asset.sourceFile.assetsFileReader.ReadBytes(asset.Size);
File.WriteAllBytes(exportFullName, bytes); File.WriteAllBytes(exportFullName, bytes);
return true; return true;
} }
@ -1875,21 +1882,20 @@ namespace Unity_Studio
return Path.GetInvalidFileNameChars().Aggregate(str, (current, c) => current.Replace(c, '_')); return Path.GetInvalidFileNameChars().Aggregate(str, (current, c) => current.Replace(c, '_'));
} }
public static bool CheckBundleFile(string fileName) private static bool CheckBundleFile(string fileName, out EndianBinaryReader reader)
{ {
using (var stream = new EndianBinaryReader(File.OpenRead(fileName))) reader = new EndianBinaryReader(File.OpenRead(fileName));
var signature = reader.ReadStringToNull();
reader.Position = 0;
switch (signature)
{ {
var signature = stream.ReadStringToNull(); case "UnityWeb":
switch (signature) case "UnityRaw":
{ case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA":
case "UnityWeb": case "UnityFS":
case "UnityRaw": return true;
case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA": default:
case "UnityFS": return false;
return true;
default:
return false;
}
} }
} }
@ -1978,7 +1984,7 @@ namespace Unity_Studio
{ {
matr.Translate(sprite.m_Rect.Width * sprite.m_Pivot.X, sprite.m_Rect.Height * sprite.m_Pivot.Y); matr.Translate(sprite.m_Rect.Width * sprite.m_Pivot.X, sprite.m_Rect.Height * sprite.m_Pivot.Y);
matr.Scale(sprite.m_PixelsToUnits, sprite.m_PixelsToUnits); matr.Scale(sprite.m_PixelsToUnits, sprite.m_PixelsToUnits);
path.Flatten(matr); path.Transform(matr);
var bitmap = new Bitmap((int)textureRect.Width, (int)textureRect.Height); var bitmap = new Bitmap((int)textureRect.Width, (int)textureRect.Height);
using (var graphic = Graphics.FromImage(bitmap)) using (var graphic = Graphics.FromImage(bitmap))
{ {

View File

@ -813,7 +813,7 @@
// openFileDialog1 // openFileDialog1
// //
this.openFileDialog1.AddExtension = false; this.openFileDialog1.AddExtension = false;
this.openFileDialog1.Filter = resources.GetString("openFileDialog1.Filter"); this.openFileDialog1.Filter = "Unity files|*.*";
this.openFileDialog1.Multiselect = true; this.openFileDialog1.Multiselect = true;
this.openFileDialog1.RestoreDirectory = true; this.openFileDialog1.RestoreDirectory = true;
// //

View File

@ -84,58 +84,24 @@ namespace Unity_Studio
resetForm(); resetForm();
ThreadPool.QueueUserWorkItem(state => ThreadPool.QueueUserWorkItem(state =>
{ {
var bundle = false; mainPath = Path.GetDirectoryName(openFileDialog1.FileNames[0]);
if (openFileDialog1.FilterIndex == 1 || openFileDialog1.FilterIndex == 3) MergeSplitAssets(mainPath);
var readFile = ProcessingSplitFiles(openFileDialog1.FileNames.ToList());
foreach (var i in readFile)
{ {
if (CheckBundleFile(openFileDialog1.FileNames[0])) unityFiles.Add(i);
{ unityFilesHash.Add(Path.GetFileName(i).ToUpper());
if (openFileDialog1.FileNames.Length > 1)
{
MessageBox.Show($"{Path.GetFileName(openFileDialog1.FileNames[0])} is bundle file, please select bundle file type to load this file");
return;
}
bundle = true;
}
} }
else SetProgressBarValue(0);
SetProgressBarMaximum(unityFiles.Count);
//use a for loop because list size can change
for (int f = 0; f < unityFiles.Count; f++)
{ {
bundle = true; LoadFile(unityFiles[f]);
} ProgressBarPerformStep();
if (!bundle)
{
mainPath = Path.GetDirectoryName(openFileDialog1.FileNames[0]);
MergeSplitAssets(mainPath);
var readFile = ProcessingSplitFiles(openFileDialog1.FileNames.ToList());
foreach (var i in readFile)
{
unityFiles.Add(i);
unityFilesHash.Add(Path.GetFileName(i));
}
SetProgressBarValue(0);
SetProgressBarMaximum(unityFiles.Count);
//use a for loop because list size can change
for (int f = 0; f < unityFiles.Count; f++)
{
var fileName = unityFiles[f];
StatusStripUpdate("Loading " + Path.GetFileName(fileName));
LoadAssetsFile(fileName);
ProgressBarPerformStep();
}
}
else
{
SetProgressBarValue(0);
SetProgressBarMaximum(unityFiles.Count);
foreach (var filename in openFileDialog1.FileNames)
{
LoadBundleFile(filename);
ProgressBarPerformStep();
}
BuildSharedIndex();
} }
unityFilesHash.Clear(); unityFilesHash.Clear();
assetsfileListHash.Clear(); assetsfileListHash.Clear();
sharedFileIndex.Clear();
BuildAssetStrucutres(); BuildAssetStrucutres();
}); });
} }
@ -163,14 +129,11 @@ namespace Unity_Studio
//use a for loop because list size can change //use a for loop because list size can change
for (int f = 0; f < unityFiles.Count; f++) for (int f = 0; f < unityFiles.Count; f++)
{ {
var fileName = unityFiles[f]; LoadFile(unityFiles[f]);
StatusStripUpdate("Loading " + Path.GetFileName(fileName));
LoadAssetsFile(fileName);
ProgressBarPerformStep(); ProgressBarPerformStep();
} }
unityFilesHash.Clear(); unityFilesHash.Clear();
assetsfileListHash.Clear(); assetsfileListHash.Clear();
sharedFileIndex.Clear();
BuildAssetStrucutres(); BuildAssetStrucutres();
}); });
} }
@ -193,7 +156,7 @@ namespace Unity_Studio
{ {
foreach (var fileName in openBundleDialog.FileNames) foreach (var fileName in openBundleDialog.FileNames)
{ {
extractedCount += extractBundleFile(fileName); extractedCount += ExtractBundleFile(fileName);
ProgressBarPerformStep(); ProgressBarPerformStep();
} }
StatusStripUpdate($"Finished extracting {extractedCount} files."); StatusStripUpdate($"Finished extracting {extractedCount} files.");
@ -215,7 +178,7 @@ namespace Unity_Studio
{ {
foreach (var fileName in bundleFiles) foreach (var fileName in bundleFiles)
{ {
extractedCount += extractBundleFile(fileName); extractedCount += ExtractBundleFile(fileName);
ProgressBarPerformStep(); ProgressBarPerformStep();
} }
StatusStripUpdate($"Finished extracting {extractedCount} files."); StatusStripUpdate($"Finished extracting {extractedCount} files.");
@ -1843,7 +1806,9 @@ namespace Unity_Studio
assetsfileList.Clear(); assetsfileList.Clear();
exportableAssets.Clear(); exportableAssets.Clear();
visibleAssets.Clear(); visibleAssets.Clear();
assetsfileandstream.Clear(); resourceFileReaders.Clear();
sharedFileIndex.Clear();
productName = "";
sceneTreeView.Nodes.Clear(); sceneTreeView.Nodes.Clear();

View File

@ -150,9 +150,6 @@ The quick brown fox jumps over the lazy dog. 1234567890</value>
<metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>636, 17</value> <value>636, 17</value>
</metadata> </metadata>
<data name="openFileDialog1.Filter" xml:space="preserve">
<value>Unity asset files|*.*|Unity bundle files|*.*|Unity asset files|level*; globalgamemanagers; mainData; CustomAssetBundle-*; CAB-*; BuildPlayer-*; *.assets; *.sharedAssets|Unity bundle files|*.unity3d; *.unity3d.lz4; *.assetbundle; *.bundle; *.bytes</value>
</data>
<metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>784, 17</value> <value>784, 17</value>
</metadata> </metadata>