public static IEnumerator PackageWorlds(int packageMode, int releaseChannel, bool allWorlds, bool allTargets, bool force = false, bool linuxOnly = false) { uploadPossible = false; packagingInProgress = true; packagingSuccessful = false; try { string[] worldsToBuild = allWorlds ? GetWorldPaths() : GetWorldsToBuild(packageMode); if (worldsToBuild.Length == 0) { yield break; } string resultFolder = Application.dataPath + "/../traVRsal/"; BuildTarget mainTarget = linuxOnly || Application.platform == RuntimePlatform.LinuxEditor ? BuildTarget.StandaloneLinux64 : BuildTarget.StandaloneWindows64; CreateLockFile(); ConvertTileMaps(); CreateAddressableSettings(!allTargets, releaseChannel); EditorUserBuildSettings.androidBuildSubtarget = MobileTextureSubtarget.ASTC; EditorUserBuildSettings.selectedStandaloneTarget = mainTarget; PlayerSettings.SetScriptingBackend(BuildTargetGroup.Standalone, ScriptingImplementation.Mono2x); // Linux can only be built with Mono on Windows AddressableAssetSettings.CleanPlayerContent(); AssetDatabase.SaveAssets(); if (Directory.Exists(GetServerDataPath()) && (packageMode == 0 || allWorlds)) { Directory.Delete(GetServerDataPath(), true); } // set build targets List <Tuple <BuildTargetGroup, BuildTarget> > targets = new List <Tuple <BuildTargetGroup, BuildTarget> >(); if (allTargets) { targets.Add(new Tuple <BuildTargetGroup, BuildTarget>(BuildTargetGroup.Android, BuildTarget.Android)); // set windows/linux last so that we can continue with editor iterations normally right afterwards if (Application.platform == RuntimePlatform.LinuxEditor) { targets.Add(new Tuple <BuildTargetGroup, BuildTarget>(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64)); targets.Add(new Tuple <BuildTargetGroup, BuildTarget>(BuildTargetGroup.Standalone, BuildTarget.StandaloneLinux64)); } else { if (linuxSupport) { targets.Add(new Tuple <BuildTargetGroup, BuildTarget>(BuildTargetGroup.Standalone, BuildTarget.StandaloneLinux64)); } targets.Add(new Tuple <BuildTargetGroup, BuildTarget>(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64)); } } else { targets.Add(new Tuple <BuildTargetGroup, BuildTarget>(BuildTargetGroup.Standalone, mainTarget)); } // update world content foreach (string dir in worldsToBuild) { string worldName = Path.GetFileName(dir); if (!UpdateWorldData(worldName)) { yield break; } } // iterate over all supported platforms foreach (Tuple <BuildTargetGroup, BuildTarget> target in targets) { EditorUserBuildSettings.SwitchActiveBuildTarget(target.Item1, target.Item2); // build each world individually AddressableAssetSettings settings = AddressableAssetSettingsDefaultObject.GetSettings(true); foreach (string dir in worldsToBuild) { string worldName = Path.GetFileName(dir); string serverDir = GetServerDataPath() + "/Worlds/" + Path.GetFileName(dir); if (!allTargets && Directory.Exists(resultFolder + worldName)) { Directory.Delete(resultFolder + worldName, true); } if (packageMode == 1 && !allWorlds && Directory.Exists(serverDir)) { Directory.Delete(serverDir, true); } settings.activeProfileId = settings.profileSettings.GetProfileId(worldName); settings.groups.ForEach(group => { if (group.ReadOnly) { return; } group.GetSchema <BundledAssetGroupSchema>().IncludeInBuild = group.name == worldName; // default group ensures there is no accidental local default group resulting in local paths being baked into addressable for shaders if (group.name == worldName && group.CanBeSetAsDefault()) { settings.DefaultGroup = group; } }); BundledAssetGroupSchema schema = settings.groups.First(group => @group.name == worldName).GetSchema <BundledAssetGroupSchema>(); settings.RemoteCatalogBuildPath = schema.BuildPath; settings.RemoteCatalogLoadPath = schema.LoadPath; settings.ShaderBundleCustomNaming = worldName; AddressableAssetSettings.BuildPlayerContent(); } } CreateAddressableSettings(!allTargets, releaseChannel); // do again to have clean build state, as some settings were messed with while building RenameCatalogs(); packagingSuccessful = true; } catch (Exception e) { packagingInProgress = false; EditorUtility.DisplayDialog("Error", $"Packaging could not be completed. Error: {e.Message}", "Close"); yield break; } if (dirWatcher != null) { dirWatcher.ClearAffected(); // only do at end, since during build might cause false positives } else { CreateDirWatcher(); // can happen after initial project creation } RemoveLockFile(); packagingInProgress = false; Debug.Log("Packaging completed successfully."); }
private IEnumerator PackageLevels(bool allLevels, bool allTargets) { uploadPossible = false; packagingInProgress = true; packagingSuccessful = false; try { string[] levelsToBuild = allLevels ? GetLevelPaths() : GetLevelsToBuild(); if (levelsToBuild.Length == 0) { yield break; } CreateLockFile(); ConvertTileMaps(); CreateAddressableSettings(!allTargets); EditorUserBuildSettings.androidBuildSubtarget = MobileTextureSubtarget.Generic; // FIXME: ASTC resulting in pink shaders as of 2019.4+ EditorUserBuildSettings.selectedStandaloneTarget = BuildTarget.StandaloneWindows64; AddressableAssetSettings.CleanPlayerContent(); if (Directory.Exists(GetServerDataPath()) && (packageMode == 0 || allLevels)) { Directory.Delete(GetServerDataPath(), true); } // set build targets List <BuildTarget> targets = new List <BuildTarget>(); if (!debugMode) { targets.Add(BuildTarget.Android); } targets.Add(BuildTarget.StandaloneWindows64); // set windows last so that we can continue with editor iterations normally right afterwards // build each level individually AddressableAssetSettings settings = AddressableAssetSettingsDefaultObject.GetSettings(true); foreach (string dir in levelsToBuild) { string levelName = Path.GetFileName(dir); string serverDir = GetServerDataPath() + "/Levels/" + Path.GetFileName(dir); if (packageMode == 1 && !allLevels && Directory.Exists(serverDir)) { Directory.Delete(serverDir, true); } settings.activeProfileId = settings.profileSettings.GetProfileId(levelName); settings.groups.ForEach(group => { if (group.ReadOnly) { return; } group.GetSchema <BundledAssetGroupSchema>().IncludeInBuild = group.name == levelName; }); BundledAssetGroupSchema schema = settings.groups.Where(group => group.name == levelName).First().GetSchema <BundledAssetGroupSchema>(); settings.RemoteCatalogBuildPath = schema.BuildPath; settings.RemoteCatalogLoadPath = schema.LoadPath; if (allTargets) { // iterate over all supported platforms foreach (BuildTarget target in targets) { EditorUserBuildSettings.SwitchActiveBuildTarget(target); AddressableAssetSettings.BuildPlayerContent(); } } else { // build only for currently active target AddressableAssetSettings.BuildPlayerContent(); } } CreateAddressableSettings(!allTargets); // do again to have clean build state, as some settings were messed with while building RenameCatalogs(); packagingSuccessful = true; } catch (Exception e) { packagingInProgress = false; EditorUtility.DisplayDialog("Error", "Packaging could not be completed. Error: " + e.Message, "Close"); yield break; } dirWatcher.ClearAffected(); // only do at end, since during build might cause false positives RemoveLockFile(); packagingInProgress = false; Debug.Log("Packaging completed successfully."); }