static void SetupAssetdatabaseUsage()
        {
            s_EditorBuildSettings = AssetbundleBuildSettings.EditorInstance;
            if (s_EditorBuildSettings == null || !s_EditorBuildSettings.IsValid())
            {
                throw new System.Exception("AssetbundleBuildSetting is not valid");
            }

            if (s_EditorBuildSettings.CleanCacheInEditor)
            {
                Caching.ClearCache();
            }

            UseAssetDatabase = !s_EditorBuildSettings.EmulateInEditor;

            if (UseAssetDatabase)
            {
                var assetPath = new List <string>();
                var loadPath  = new List <string>();
                foreach (var setting in s_EditorBuildSettings.BundleSettings)
                {
                    assetPath.Clear();
                    loadPath.Clear();

                    var folderPath = UnityEditor.AssetDatabase.GUIDToAssetPath(setting.Folder.guid);
                    var dir        = new DirectoryInfo(Path.Combine(Application.dataPath, folderPath.Remove(0, 7)));
                    AssetbundleBuildSettings.GetFilesInDirectory(string.Empty, assetPath, loadPath, dir, setting.IncludeSubfolder);
                    var assetList = new Dictionary <string, List <string> >();
                    for (int i = 0; i < assetPath.Count; i++)
                    {
                        if (assetList.TryGetValue(loadPath[i], out var list))
                        {
                            list.Add(assetPath[i]);
                            continue;
                        }

                        assetList.Add(loadPath[i], new List <string>()
                        {
                            assetPath[i]
                        });
                    }

                    s_AssetListForEditor.Add(setting.BundleName, assetList);
                }
            }
        }
Esempio n. 2
0
        public static void BuildAssetBundles(AssetbundleBuildSettings settings, BuildType buildType)
        {
            var bundleList = new List <AssetBundleBuild>();

            foreach (var setting in settings.BundleSettings)
            {
                var folderPath = AssetDatabase.GUIDToAssetPath(setting.Folder.guid);
                var dir        = new DirectoryInfo(Path.Combine(Application.dataPath, folderPath.Remove(0, 7)));
                if (!dir.Exists)
                {
                    throw new Exception($"Could not found Path {folderPath} for {setting.BundleName}");
                }
                var assetPathes = new List <string>();
                var loadPathes  = new List <string>();
                AssetbundleBuildSettings.GetFilesInDirectory(string.Empty, assetPathes, loadPathes, dir, setting.IncludeSubfolder);
                if (assetPathes.Count == 0)
                {
                    Debug.LogWarning($"Could not found Any Assets {folderPath} for {setting.BundleName}");
                }
                var newBundle = new AssetBundleBuild();
                newBundle.assetBundleName  = setting.BundleName;
                newBundle.assetNames       = assetPathes.ToArray();
                newBundle.addressableNames = loadPathes.ToArray();
                bundleList.Add(newBundle);
            }

            var buildTarget = EditorUserBuildSettings.activeBuildTarget;
            var groupTarget = BuildPipeline.GetBuildTargetGroup(buildTarget);

            var outputPath  = Path.Combine(buildType == BuildType.Local ? settings.LocalOutputPath : settings.RemoteOutputPath, buildTarget.ToString());
            var buildParams = new CustomBuildParameters(settings, buildTarget, groupTarget, outputPath, buildType == BuildType.Local);

            buildParams.UseCache = !settings.ForceRebuild;

            if (buildParams.UseCache && settings.UseCacheServer)
            {
                buildParams.CacheServerHost = settings.CacheServerHost;
                buildParams.CacheServerPort = settings.CacheServerPort;
            }

            s_CurrentBuildingSettings = settings;
            s_CurrentBuildType        = buildType;
            ContentPipeline.BuildCallbacks.PostPackingCallback += PostPackingForSelectiveBuild;
            var returnCode = ContentPipeline.BuildAssetBundles(buildParams, new BundleBuildContent(bundleList.ToArray()), out var results);

            ContentPipeline.BuildCallbacks.PostPackingCallback -= PostPackingForSelectiveBuild;

            if (buildType == BuildType.Dry)
            {
                EditorUtility.DisplayDialog("Build Succeeded!", "Dry bundle build succeeded!", "Confirm");
                return;
            }

            if (returnCode == ReturnCode.Success)
            {
                WriteManifestFile(outputPath, results, buildTarget, settings.RemoteURL);
                WriteLogFile(outputPath, results);
                //only remote bundle build generates link.xml

                switch (buildType)
                {
                case BuildType.Local:
                    EditorUtility.DisplayDialog("Build Succeeded!", "Local bundle build succeeded!", "Confirm");
                    break;

                case BuildType.Remote:
                    var linkPath = TypeLinkerGenerator.Generate(settings, results);
                    EditorUtility.DisplayDialog("Build Succeeded!", $"Remote bundle build succeeded, \n {linkPath} updated!", "Confirm");
                    break;

                case BuildType.Dry:
                    EditorUtility.DisplayDialog("Build Succeeded!", $"Dry bundle build succeeded", "Confirm");
                    break;
                }
            }
            else
            {
                EditorUtility.DisplayDialog("Build Failed!", $"Bundle build failed, \n Code : {returnCode}", "Confirm");
                Debug.LogError(returnCode);
            }
        }