static internal ReturnCode RunInternal(TaskInput input, out TaskOutput output)
        {
#if !UNITY_2020_2_OR_NEWER
            input.EngineHooks = input.EngineHooks != null ? input.EngineHooks : new CalculateAssetDependencyHooks();
#endif
            output = new TaskOutput();
            output.AssetResults = new AssetOutput[input.Assets.Count];

            IList <CachedInfo> cachedInfo = null;
            if (input.BuildCache != null)
            {
                IList <CacheEntry> entries = input.Assets.Select(x => input.BuildCache.GetCacheEntry(x, kVersion)).ToList();
                input.BuildCache.LoadCachedData(entries, out cachedInfo);
            }

            using (input.Logger.ScopedStep(LogLevel.Info, "Calculate Dependencies"))
            {
                for (int i = 0; i < input.Assets.Count; i++)
                {
                    AssetOutput assetResult = new AssetOutput();
                    assetResult.asset = input.Assets[i];
                    if (cachedInfo != null && cachedInfo[i] != null)
                    {
                        assetResult.assetInfo    = cachedInfo[i].Data[0] as AssetLoadInfo;
                        assetResult.usageTags    = cachedInfo[i].Data[1] as BuildUsageTagSet;
                        assetResult.spriteData   = cachedInfo[i].Data[2] as SpriteImporterData;
                        assetResult.extendedData = cachedInfo[i].Data[3] as ExtendedAssetData;
                        assetResult.objectTypes  = cachedInfo[i].Data[4] as List <KeyValuePair <ObjectIdentifier, System.Type[]> >;
                        output.AssetResults[i]   = assetResult;
                        output.CachedAssetCount++;
                        continue;
                    }

                    GUID   asset     = input.Assets[i];
                    string assetPath = AssetDatabase.GUIDToAssetPath(asset.ToString());

                    if (!input.ProgressTracker.UpdateInfoUnchecked(assetPath))
                    {
                        return(ReturnCode.Canceled);
                    }

                    assetResult.assetInfo = new AssetLoadInfo();
                    assetResult.usageTags = new BuildUsageTagSet();

                    assetResult.assetInfo.asset = asset;
                    var includedObjects = ContentBuildInterface.GetPlayerObjectIdentifiersInAsset(asset, input.Target);
                    assetResult.assetInfo.includedObjects = new List <ObjectIdentifier>(includedObjects);
                    var referencedObjects = ContentBuildInterface.GetPlayerDependenciesForObjects(includedObjects, input.Target, input.TypeDB);
                    assetResult.assetInfo.referencedObjects = new List <ObjectIdentifier>(referencedObjects);
                    var allObjects = new List <ObjectIdentifier>(includedObjects);
                    allObjects.AddRange(referencedObjects);
                    ContentBuildInterface.CalculateBuildUsageTags(allObjects.ToArray(), includedObjects, input.GlobalUsage, assetResult.usageTags, input.DependencyUsageCache);

                    var importer = AssetImporter.GetAtPath(assetPath) as TextureImporter;
                    if (importer != null && importer.textureType == TextureImporterType.Sprite)
                    {
                        assetResult.spriteData = new SpriteImporterData();
                        assetResult.spriteData.PackedSprite  = false;
                        assetResult.spriteData.SourceTexture = includedObjects.FirstOrDefault();

                        if (EditorSettings.spritePackerMode != SpritePackerMode.Disabled)
                        {
                            assetResult.spriteData.PackedSprite = referencedObjects.Length > 0;
                        }
#if !UNITY_2020_1_OR_NEWER
                        if (EditorSettings.spritePackerMode == SpritePackerMode.AlwaysOn || EditorSettings.spritePackerMode == SpritePackerMode.BuildTimeOnly)
                        {
                            assetResult.spriteData.PackedSprite = !string.IsNullOrEmpty(importer.spritePackingTag);
                        }
#endif
                    }

#if !UNITY_2020_2_OR_NEWER
                    GatherAssetRepresentations(assetPath, input.EngineHooks.LoadAllAssetRepresentationsAtPath, includedObjects, out assetResult.extendedData);
#else
                    GatherAssetRepresentations(asset, input.Target, out assetResult.extendedData);
#endif
                    output.AssetResults[i] = assetResult;
                }
            }

            if (input.BuildCache != null)
            {
                List <CachedInfo> toCache = new List <CachedInfo>();
                for (int i = 0; i < input.Assets.Count; i++)
                {
                    AssetOutput r = output.AssetResults[i];
                    if (cachedInfo[i] == null)
                    {
                        toCache.Add(GetCachedInfo(input.BuildCache, input.Assets[i], r.assetInfo, r.usageTags, r.spriteData, r.extendedData));
                    }
                }
                input.BuildCache.SaveCachedData(toCache);
            }

            return(ReturnCode.Success);
        }
Beispiel #2
0
        static internal ReturnCode RunInternal(TaskInput input, out TaskOutput output)
        {
            input.EngineHooks   = input.EngineHooks != null ? input.EngineHooks : new CalculateAssetDependencyHooks();
            output              = new TaskOutput();
            output.AssetResults = new AssetOutput[input.Assets.Count];

            IList <CachedInfo> cachedInfo = null;

            if (input.BuildCache != null)
            {
                IList <CacheEntry> entries = input.Assets.Select(x => input.BuildCache.GetCacheEntry(x, kVersion)).ToList();
                input.BuildCache.LoadCachedData(entries, out cachedInfo);
            }

            for (int i = 0; i < input.Assets.Count; i++)
            {
                AssetOutput assetResult = new AssetOutput();
                assetResult.asset = input.Assets[i];
                if (cachedInfo != null && cachedInfo[i] != null)
                {
                    assetResult.assetInfo    = cachedInfo[i].Data[0] as AssetLoadInfo;
                    assetResult.usageTags    = cachedInfo[i].Data[1] as BuildUsageTagSet;
                    assetResult.spriteData   = cachedInfo[i].Data[2] as SpriteImporterData;
                    assetResult.extendedData = cachedInfo[i].Data[3] as ExtendedAssetData;
                    output.AssetResults[i]   = assetResult;
                    output.CachedAssetCount++;
                    continue;
                }

                GUID   asset     = input.Assets[i];
                string assetPath = AssetDatabase.GUIDToAssetPath(asset.ToString());

                if (!input.ProgressTracker.UpdateInfoUnchecked(assetPath))
                {
                    return(ReturnCode.Canceled);
                }

                assetResult.assetInfo = new AssetLoadInfo();
                assetResult.usageTags = new BuildUsageTagSet();

                assetResult.assetInfo.asset = asset;
                var includedObjects = ContentBuildInterface.GetPlayerObjectIdentifiersInAsset(asset, input.Target);
                assetResult.assetInfo.includedObjects = new List <ObjectIdentifier>(includedObjects);
                var referencedObjects = ContentBuildInterface.GetPlayerDependenciesForObjects(includedObjects, input.Target, input.TypeDB);
                assetResult.assetInfo.referencedObjects = new List <ObjectIdentifier>(referencedObjects);
                var allObjects = new List <ObjectIdentifier>(includedObjects);
                allObjects.AddRange(referencedObjects);
                ContentBuildInterface.CalculateBuildUsageTags(allObjects.ToArray(), includedObjects, input.GlobalUsage, assetResult.usageTags, input.DependencyUsageCache);

                var importer = AssetImporter.GetAtPath(assetPath) as TextureImporter;
                if (importer != null && importer.textureType == TextureImporterType.Sprite)
                {
                    assetResult.spriteData = new SpriteImporterData();
                    assetResult.spriteData.PackedSprite  = false;
                    assetResult.spriteData.SourceTexture = includedObjects.First();

                    if (EditorSettings.spritePackerMode != SpritePackerMode.Disabled)
                    {
                        assetResult.spriteData.PackedSprite = referencedObjects.Length > 0;
                    }
#if !UNITY_2020_1_OR_NEWER
                    if (EditorSettings.spritePackerMode == SpritePackerMode.AlwaysOn || EditorSettings.spritePackerMode == SpritePackerMode.BuildTimeOnly)
                    {
                        assetResult.spriteData.PackedSprite = !string.IsNullOrEmpty(importer.spritePackingTag);
                    }
#endif
                }

                var representations = input.EngineHooks.LoadAllAssetRepresentationsAtPath(assetPath);
                if (!representations.IsNullOrEmpty())
                {
                    assetResult.extendedData = new ExtendedAssetData();
                    for (int j = 0; j < representations.Length; j++)
                    {
                        if (representations[j] == null)
                        {
                            BuildLogger.LogWarning($"SubAsset {j} inside {assetPath} is null. It will not be included in the build.");
                            continue;
                        }

                        if (AssetDatabase.IsMainAsset(representations[j]))
                        {
                            continue;
                        }

                        string guid;
                        long   localId;
                        if (!AssetDatabase.TryGetGUIDAndLocalFileIdentifier(representations[j], out guid, out localId))
                        {
                            continue;
                        }

                        assetResult.extendedData.Representations.AddRange(includedObjects.Where(x => x.localIdentifierInFile == localId));
                    }
                }
                output.AssetResults[i] = assetResult;
            }

            if (input.BuildCache != null)
            {
                List <CachedInfo> toCache = new List <CachedInfo>();
                for (int i = 0; i < input.Assets.Count; i++)
                {
                    AssetOutput r = output.AssetResults[i];
                    if (cachedInfo[i] == null)
                    {
                        toCache.Add(GetCachedInfo(input.BuildCache, input.Assets[i], r.assetInfo, r.usageTags, r.spriteData, r.extendedData));
                    }
                }
                input.BuildCache.SaveCachedData(toCache);
            }

            return(ReturnCode.Success);
        }