VaDiM 2023-11-21 01:35:25 +03:00
parent b27482e22b
commit efd06648ad
5 changed files with 99 additions and 20 deletions

View File

@ -532,6 +532,9 @@ namespace AssetStudio
case ClassIDType.PlayerSettings: case ClassIDType.PlayerSettings:
obj = new PlayerSettings(objectReader); obj = new PlayerSettings(objectReader);
break; break;
case ClassIDType.PreloadData:
obj = new PreloadData(objectReader);
break;
case ClassIDType.RectTransform: case ClassIDType.RectTransform:
obj = new RectTransform(objectReader); obj = new RectTransform(objectReader);
break; break;

View File

@ -1,7 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AssetStudio namespace AssetStudio
{ {
@ -23,22 +20,47 @@ namespace AssetStudio
{ {
public PPtr<Object>[] m_PreloadTable; public PPtr<Object>[] m_PreloadTable;
public KeyValuePair<string, AssetInfo>[] m_Container; public KeyValuePair<string, AssetInfo>[] m_Container;
public string m_AssetBundleName;
public string[] m_Dependencies;
public bool m_IsStreamedSceneAssetBundle;
public AssetBundle(ObjectReader reader) : base(reader) public AssetBundle(ObjectReader reader) : base(reader)
{ {
var m_PreloadTableSize = reader.ReadInt32(); var m_PreloadTableSize = reader.ReadInt32();
m_PreloadTable = new PPtr<Object>[m_PreloadTableSize]; m_PreloadTable = new PPtr<Object>[m_PreloadTableSize];
for (int i = 0; i < m_PreloadTableSize; i++) for (var i = 0; i < m_PreloadTableSize; i++)
{ {
m_PreloadTable[i] = new PPtr<Object>(reader); m_PreloadTable[i] = new PPtr<Object>(reader);
} }
var m_ContainerSize = reader.ReadInt32(); var m_ContainerSize = reader.ReadInt32();
m_Container = new KeyValuePair<string, AssetInfo>[m_ContainerSize]; m_Container = new KeyValuePair<string, AssetInfo>[m_ContainerSize];
for (int i = 0; i < m_ContainerSize; i++) for (var i = 0; i < m_ContainerSize; i++)
{ {
m_Container[i] = new KeyValuePair<string, AssetInfo>(reader.ReadAlignedString(), new AssetInfo(reader)); m_Container[i] = new KeyValuePair<string, AssetInfo>(reader.ReadAlignedString(), new AssetInfo(reader));
} }
var m_MainAsset = new AssetInfo(reader);
if (version[0] > 4 || (version[0] == 4 && version[1] >= 2)) //4.2 and up
{
var m_RuntimeCompatibility = reader.ReadUInt32();
}
if (version[0] >= 5) //5.0 and up
{
m_AssetBundleName = reader.ReadAlignedString();
var m_DependenciesSize = reader.ReadInt32();
m_Dependencies = new string[m_DependenciesSize];
for (var i = 0; i < m_DependenciesSize; i++)
{
m_Dependencies[i] = reader.ReadAlignedString();
}
m_IsStreamedSceneAssetBundle = reader.ReadBoolean();
}
} }
} }
} }

View File

@ -0,0 +1,35 @@
namespace AssetStudio
{
public sealed class PreloadData : NamedObject
{
public PPtr<Object>[] m_Assets;
public PreloadData(ObjectReader reader) : base(reader)
{
var m_PreloadTableSize = reader.ReadInt32();
m_Assets = new PPtr<Object>[m_PreloadTableSize];
for (var i = 0; i < m_PreloadTableSize; i++)
{
m_Assets[i] = new PPtr<Object>(reader);
}
/*
if (version[0] >= 5) //5.0 and up
{
var m_DependenciesSize = reader.ReadInt32();
var m_Dependencies = new string[m_DependenciesSize];
for (var i = 0; i < m_DependenciesSize; i++)
{
m_Dependencies[i] = reader.ReadAlignedString();
}
}
if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up
{
var m_ExplicitDataLayout = reader.ReadBoolean();
}
*/
}
}
}

View File

@ -62,6 +62,7 @@ namespace AssetStudioCLI
var i = 0; var i = 0;
foreach (var assetsFile in assetsManager.assetsFileList) foreach (var assetsFile in assetsManager.assetsFileList)
{ {
var preloadTable = Array.Empty<PPtr<AssetStudio.Object>>();
foreach (var asset in assetsFile.Objects) foreach (var asset in assetsFile.Objects)
{ {
var assetItem = new AssetItem(asset); var assetItem = new AssetItem(asset);
@ -70,22 +71,31 @@ namespace AssetStudioCLI
var isExportable = false; var isExportable = false;
switch (asset) switch (asset)
{ {
case PreloadData m_PreloadData:
preloadTable = m_PreloadData.m_Assets;
break;
case AssetBundle m_AssetBundle: case AssetBundle m_AssetBundle:
var isStreamedSceneAssetBundle = m_AssetBundle.m_IsStreamedSceneAssetBundle;
if (!isStreamedSceneAssetBundle)
{
preloadTable = m_AssetBundle.m_PreloadTable;
}
assetItem.Text = string.IsNullOrEmpty(m_AssetBundle.m_AssetBundleName) ? m_AssetBundle.m_Name : m_AssetBundle.m_AssetBundleName;
foreach (var m_Container in m_AssetBundle.m_Container) foreach (var m_Container in m_AssetBundle.m_Container)
{ {
var preloadIndex = m_Container.Value.preloadIndex; var preloadIndex = m_Container.Value.preloadIndex;
var preloadSize = m_Container.Value.preloadSize; var preloadSize = isStreamedSceneAssetBundle ? preloadTable.Length : m_Container.Value.preloadSize;
var preloadEnd = preloadIndex + preloadSize; var preloadEnd = preloadIndex + preloadSize;
for (int k = preloadIndex; k < preloadEnd; k++) for (var k = preloadIndex; k < preloadEnd; k++)
{ {
var pptr = m_AssetBundle.m_PreloadTable[k]; var pptr = preloadTable[k];
if (pptr.TryGet(out var obj)) if (pptr.TryGet(out var obj))
{ {
containers[obj] = m_Container.Key; containers[obj] = m_Container.Key;
} }
} }
} }
assetItem.Text = m_AssetBundle.m_Name;
break; break;
case ResourceManager m_ResourceManager: case ResourceManager m_ResourceManager:
foreach (var m_Container in m_ResourceManager.m_Container) foreach (var m_Container in m_ResourceManager.m_Container)
@ -110,7 +120,7 @@ namespace AssetStudioCLI
if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath)) if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath))
assetItem.FullSize = asset.byteSize + m_VideoClip.m_ExternalResources.m_Size; assetItem.FullSize = asset.byteSize + m_VideoClip.m_ExternalResources.m_Size;
assetItem.Text = m_VideoClip.m_Name; assetItem.Text = m_VideoClip.m_Name;
break; break;
case Shader m_Shader: case Shader m_Shader:
assetItem.Text = m_Shader.m_ParsedForm?.m_Name ?? m_Shader.m_Name; assetItem.Text = m_Shader.m_ParsedForm?.m_Name ?? m_Shader.m_Name;
break; break;
@ -152,9 +162,9 @@ namespace AssetStudioCLI
} }
foreach (var asset in fileAssetsList) foreach (var asset in fileAssetsList)
{ {
if (containers.ContainsKey(asset.Asset)) if (containers.TryGetValue(asset.Asset, out var container))
{ {
asset.Container = containers[asset.Asset]; asset.Container = container;
} }
} }
parsedAssetsList.AddRange(fileAssetsList); parsedAssetsList.AddRange(fileAssetsList);

View File

@ -162,6 +162,8 @@ namespace AssetStudioGUI
Progress.Reset(); Progress.Reset();
foreach (var assetsFile in assetsManager.assetsFileList) foreach (var assetsFile in assetsManager.assetsFileList)
{ {
var preloadTable = Array.Empty<PPtr<Object>>();
foreach (var asset in assetsFile.Objects) foreach (var asset in assetsFile.Objects)
{ {
var assetItem = new AssetItem(asset); var assetItem = new AssetItem(asset);
@ -170,6 +172,9 @@ namespace AssetStudioGUI
var exportable = false; var exportable = false;
switch (asset) switch (asset)
{ {
case PreloadData m_PreloadData:
preloadTable = m_PreloadData.m_Assets;
break;
case GameObject m_GameObject: case GameObject m_GameObject:
assetItem.Text = m_GameObject.m_Name; assetItem.Text = m_GameObject.m_Name;
break; break;
@ -187,7 +192,7 @@ namespace AssetStudioGUI
break; break;
case VideoClip m_VideoClip: case VideoClip m_VideoClip:
if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath)) if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath))
assetItem.FullSize = asset.byteSize + (long)m_VideoClip.m_ExternalResources.m_Size; assetItem.FullSize = asset.byteSize + m_VideoClip.m_ExternalResources.m_Size;
assetItem.Text = m_VideoClip.m_Name; assetItem.Text = m_VideoClip.m_Name;
exportable = true; exportable = true;
break; break;
@ -226,17 +231,23 @@ namespace AssetStudioGUI
productName = m_PlayerSettings.productName; productName = m_PlayerSettings.productName;
break; break;
case AssetBundle m_AssetBundle: case AssetBundle m_AssetBundle:
var isStreamedSceneAssetBundle = m_AssetBundle.m_IsStreamedSceneAssetBundle;
if (!isStreamedSceneAssetBundle)
{
preloadTable = m_AssetBundle.m_PreloadTable;
}
assetItem.Text = string.IsNullOrEmpty(m_AssetBundle.m_AssetBundleName) ? m_AssetBundle.m_Name : m_AssetBundle.m_AssetBundleName;
foreach (var m_Container in m_AssetBundle.m_Container) foreach (var m_Container in m_AssetBundle.m_Container)
{ {
var preloadIndex = m_Container.Value.preloadIndex; var preloadIndex = m_Container.Value.preloadIndex;
var preloadSize = m_Container.Value.preloadSize; var preloadSize = isStreamedSceneAssetBundle ? preloadTable.Length : m_Container.Value.preloadSize;
var preloadEnd = preloadIndex + preloadSize; var preloadEnd = preloadIndex + preloadSize;
for (int k = preloadIndex; k < preloadEnd; k++) for (var k = preloadIndex; k < preloadEnd; k++)
{ {
containers.Add((m_AssetBundle.m_PreloadTable[k], m_Container.Key)); containers.Add((preloadTable[k], m_Container.Key));
} }
} }
assetItem.Text = m_AssetBundle.m_Name;
break; break;
case ResourceManager m_ResourceManager: case ResourceManager m_ResourceManager:
foreach (var m_Container in m_ResourceManager.m_Container) foreach (var m_Container in m_ResourceManager.m_Container)
@ -349,7 +360,6 @@ namespace AssetStudioGUI
Progress.Report(++j, assetsFileCount); Progress.Report(++j, assetsFileCount);
} }
treeNodeDictionary.Clear(); treeNodeDictionary.Clear();
objectAssetItemDic.Clear(); objectAssetItemDic.Clear();
return (productName, treeNodeCollection); return (productName, treeNodeCollection);
@ -387,7 +397,6 @@ namespace AssetStudioGUI
typeMap.Add(assetsFile.unityVersion, items); typeMap.Add(assetsFile.unityVersion, items);
} }
} }
return typeMap; return typeMap;
} }