using System.Collections.Generic;
using System.Linq;
using UnityEditor.Build.Content;
using UnityEditor.Build.Pipeline.Injector;
using UnityEditor.Build.Pipeline.Interfaces;
using UnityEditor.Build.Pipeline.Utilities;
using UnityEditor.Build.Pipeline.WriteTypes;
namespace UnityEditor.Build.Pipeline.Tasks
{
///
/// Creates sub asset load information.
///
public class GenerateSubAssetPathMaps : IBuildTask
{
///
public int Version { get { return 1; } }
#pragma warning disable 649
[InjectContext]
IBundleWriteData m_WriteData;
[InjectContext(ContextUsage.In, true)]
IBuildExtendedAssetData m_ExtendedAssetData;
#pragma warning restore 649
///
public ReturnCode Run()
{
if (m_ExtendedAssetData == null || m_ExtendedAssetData.ExtendedData.IsNullOrEmpty())
return ReturnCode.SuccessNotRun;
Dictionary fileToOperation = m_WriteData.WriteOperations.ToDictionary(x => x.Command.internalName, x => x);
foreach (var pair in m_ExtendedAssetData.ExtendedData)
{
GUID asset = pair.Key;
string mainFile = m_WriteData.AssetToFiles[asset][0];
var abOp = fileToOperation[mainFile] as AssetBundleWriteOperation;
int assetInfoIndex = abOp.Info.bundleAssets.FindIndex(x => x.asset == asset);
AssetLoadInfo assetInfo = abOp.Info.bundleAssets[assetInfoIndex];
int offset = 1;
foreach (var subAsset in pair.Value.Representations)
{
var secondaryAssetInfo = CreateSubAssetLoadInfo(assetInfo, subAsset);
abOp.Info.bundleAssets.Insert(assetInfoIndex + offset, secondaryAssetInfo);
offset++;
}
}
return ReturnCode.Success;
}
static AssetLoadInfo CreateSubAssetLoadInfo(AssetLoadInfo assetInfo, ObjectIdentifier subAsset)
{
var subAssetLoadInfo = new AssetLoadInfo();
subAssetLoadInfo.asset = assetInfo.asset;
subAssetLoadInfo.address = assetInfo.address;
subAssetLoadInfo.referencedObjects = new List(assetInfo.referencedObjects);
subAssetLoadInfo.includedObjects = new List(assetInfo.includedObjects);
var index = subAssetLoadInfo.includedObjects.IndexOf(subAsset);
subAssetLoadInfo.includedObjects.Swap(0, index);
return subAssetLoadInfo;
}
}
}