using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor.Build.Content;
using UnityEditor.Build.Pipeline.Injector;
using UnityEditor.Build.Pipeline.Interfaces;
using UnityEditor.Build.Utilities;
namespace UnityEditor.Build.Pipeline.Tasks
{
///
/// Optional build task that extracts all referenced MonoScripts and assigns them to the specified bundle
///
public class CreateMonoScriptBundle : IBuildTask
{
static readonly GUID k_DefaultGuid = new GUID(CommonStrings.UnityDefaultResourceGuid);
///
public int Version { get { return 1; } }
#pragma warning disable 649
[InjectContext(ContextUsage.In)]
IDependencyData m_DependencyData;
[InjectContext(ContextUsage.InOut, true)]
IBundleExplictObjectLayout m_Layout;
#pragma warning restore 649
///
/// Stores the name for the MonoScript bundle.
///
public string MonoScriptBundleName { get; set; }
///
/// Create the MonoScript bundle.
///
/// The name of the bundle.
public CreateMonoScriptBundle(string bundleName)
{
MonoScriptBundleName = bundleName;
}
///
public ReturnCode Run()
{
HashSet buildInObjects = new HashSet();
foreach (AssetLoadInfo dependencyInfo in m_DependencyData.AssetInfo.Values)
buildInObjects.UnionWith(dependencyInfo.referencedObjects);
foreach (SceneDependencyInfo dependencyInfo in m_DependencyData.SceneInfo.Values)
buildInObjects.UnionWith(dependencyInfo.referencedObjects);
ObjectIdentifier[] usedSet = buildInObjects.ToArray();
Type[] usedTypes = BuildCacheUtility.GetMainTypeForObjects(usedSet);
if (m_Layout == null)
m_Layout = new BundleExplictObjectLayout();
Type monoScript = typeof(MonoScript);
for (int i = 0; i < usedTypes.Length; i++)
{
if (usedTypes[i] != monoScript || usedSet[i].guid == k_DefaultGuid)
continue;
m_Layout.ExplicitObjectLocation.Add(usedSet[i], MonoScriptBundleName);
}
if (m_Layout.ExplicitObjectLocation.Count == 0)
m_Layout = null;
return ReturnCode.Success;
}
}
}