void SetOutputInformation(GUID asset, SceneDependencyInfo sceneInfo, BuildUsageTagSet usageTags, Hash128 prefabDependency)
 {
     // Add generated scene information to BuildDependencyData
     m_DependencyData.SceneInfo.Add(asset, sceneInfo);
     m_DependencyData.SceneUsage.Add(asset, usageTags);
     m_DependencyData.DependencyHash.Add(asset, prefabDependency);
 }
        void PackSceneBundle(string bundleName, List <GUID> includedScenes, Dictionary <GUID, List <GUID> > assetToReferences)
        {
            if (includedScenes.IsNullOrEmpty())
            {
                return;
            }

            string firstFileName = "";
            HashSet <ObjectIdentifier> previousSceneObjects = new HashSet <ObjectIdentifier>();
            HashSet <GUID>             previousSceneAssets  = new HashSet <GUID>();
            List <string> sceneInternalNames = new List <string>();
            Dictionary <GUID, HashSet <ObjectIdentifier> > assetObjectIdentifierHashSets = new Dictionary <GUID, HashSet <ObjectIdentifier> >();

            foreach (var scene in includedScenes)
            {
                var scenePath         = AssetDatabase.GUIDToAssetPath(scene.ToString());
                var internalSceneName = m_PackingMethod.GenerateInternalFileName(scenePath);
                if (string.IsNullOrEmpty(firstFileName))
                {
                    firstFileName = internalSceneName;
                }
                var internalName = string.Format(CommonStrings.SceneBundleNameFormat, firstFileName, internalSceneName);

                SceneDependencyInfo sceneInfo = m_DependencyData.SceneInfo[scene];

                var references = new List <ObjectIdentifier>();
                references.AddRange(sceneInfo.referencedObjects);
                assetToReferences[scene] = FilterReferencesForAsset(m_DependencyData, scene, references, previousSceneObjects, previousSceneAssets, assetObjectIdentifierHashSets);
                previousSceneObjects.UnionWith(references);
                previousSceneAssets.UnionWith(assetToReferences[scene]);

                m_WriteData.FileToObjects.Add(internalName, references);
                m_WriteData.FileToBundle.Add(internalName, bundleName);

                var files = new List <string> {
                    internalName
                };
                files.AddRange(sceneInternalNames);
                m_WriteData.AssetToFiles[scene] = files;

                sceneInternalNames.Add(internalName);
            }
        }
        // Create a populated 'SceneDependencyInfo' instance.  Can set fields directly for 2019.4+ as internals are available but have to use reflection for 2018.4
        static SceneDependencyInfo CreateSceneDependencyInfo(string scene, ObjectIdentifier[] objectIdentifiers, BuildUsageTagGlobal globalUsage, Type[] includedTypes)
        {
            SceneDependencyInfo sceneDependencyInfo = new SceneDependencyInfo();

#if UNITY_2019_4_OR_NEWER
            sceneDependencyInfo.m_Scene             = scene;
            sceneDependencyInfo.m_ReferencedObjects = objectIdentifiers;
            sceneDependencyInfo.m_GlobalUsage       = globalUsage;

#if UNITY_2020_1_OR_NEWER
            sceneDependencyInfo.m_IncludedTypes = includedTypes;
#endif
#else
            sceneDependencyInfo.SetScene(scene);
            sceneDependencyInfo.SetReferencedObjects(objectIdentifiers);
            SetFieldValue(sceneDependencyInfo, "m_GlobalUsage", globalUsage);
#endif

            return(sceneDependencyInfo);
        }
        /// <inheritdoc />
        public ReturnCode Run()
        {
            IList <CachedInfo> cachedInfo   = null;
            IList <CachedInfo> uncachedInfo = null;

            if (m_Parameters.UseCache && m_Cache != null)
            {
                IList <CacheEntry> entries = m_Content.Scenes.Select(x => m_Cache.GetCacheEntry(x, Version)).ToList();
                m_Cache.LoadCachedData(entries, out cachedInfo);

                uncachedInfo = new List <CachedInfo>();
            }

            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 <ObjectIdentifier>();
                    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);
        }
#pragma warning restore 649

        CachedInfo GetCachedInfo(GUID scene, IEnumerable <ObjectIdentifier> references, SceneDependencyInfo sceneInfo, BuildUsageTagSet usageTags)
        {
            var info = new CachedInfo();

            info.Asset = m_Cache.GetCacheEntry(scene, Version);

            var dependencies = new HashSet <CacheEntry>();

            foreach (ObjectIdentifier reference in references)
            {
                dependencies.Add(m_Cache.GetCacheEntry(reference));
            }
            info.Dependencies = dependencies.ToArray();

            info.Data = new object[] { sceneInfo, usageTags };

            return(info);
        }
#pragma warning restore 649

        CachedInfo GetCachedInfo(GUID scene, IEnumerable<ObjectIdentifier> references, SceneDependencyInfo sceneInfo, BuildUsageTagSet usageTags, IEnumerable<CacheEntry> prefabEntries, Hash128 prefabDependency)
        {
            var info = new CachedInfo();
            info.Asset = m_Cache.GetCacheEntry(scene, Version);

            var dependencies = new HashSet<CacheEntry>();
            foreach (var reference in references)
                dependencies.Add(m_Cache.GetCacheEntry(reference));
            dependencies.UnionWith(prefabEntries);
            info.Dependencies = dependencies.ToArray();

            info.Data = new object[] { sceneInfo, usageTags, prefabDependency };

            return info;
        }
Beispiel #7
0
#pragma warning restore 649

        CachedInfo GetCachedInfo(GUID scene, IEnumerable <ObjectIdentifier> references, SceneDependencyInfo sceneInfo, BuildUsageTagSet usageTags, IEnumerable <CacheEntry> prefabEntries, Hash128 prefabDependency)
        {
            var info = new CachedInfo();

            info.Asset = m_Cache.GetCacheEntry(scene, Version);

#if ENABLE_TYPE_HASHING || UNITY_2020_1_OR_NEWER
            var uniqueTypes = new HashSet <System.Type>(sceneInfo.includedTypes);
#else
            var uniqueTypes = new HashSet <System.Type>();
#endif
            var objectTypes  = new List <KeyValuePair <ObjectIdentifier, System.Type[]> >();
            var dependencies = new HashSet <CacheEntry>(prefabEntries);
            ExtensionMethods.ExtractCommonCacheData(m_Cache, null, references, uniqueTypes, objectTypes, dependencies);
            info.Dependencies = dependencies.ToArray();

            info.Data = new object[] { sceneInfo, usageTags, prefabDependency, objectTypes };

            return(info);
        }
#pragma warning restore 649

        CachedInfo GetCachedInfo(GUID scene, IEnumerable <ObjectIdentifier> references, SceneDependencyInfo sceneInfo, BuildUsageTagSet usageTags)
        {
            var info = new CachedInfo();

            info.Asset = m_Cache.GetCacheEntry(scene, Version);

            var dependencies = new HashSet <CacheEntry>();

            foreach (var reference in references)
            {
                dependencies.Add(m_Cache.GetCacheEntry(reference));
            }
            var prefabEntries = AssetDatabase.GetDependencies(AssetDatabase.GUIDToAssetPath(scene.ToString())).Where(path => path.EndsWith(".prefab")).Select(m_Cache.GetCacheEntry);

            dependencies.UnionWith(prefabEntries);
            info.Dependencies = dependencies.ToArray();

            info.Data = new object[] { sceneInfo, usageTags };

            return(info);
        }
        internal virtual void BuiltInResourcesToDependenciesMap(string[] resourcePaths)
        {
            for (int sceneIndex = 0; sceneIndex < resourcePaths.Length; ++sceneIndex)
            {
                string path = resourcePaths[sceneIndex];
                if (EditorUtility.DisplayCancelableProgressBar("Generating built-in resource dependency map",
                                                               "Checking " + path + " for duplicates with Addressables content.",
                                                               (float)sceneIndex / resourcePaths.Length))
                {
                    m_ResourcesToDependencies.Clear();
                    EditorUtility.ClearProgressBar();
                    return;
                }
                string[] dependencies;
                if (path.EndsWith(".unity"))
                {
#if UNITY_2019_3_OR_NEWER
                    using (var w = new BuildInterfacesWrapper())
                    {
                        var           usageTags = new BuildUsageTagSet();
                        BuildSettings settings  = new BuildSettings
                        {
                            group      = EditorUserBuildSettings.selectedBuildTargetGroup,
                            target     = EditorUserBuildSettings.activeBuildTarget,
                            typeDB     = null,
                            buildFlags = ContentBuildFlags.None
                        };

                        SceneDependencyInfo sceneInfo =
                            ContentBuildInterface.CalculatePlayerDependenciesForScene(path, settings, usageTags);
                        dependencies = new string[sceneInfo.referencedObjects.Count];
                        for (int i = 0; i < sceneInfo.referencedObjects.Count; ++i)
                        {
                            if (string.IsNullOrEmpty(sceneInfo.referencedObjects[i].filePath))
                            {
                                dependencies[i] = AssetDatabase.GUIDToAssetPath(sceneInfo.referencedObjects[i].guid.ToString());
                            }
                            else
                            {
                                dependencies[i] = sceneInfo.referencedObjects[i].filePath;
                            }
                        }
                    }
#else
                    HashSet <string> assetPaths = new HashSet <string>();
                    assetPaths.Add(path);
                    var s = EditorSceneManager.OpenScene(path, OpenSceneMode.Additive);
                    List <UnityEngine.Object> roots = new List <UnityEngine.Object>(s.GetRootGameObjects());

                    var sceneHierarchyStack = new Stack <GameObject>();
                    for (int i = roots.Count - 1; i >= 0; --i)
                    {
                        GameObject go = (GameObject)roots[i];
                        if (go.CompareTag("EditorOnly"))
                        {
                            UnityEngine.Object.DestroyImmediate(roots[i]);
                            roots.RemoveAt(i);
                        }
                        else
                        {
                            sceneHierarchyStack.Push(go);
                        }
                    }

                    while (sceneHierarchyStack.Count > 0)
                    {
                        var item = sceneHierarchyStack.Pop();
                        for (int i = 0; i < item.transform.childCount; ++i)
                        {
                            GameObject go = item.transform.GetChild(i).gameObject;
                            if (go.CompareTag("EditorOnly"))
                            {
                                UnityEngine.Object.DestroyImmediate(go);
                            }
                            else
                            {
                                sceneHierarchyStack.Push(go);
                            }
                        }
                    }

                    UnityEngine.Object[] deps = EditorUtility.CollectDependencies(roots.ToArray());
                    foreach (UnityEngine.Object o in deps)
                    {
                        string p = AssetDatabase.GetAssetPath(o.GetInstanceID());
                        if (!string.IsNullOrEmpty(p))
                        {
                            assetPaths.Add(p);
                        }
                    }

                    EditorSceneManager.CloseScene(s, true);
                    dependencies = assetPaths.ToArray();
#endif
                }
                else
                {
                    dependencies = AssetDatabase.GetDependencies(path);
                }

                if (!m_ResourcesToDependencies.ContainsKey(path))
                {
                    m_ResourcesToDependencies.Add(path, new List <GUID>(dependencies.Length));
                }
                else
                {
                    m_ResourcesToDependencies[path].Capacity += dependencies.Length;
                }

                foreach (string dependency in dependencies)
                {
                    if (dependency.EndsWith(".cs") || dependency.EndsWith(".dll"))
                    {
                        continue;
                    }
                    m_ResourcesToDependencies[path].Add(new GUID(AssetDatabase.AssetPathToGUID(dependency)));
                }
            }
            EditorUtility.ClearProgressBar();
        }
Beispiel #10
0
        /// <summary>
        /// Build map of resources to corresponding dependencies
        /// </summary>
        /// <param name="resourcePaths"> Array of resource paths</param>
        protected internal virtual void BuiltInResourcesToDependenciesMap(string[] resourcePaths)
        {
            for (int sceneIndex = 0; sceneIndex < resourcePaths.Length; ++sceneIndex)
            {
                string path = resourcePaths[sceneIndex];
                if (EditorUtility.DisplayCancelableProgressBar("Generating built-in resource dependency map",
                                                               "Checking " + path + " for duplicates with Addressables content.",
                                                               (float)sceneIndex / resourcePaths.Length))
                {
                    m_ResourcesToDependencies.Clear();
                    EditorUtility.ClearProgressBar();
                    return;
                }
                string[] dependencies;
                if (path.EndsWith(".unity"))
                {
                    using (var w = new BuildInterfacesWrapper())
                    {
                        var           usageTags = new BuildUsageTagSet();
                        BuildSettings settings  = new BuildSettings
                        {
                            group      = EditorUserBuildSettings.selectedBuildTargetGroup,
                            target     = EditorUserBuildSettings.activeBuildTarget,
                            typeDB     = null,
                            buildFlags = ContentBuildFlags.None
                        };

                        SceneDependencyInfo sceneInfo =
                            ContentBuildInterface.CalculatePlayerDependenciesForScene(path, settings, usageTags);
                        dependencies = new string[sceneInfo.referencedObjects.Count];
                        for (int i = 0; i < sceneInfo.referencedObjects.Count; ++i)
                        {
                            if (string.IsNullOrEmpty(sceneInfo.referencedObjects[i].filePath))
                            {
                                dependencies[i] = AssetDatabase.GUIDToAssetPath(sceneInfo.referencedObjects[i].guid.ToString());
                            }
                            else
                            {
                                dependencies[i] = sceneInfo.referencedObjects[i].filePath;
                            }
                        }
                    }
                }
                else
                {
                    dependencies = AssetDatabase.GetDependencies(path);
                }

                if (!m_ResourcesToDependencies.ContainsKey(path))
                {
                    m_ResourcesToDependencies.Add(path, new List <GUID>(dependencies.Length));
                }
                else
                {
                    m_ResourcesToDependencies[path].Capacity += dependencies.Length;
                }

                foreach (string dependency in dependencies)
                {
                    if (dependency.EndsWith(".cs") || dependency.EndsWith(".dll"))
                    {
                        continue;
                    }
                    m_ResourcesToDependencies[path].Add(new GUID(AssetDatabase.AssetPathToGUID(dependency)));
                }
            }
            EditorUtility.ClearProgressBar();
        }