WuhuIslandTesting/Library/PackageCache/com.unity.scriptablebuildpipeline@1.21.5/Editor/Shared/BuildContent.cs
2025-01-07 02:06:59 +01:00

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);
}
}
}
}
}