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; namespace UnityEditor.Build.Pipeline.Tasks { /// /// Validates scene dependency data and stores it in the cache. /// public class PreviewSceneDependencyData : IBuildTask { /// public int Version { get { return 1; } } #pragma warning disable 649 [InjectContext(ContextUsage.In)] IBuildParameters m_Parameters; [InjectContext(ContextUsage.In)] IBuildContent m_Content; [InjectContext] IDependencyData m_DependencyData; [InjectContext(ContextUsage.In, true)] IProgressTracker m_Tracker; [InjectContext(ContextUsage.In, true)] IBuildCache m_Cache; #pragma warning restore 649 CachedInfo GetCachedInfo(GUID scene, IEnumerable references, SceneDependencyInfo sceneInfo, BuildUsageTagSet usageTags) { var info = new CachedInfo(); info.Asset = m_Cache.GetCacheEntry(scene, Version); var dependencies = new HashSet(); foreach (ObjectIdentifier reference in references) dependencies.Add(m_Cache.GetCacheEntry(reference)); info.Dependencies = dependencies.ToArray(); info.Data = new object[] { sceneInfo, usageTags }; return info; } /// public ReturnCode Run() { IList cachedInfo = null; IList uncachedInfo = null; if (m_Parameters.UseCache && m_Cache != null) { IList entries = m_Content.Scenes.Select(x => m_Cache.GetCacheEntry(x, Version)).ToList(); m_Cache.LoadCachedData(entries, out cachedInfo); uncachedInfo = new List(); } for (int i = 0; i < m_Content.Scenes.Count; i++) { GUID scene = m_Content.Scenes[i]; string scenePath = AssetDatabase.GUIDToAssetPath(scene.ToString()); SceneDependencyInfo sceneInfo; BuildUsageTagSet usageTags; if (cachedInfo != null && cachedInfo[i] != null) { if (!m_Tracker.UpdateInfoUnchecked(string.Format("{0} (Cached)", scenePath))) return ReturnCode.Canceled; sceneInfo = (SceneDependencyInfo)cachedInfo[i].Data[0]; usageTags = cachedInfo[i].Data[1] as BuildUsageTagSet; } else { if (!m_Tracker.UpdateInfoUnchecked(scenePath)) return ReturnCode.Canceled; var references = new HashSet(); string[] dependencies = AssetDatabase.GetDependencies(scenePath); foreach (var assetPath in dependencies) { var assetGuid = new GUID(AssetDatabase.AssetPathToGUID(assetPath)); if (ValidationMethods.ValidAsset(assetGuid) != ValidationMethods.Status.Asset) continue; // TODO: Use Cache to speed this up? var assetIncludes = ContentBuildInterface.GetPlayerObjectIdentifiersInAsset(assetGuid, m_Parameters.Target); var assetReferences = ContentBuildInterface.GetPlayerDependenciesForObjects(assetIncludes, m_Parameters.Target, m_Parameters.ScriptInfo); references.UnionWith(assetIncludes); references.UnionWith(assetReferences); } sceneInfo = new SceneDependencyInfo(); usageTags = new BuildUsageTagSet(); sceneInfo.SetScene(scenePath); sceneInfo.SetProcessedScene(scenePath); sceneInfo.SetReferencedObjects(references.ToArray()); if (uncachedInfo != null) uncachedInfo.Add(GetCachedInfo(scene, sceneInfo.referencedObjects, sceneInfo, usageTags)); } SetOutputInformation(scene, sceneInfo, usageTags); } if (m_Parameters.UseCache && m_Cache != null) m_Cache.SaveCachedData(uncachedInfo); return ReturnCode.Success; } void SetOutputInformation(GUID asset, SceneDependencyInfo sceneInfo, BuildUsageTagSet usageTags) { // Add generated scene information to BuildDependencyData m_DependencyData.SceneInfo.Add(asset, sceneInfo); m_DependencyData.SceneUsage.Add(asset, usageTags); } } }