mirror of https://github.com/tuyoogame/YooAsset
update asset bundle builder
parent
11386a7ec2
commit
bcb6443300
|
@ -28,6 +28,11 @@ namespace YooAsset.Editor
|
||||||
/// 缓存服务器端口
|
/// 缓存服务器端口
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int CacheServerPort;
|
public int CacheServerPort;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修复图集资源冗余问题
|
||||||
|
/// </summary>
|
||||||
|
public bool FixSpriteAtlasRedundancy = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -8,65 +8,61 @@ using System.Linq;
|
||||||
|
|
||||||
namespace UnityEditor.Build.Pipeline.Tasks
|
namespace UnityEditor.Build.Pipeline.Tasks
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Ref https://zhuanlan.zhihu.com/p/586918159
|
/// Ref https://zhuanlan.zhihu.com/p/586918159
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class RemoveSpriteAtlasRedundancy : IBuildTask
|
public class RemoveSpriteAtlasRedundancy : IBuildTask
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
public int Version => 1;
|
||||||
public int Version => 1;
|
|
||||||
|
|
||||||
[InjectContext]
|
[InjectContext]
|
||||||
IBundleWriteData writeDataParam;
|
IBundleWriteData writeDataParam;
|
||||||
|
|
||||||
/// <inheritdoc />
|
public ReturnCode Run()
|
||||||
public ReturnCode Run()
|
{
|
||||||
{
|
|
||||||
#if UNITY_2020_3_OR_NEWER
|
#if UNITY_2020_3_OR_NEWER
|
||||||
BundleWriteData writeData = (BundleWriteData)writeDataParam;
|
BundleWriteData writeData = (BundleWriteData)writeDataParam;
|
||||||
|
|
||||||
// 所有图集散图的 guid 集合
|
// 图集引用的精灵图片集合
|
||||||
HashSet<GUID> spriteGuids = new HashSet<GUID>();
|
HashSet<GUID> spriteGuids = new HashSet<GUID>();
|
||||||
|
foreach (var pair in writeData.FileToObjects)
|
||||||
|
{
|
||||||
|
foreach (ObjectIdentifier objectIdentifier in pair.Value)
|
||||||
|
{
|
||||||
|
var assetPath = AssetDatabase.GUIDToAssetPath(objectIdentifier.guid);
|
||||||
|
var assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
||||||
|
if (assetType == typeof(SpriteAtlas))
|
||||||
|
{
|
||||||
|
var spritePaths = AssetDatabase.GetDependencies(assetPath, false);
|
||||||
|
foreach (string spritePath in spritePaths)
|
||||||
|
{
|
||||||
|
GUID spriteGuild = AssetDatabase.GUIDFromAssetPath(spritePath);
|
||||||
|
spriteGuids.Add(spriteGuild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 遍历资源包里的资源记录其中图集的散图 guid
|
// 移除图集引用的精力图片对象
|
||||||
foreach (var pair in writeData.FileToObjects)
|
foreach (var pair in writeData.FileToObjects)
|
||||||
{
|
{
|
||||||
foreach (ObjectIdentifier objectIdentifier in pair.Value)
|
List<ObjectIdentifier> objectIdentifiers = pair.Value;
|
||||||
{
|
for (int i = objectIdentifiers.Count - 1; i >= 0; i--)
|
||||||
string path = AssetDatabase.GUIDToAssetPath(objectIdentifier.guid);
|
{
|
||||||
Object asset = AssetDatabase.LoadAssetAtPath<Object>(path);
|
ObjectIdentifier objectIdentifier = objectIdentifiers[i];
|
||||||
if (asset is SpriteAtlas)
|
if (spriteGuids.Contains(objectIdentifier.guid))
|
||||||
{
|
{
|
||||||
List<string> spritePaths = AssetDatabase.GetDependencies(path, false).ToList();
|
if (objectIdentifier.localIdentifierInFile == 2800000)
|
||||||
foreach (string spritePath in spritePaths)
|
{
|
||||||
{
|
// 删除图集散图的冗余纹理
|
||||||
GUID spriteGuild = AssetDatabase.GUIDFromAssetPath(spritePath);
|
objectIdentifiers.RemoveAt(i);
|
||||||
spriteGuids.Add(spriteGuild);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// 将 writeData.FileToObjects 包含的图集散图的 texture 删掉避免冗余
|
|
||||||
foreach (var pair in writeData.FileToObjects)
|
|
||||||
{
|
|
||||||
List<ObjectIdentifier> objectIdentifiers = pair.Value;
|
|
||||||
for (int i = objectIdentifiers.Count - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
ObjectIdentifier objectIdentifier = objectIdentifiers[i];
|
|
||||||
if (spriteGuids.Contains(objectIdentifier.guid))
|
|
||||||
{
|
|
||||||
if (objectIdentifier.localIdentifierInFile == 2800000)
|
|
||||||
{
|
|
||||||
// 删除图集散图的冗余 texture
|
|
||||||
objectIdentifiers.RemoveAt(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ReturnCode.Success;
|
return ReturnCode.Success;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -9,7 +9,7 @@ namespace UnityEditor.Build.Pipeline.Tasks
|
||||||
{
|
{
|
||||||
public static class SBPBuildTasks
|
public static class SBPBuildTasks
|
||||||
{
|
{
|
||||||
public static IList<IBuildTask> Create(string builtInShaderBundleName)
|
public static IList<IBuildTask> Create(bool fixSpriteAtlasRedundancy, string builtInShaderBundleName)
|
||||||
{
|
{
|
||||||
var buildTasks = new List<IBuildTask>();
|
var buildTasks = new List<IBuildTask>();
|
||||||
|
|
||||||
|
@ -33,7 +33,8 @@ namespace UnityEditor.Build.Pipeline.Tasks
|
||||||
|
|
||||||
// Packing
|
// Packing
|
||||||
buildTasks.Add(new GenerateBundlePacking());
|
buildTasks.Add(new GenerateBundlePacking());
|
||||||
buildTasks.Add(new RemoveSpriteAtlasRedundancy()); // Fix for SpriteAtlas Redundancy
|
if (fixSpriteAtlasRedundancy)
|
||||||
|
buildTasks.Add(new RemoveSpriteAtlasRedundancy());
|
||||||
buildTasks.Add(new UpdateBundleObjectLayout());
|
buildTasks.Add(new UpdateBundleObjectLayout());
|
||||||
buildTasks.Add(new GenerateBundleCommands());
|
buildTasks.Add(new GenerateBundleCommands());
|
||||||
buildTasks.Add(new GenerateSubAssetPathMaps());
|
buildTasks.Add(new GenerateSubAssetPathMaps());
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace YooAsset.Editor
|
||||||
// 开始构建
|
// 开始构建
|
||||||
IBundleBuildResults buildResults;
|
IBundleBuildResults buildResults;
|
||||||
var buildParameters = buildParametersContext.GetSBPBuildParameters();
|
var buildParameters = buildParametersContext.GetSBPBuildParameters();
|
||||||
var taskList = SBPBuildTasks.Create(buildMapContext.Command.ShadersBundleName);
|
var taskList = SBPBuildTasks.Create(buildParametersContext.Parameters.SBPParameters.FixSpriteAtlasRedundancy, buildMapContext.Command.ShadersBundleName);
|
||||||
ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out buildResults, taskList);
|
ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out buildResults, taskList);
|
||||||
if (exitCode < 0)
|
if (exitCode < 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue