Example #1
0
        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.");
        }
Example #2
0
        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.");
        }