mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-25 05:40:21 -04:00
Add support for separate PreloadData
https://github.com/Perfare/AssetStudio/issues/690 https://docs.unity.cn/550/Documentation/Manual/AssetBundleInternalStructure.html
This commit is contained in:
parent
b27482e22b
commit
efd06648ad
@ -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;
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
35
AssetStudio/Classes/PreloadData.cs
Normal file
35
AssetStudio/Classes/PreloadData.cs
Normal 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();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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)
|
||||||
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user