172 lines
6.5 KiB
C#
172 lines
6.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
#if UNITY_2019_3_OR_NEWER
|
|
using UnityEditor.Build.Content;
|
|
#endif
|
|
using UnityEditor.Build.Pipeline.Interfaces;
|
|
using UnityEditor.Build.Pipeline.Utilities;
|
|
|
|
namespace UnityEditor.Build.Pipeline
|
|
{
|
|
#if UNITY_2019_3_OR_NEWER
|
|
/// <summary>
|
|
/// Basic implementation of ICustomAssets. Stores the list of Custom Assets generated during the Scriptable Build Pipeline.
|
|
/// <seealso cref="ICustomAssets"/>
|
|
/// </summary>
|
|
[Serializable]
|
|
public class CustomAssets : ICustomAssets
|
|
{
|
|
/// <inheritdoc />
|
|
public List<GUID> Assets { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Default constructor, creates an empty CustomAssets.
|
|
/// </summary>
|
|
public CustomAssets()
|
|
{
|
|
Assets = new List<GUID>();
|
|
}
|
|
}
|
|
#endif
|
|
|
|
/// <summary>
|
|
/// Basic implementation of IBuildContent. Stores the list of Assets to feed the Scriptable Build Pipeline.
|
|
/// <seealso cref="IBuildContent"/>
|
|
/// </summary>
|
|
[Serializable]
|
|
public class BuildContent : IBuildContent
|
|
{
|
|
/// <inheritdoc />
|
|
public List<GUID> Assets { get; private set; }
|
|
|
|
/// <inheritdoc />
|
|
public List<GUID> Scenes { get; private set; }
|
|
|
|
#if UNITY_2019_3_OR_NEWER
|
|
/// <inheritdoc />
|
|
public List<CustomContent> CustomAssets { get; private set; }
|
|
#endif
|
|
|
|
/// <summary>
|
|
/// Default constructor, creates an empty BuildContent.
|
|
/// </summary>
|
|
public BuildContent() {}
|
|
|
|
/// <summary>
|
|
/// Default constructor, takes a set of Assets and converts them to the appropriate properties.
|
|
/// </summary>
|
|
/// <param name="assets">The set of Assets identified by GUID to ensure are packaged with the build</param>
|
|
public BuildContent(IEnumerable<GUID> assets)
|
|
{
|
|
if (assets == null)
|
|
throw new ArgumentNullException("assets");
|
|
|
|
Assets = new List<GUID>();
|
|
Scenes = new List<GUID>();
|
|
#if UNITY_2019_3_OR_NEWER
|
|
CustomAssets = new List<CustomContent>();
|
|
#endif
|
|
|
|
foreach (var asset in assets)
|
|
{
|
|
ValidationMethods.Status assetType = ValidationMethods.ValidAsset(asset);
|
|
if (assetType == ValidationMethods.Status.Asset)
|
|
Assets.Add(asset);
|
|
else if (assetType == ValidationMethods.Status.Scene)
|
|
Scenes.Add(asset);
|
|
else
|
|
throw new ArgumentException(string.Format("Asset '{0}' is not a valid Asset or Scene.", asset.ToString()));
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Basic implementation of IBundleBuildContent. Stores the list of Assets with explicit Asset Bundle layout to feed the Scriptable Build Pipeline.
|
|
/// <seealso cref="IBundleBuildContent"/>
|
|
/// </summary>
|
|
[Serializable]
|
|
public class BundleBuildContent : IBundleBuildContent
|
|
{
|
|
/// <inheritdoc />
|
|
public List<GUID> Assets { get; private set; }
|
|
|
|
/// <inheritdoc />
|
|
public List<GUID> Scenes { get; private set; }
|
|
|
|
#if UNITY_2019_3_OR_NEWER
|
|
/// <inheritdoc />
|
|
public List<CustomContent> CustomAssets { get; private set; }
|
|
|
|
/// <inheritdoc />
|
|
public Dictionary<string, List<ResourceFile>> AdditionalFiles { get; private set; }
|
|
#endif
|
|
|
|
/// <inheritdoc />
|
|
public Dictionary<GUID, string> Addresses { get; private set; }
|
|
|
|
/// <inheritdoc />
|
|
public Dictionary<string, List<GUID>> BundleLayout { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Default constructor, creates an empty BundleBuildContent.
|
|
/// </summary>
|
|
public BundleBuildContent() {}
|
|
|
|
/// <summary>
|
|
/// Default constructor, takes a set of AssetBundleBuild and converts them to the appropriate properties.
|
|
/// </summary>
|
|
/// <param name="bundleBuilds">The set of AssetbundleBuild to be built.</param>
|
|
public BundleBuildContent(IEnumerable<AssetBundleBuild> bundleBuilds)
|
|
{
|
|
if (bundleBuilds == null)
|
|
throw new ArgumentNullException("bundleBuilds");
|
|
|
|
Assets = new List<GUID>();
|
|
Scenes = new List<GUID>();
|
|
Addresses = new Dictionary<GUID, string>();
|
|
BundleLayout = new Dictionary<string, List<GUID>>();
|
|
#if UNITY_2019_3_OR_NEWER
|
|
CustomAssets = new List<CustomContent>();
|
|
AdditionalFiles = new Dictionary<string, List<ResourceFile>>();
|
|
#endif
|
|
|
|
foreach (var bundleBuild in bundleBuilds)
|
|
{
|
|
List<GUID> guids;
|
|
BundleLayout.GetOrAdd(bundleBuild.assetBundleName, out guids);
|
|
ValidationMethods.Status bundleType = ValidationMethods.Status.Invalid;
|
|
|
|
for (int i = 0; i < bundleBuild.assetNames.Length; i++)
|
|
{
|
|
string assetPath = bundleBuild.assetNames[i];
|
|
GUID asset = new GUID(AssetDatabase.AssetPathToGUID(assetPath));
|
|
|
|
// Ensure the path is valid
|
|
ValidationMethods.Status status = ValidationMethods.ValidAsset(asset);
|
|
if (status == ValidationMethods.Status.Invalid)
|
|
throw new ArgumentException(string.Format("Asset '{0}' is not a valid Asset or Scene.", assetPath));
|
|
|
|
// Ensure we do not have a mixed bundle
|
|
if (bundleType == ValidationMethods.Status.Invalid)
|
|
bundleType = status;
|
|
else if (bundleType != status)
|
|
throw new ArgumentException(string.Format("Asset Bundle '{0}' is invalid because it contains mixed Asset and Scene types.", bundleBuild.assetBundleName));
|
|
|
|
string address = bundleBuild.addressableNames != null && i < bundleBuild.addressableNames.Length && !string.IsNullOrEmpty(bundleBuild.addressableNames[i]) ?
|
|
bundleBuild.addressableNames[i] : AssetDatabase.GUIDToAssetPath(asset.ToString());
|
|
|
|
// Add the guid to the bundle map
|
|
guids.Add(asset);
|
|
// Add the guid & address
|
|
Addresses.Add(asset, address);
|
|
|
|
// Add the asset to the correct collection
|
|
if (status == ValidationMethods.Status.Asset)
|
|
Assets.Add(asset);
|
|
else if (status == ValidationMethods.Status.Scene)
|
|
Scenes.Add(asset);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|