Пример #1
0
 private static void InitializeSetting()
 {
     if (settingRoot == null)
     {
         settingRoot = AssetDatabase.LoadAssetAtPath <StaticABSettings>(SETTING_FILE_PATH);
         if (settingRoot == null)
         {
             settingRoot = CreateInstance <StaticABSettings>();
             AssetDatabase.CreateAsset(settingRoot, SETTING_FILE_PATH);
         }
     }
 }
Пример #2
0
        public static void BuildRelation(StaticABSettings abSetting)
        {
            AssetCustomProcesses.Init();
            AssetNodeCollector.Clear();

            manualSettings = abSetting.Settings;
            s_specialAB    = new Dictionary <string, BundleUnloadStrategy>();
            foreach (var setting in manualSettings)
            {
                Debug.LogWarning($"Setting Path : {setting.Path}");
                var settingFiles = Directory.GetFiles(setting.Path, "*", SearchOption.AllDirectories);
                foreach (var filePath in settingFiles)
                {
                    if (Array.IndexOf(IgnoreExtensions, Path.GetExtension(filePath)) >= 0 || filePath.Contains(".svn"))
                    {
                        continue;
                    }
                    var abName        = string.Empty;
                    var directoryName = Path.GetDirectoryName(filePath) ?? "";
                    switch (setting.Op)
                    {
                    case StaticABSetting.Operation.ALL_IN_ONE:
                        abName = FormatPath(setting.Path);
                        break;

                    case StaticABSetting.Operation.STAY_RESOURCES:
                        break;

                    case StaticABSetting.Operation.EACH_FOLDER_ONE:
                        abName = FormatPath(directoryName);
                        break;

                    case StaticABSetting.Operation.EACH_A_AB:
                        abName = FormatPath(Path.Combine(directoryName, Path.GetFileNameWithoutExtension(filePath)));
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    var s    = Array.Find(setting.UnloadStrategies, strategy => strategy.BundleName == abName);
                    var node = AssetNode.GetOrCreate(filePath, abName);
                    // 同名资源处理
                    if (!s_specialAB.ContainsKey(node.AssetName))
                    {
                        s_specialAB.Add(node.AssetName, s?.UnloadStrategy ?? BundleUnloadStrategy.Normal);
                    }

                    if (Path.GetExtension(node.AssetPath) == ".spriteatlas")
                    {
                        var dependencies = AssetDatabase.GetDependencies(node.AssetPath);
                        foreach (var dependency in dependencies)
                        {
                            var depNode = AssetNode.GetOrCreate(dependency, abName);
                            if (Equals(depNode, node))
                            {
                                continue;
                            }

                            if (s_specialAB.ContainsKey(depNode.AssetName))
                            {
                                Debug.LogError($"one sprite in multi atlas : {depNode.AssetName}");
                                continue;
                            }

                            s_specialAB.Add(depNode.AssetName, s?.UnloadStrategy ?? BundleUnloadStrategy.Normal);
                        }
                        node.ForceAddToResourcesNode();
                    }
                }
            }

            var           resourcesFiles = Directory.GetFiles("Assets/Resources", "*", SearchOption.AllDirectories);
            List <string> filteredFiles  = new List <string>(resourcesFiles.Length);

            filteredFiles.AddRange(resourcesFiles.Where(file => !file.Contains(".svn") &&
                                                        Array.IndexOf(IgnoreExtensions, Path.GetExtension(file)) == -1));
            resourcesFiles = filteredFiles.ToArray();
            var otherFiles = new string[abSetting.ExtraDependencyAssets.Length];

            for (var i = 0; i < abSetting.ExtraDependencyAssets.Length; i++)
            {
                var asset = abSetting.ExtraDependencyAssets[i];
                var path  = AssetDatabase.GetAssetPath(asset);
                otherFiles[i] = path;
            }

            foreach (var sceneAsset in abSetting.Scenes)
            {
                if (!sceneAsset)
                {
                    Debug.LogError($"Scene asset is null");
                    continue;
                }
                var scenePath   = AssetDatabase.GetAssetPath(sceneAsset);
                var sceneAbName = scenePath.Substring(0, scenePath.Length - 6).ToLower();
                var sceneNode   = AssetNode.GetOrCreate(scenePath, sceneAbName);
                sceneNode.ForceAddToResourcesNode();
                var dependencies = AssetDatabase.GetDependencies(scenePath, false);
                foreach (var dependency in dependencies)
                {
                    if (Array.IndexOf(IgnoreExtensions, Path.GetExtension(dependency)) >= 0)
                    {
                        continue;
                    }

                    if (!dependency.StartsWith("assets", true, CultureInfo.InvariantCulture))
                    {
                        Debug.LogWarning($"{scenePath} Depend asset : {dependency} is not under Assets folder");
                        continue;
                    }
                    AssetNode.GetOrCreate(dependency, sceneAbName + "_scene");
                }
            }

            resourcesFiles = resourcesFiles.Concat(otherFiles).ToArray();
            EditorUtility.DisplayProgressBar("Process resources asset", "", 0);
            RelationProcess(resourcesFiles);
            AssetCustomProcesses.PostProcess();

            ExportResourcesPackageConf();
        }