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