void UpdateHeader()
 {
     gameTitle = ShareUtils.GetFilteredGameTitle(gameTitle);
     SetupLabel("lblProjectName", gameTitle, rootVisualElement, new ShareUtils.LeftClickManipulator(OnProjectLinkClicked));
     SetupLabel("lblUserEmail", string.Format("By {0}", CloudProjectSettings.userName));
     SetupImage("imgThumbnail", ShareUtils.GetThumbnailPath());
 }
        void OnDeleteClicked(string buildPath, string gameTitle)
        {
            if (!Directory.Exists(buildPath))
            {
                Store.Dispatch(new OnErrorAction()
                {
                    errorMsg = "Build folder not found"
                });
                return;
            }

            switch (ShowDeleteBuildPopup(gameTitle))
            {
            case 0:     // Yes
                AnalyticsHelper.ButtonClicked(string.Format("{0}_Delete_RemoveFromList", currentTab));
                ShareUtils.RemoveBuildDirectory(buildPath);
                SetupUploadTab();
                break;

            case 1: break; // Cancel

            case 2:        // Yes and delete
                AnalyticsHelper.ButtonClicked(string.Format("{0}_Delete_RemoveBuildFiles", currentTab));
                ShareUtils.RemoveBuildDirectory(buildPath);
                Directory.Delete(buildPath, true);
                SetupUploadTab();
                break;
            }
        }
        void OnLocateBuildClicked()
        {
            AnalyticsHelper.ButtonClicked(string.Format("{0}_LocateBuild", currentTab));
            string previousBuildPath = ShareUtils.GetFirstValidBuildPath();
            string buildPath         = EditorUtility.OpenFolderPanel("Choose folder", string.IsNullOrEmpty(previousBuildPath) ? Application.persistentDataPath : previousBuildPath, string.Empty);

            if (string.IsNullOrEmpty(buildPath))
            {
                return;
            }
            if (!ShareUtils.BuildIsValid(buildPath))
            {
                Store.Dispatch(new OnErrorAction()
                {
                    errorMsg = "This build is corrupted or missing, please delete it and choose another one to share"
                });
                return;
            }
            ShareUtils.AddBuildDirectory(buildPath);
            if (currentTab != TAB_UPLOAD)
            {
                return;
            }
            SetupUploadTab();
        }
        private static void ZipAndShare(string title, string buildPath, Store <AppState> store)
        {
            store.Dispatch(new TitleChangeAction {
                title = title
            });

            if (!ShareUtils.BuildIsValid(buildPath))
            {
                store.Dispatch(new OnErrorAction {
                    errorMsg = "Please build project first!"
                });
                return;
            }

            if (!Zip(store, buildPath))
            {
                return;
            }
            string GUIDPath = Path.Combine(buildPath, "GUID.txt");

            if (File.Exists(GUIDPath))
            {
                store.Dispatch(new UploadStartAction()
                {
                    buildGUID = File.ReadAllText(GUIDPath)
                });
                return;
            }
            Debug.LogWarningFormat("Missing GUID file for {0}, consider deleting the build and making a new one through the WebGL Publisher", buildPath);
            store.Dispatch(new UploadStartAction()
            {
                buildGUID = UndefinedGUID
            });
        }
        void SetupUploadTab()
        {
            List <string> existingBuildsPaths = ShareUtils.GetAllBuildsDirectories();
            VisualElement buildsList          = rootVisualElement.Query <VisualElement>("buildsList");

            buildsList.contentContainer.Clear();

            VisualTreeAsset containerTemplate = LoadUXML("BuildContainerTemplate");
            VisualElement   containerInstance;

            for (int i = 0; i < ShareUtils.MAX_DISPLAYED_BUILDS; i++)
            {
                containerInstance = containerTemplate.CloneTree().Q("buildContainer");
                SetupBuildContainer(containerInstance, existingBuildsPaths[i]);
                buildsList.contentContainer.Add(containerInstance);
            }

            SetupButton("btnNewBuild", OnCreateABuildClicked, true);

            ToolbarMenu helpMenu = rootVisualElement.Q <ToolbarMenu>("menuHelp");

            helpMenu.menu.AppendAction("Open Build Settings...", a => { OnOpenBuildSettingsClicked(); }, a => DropdownMenuAction.Status.Normal);
            helpMenu.menu.AppendAction("Locate Build...", a => { OnLocateBuildClicked(); }, a => DropdownMenuAction.Status.Normal);
            helpMenu.menu.AppendAction("WebGL Build Tutorial", a => { OnOpenHelpClicked(); }, a => DropdownMenuAction.Status.Normal);

            //hide the dropdown arrow
            IEnumerator <VisualElement> helpMenuChildrenEnumerator = helpMenu.Children().GetEnumerator();

            helpMenuChildrenEnumerator.MoveNext(); //get to the label (to ignore)
            helpMenuChildrenEnumerator.MoveNext(); //get to the dropdown arrow (to hide)
            helpMenuChildrenEnumerator.Current.visible = false;
        }
        /// <summary>
        /// Called right after a build process ends
        /// </summary>
        /// <param name="report">A summary of the build process</param>
        public void OnPostprocessBuild(BuildReport report)
        {
            BuildSummary summary = report.summary;

            if (summary.platform != BuildTarget.WebGL)
            {
                return;
            }

            string buildOutputDir = summary.outputPath;
            string buildGUID      = summary.guid.ToString();

            ShareUtils.AddBuildDirectory(buildOutputDir);

            ShareWindow windowInstance = ShareWindow.FindInstance();

            windowInstance?.Store.Dispatch(new BuildFinishAction
            {
                outputDir = buildOutputDir,
                buildGUID = buildGUID
            });

            WriteMetadataFile(summary.outputPath, buildGUID);
            windowInstance?.OnBuildCompleted();
        }
        /// <summary>
        /// Triggers the "Build Game" dialog
        /// </summary>
        /// <returns>True and the build path if everything goes well and the build is done, false and empty string otherwise.</returns>
        public static (bool, string) OpenBuildGameDialog(BuildTarget activeBuildTarget)
        {
            string path = string.Empty;

            try
            {
                string defaultOutputDirectory = ShareUtils.GetFirstValidBuildPath();
                if (string.IsNullOrEmpty(defaultOutputDirectory) && CreateDefaultBuildsFolder)
                {
                    defaultOutputDirectory = DefaultBuildsFolderPath;
                    if (!Directory.Exists(defaultOutputDirectory))
                    {
                        Directory.CreateDirectory(defaultOutputDirectory);
                    }
                }

                path = EditorUtility.SaveFolderPanel("Choose Folder for New WebGL Build", defaultOutputDirectory, "");

                if (string.IsNullOrEmpty(path))
                {
                    return(false, string.Empty);
                }

                BuildPlayerOptions buildOptions = new BuildPlayerOptions();
                buildOptions.scenes           = EditorBuildSettingsScene.GetActiveSceneList(EditorBuildSettings.scenes);
                buildOptions.locationPathName = path;
                buildOptions.options          = BuildOptions.None;
                buildOptions.targetGroup      = BuildPipeline.GetBuildTargetGroup(activeBuildTarget);
                buildOptions.target           = activeBuildTarget;

                buildStartedFromTool = true;
                BuildReport report = BuildPipeline.BuildPlayer(buildOptions);
                buildStartedFromTool = false;

                AnalyticsHelper.BuildCompleted(report.summary.result, report.summary.totalTime);
                switch (report.summary.result)
                {
                case BuildResult.Cancelled:  //Debug.LogWarning("[Version and Build] Build cancelled! " + report.summary.totalTime);
                case BuildResult.Failed:     //Debug.LogError("[Version and Build] Build failed! " + report.summary.totalTime);
                    return(false, string.Empty);

                case BuildResult.Succeeded:   //Debug.Log("[Version and Build] Build succeeded! " + report.summary.totalTime);
                case BuildResult.Unknown:     //Debug.Log("[Version and Build] Unknown build result! " + report.summary.totalTime);
                    break;
                }
            }
            catch (BuildPlayerWindow.BuildMethodException /*e*/)
            {
                //Debug.LogError(e.Message);
                return(false, string.Empty);
            }
            return(true, path);
        }
        private static void CopyThumbnail(string buildOutputDir, Store <AppState> store)
        {
            string thumbnailDestPath = Path.Combine(buildOutputDir, thumbnail);

            File.Delete(thumbnailDestPath);

            string thumbnailDir = ShareUtils.GetThumbnailPath();

            if (string.IsNullOrEmpty(thumbnailDir) || !File.Exists(thumbnailDir))
            {
                return;
            }

            FileUtil.CopyFileOrDirectory(thumbnailDir, thumbnailDestPath);
        }
        void OnShareClicked(string gameBuildPath)
        {
            AnalyticsHelper.ButtonClicked(string.Format("{0}_Publish", currentTab));
            if (!ShareUtils.BuildIsValid(gameBuildPath))
            {
                Store.Dispatch(new OnErrorAction()
                {
                    errorMsg = "This build is corrupted or missing, please delete it and choose another one to publish"
                });
                return;
            }

            Store.Dispatch(new ShareStartAction()
            {
                title = gameTitle, buildPath = gameBuildPath
            });
        }
Пример #10
0
        void OnDeleteClicked(string buildPath, string gameTitle)
        {
            if (!Directory.Exists(buildPath))
            {
                Store.Dispatch(new OnErrorAction()
                {
                    errorMsg = "Build folder not found"
                });
                return;
            }

            if (ShowDeleteBuildPopup(gameTitle))
            {
                AnalyticsHelper.ButtonClicked(string.Format("{0}_Delete_RemoveFromList", currentTab));
                ShareUtils.RemoveBuildDirectory(buildPath);
                SetupUploadTab();
            }
        }
        void SetupBuildContainer(VisualElement container, string buildPath)
        {
            if (ShareUtils.BuildIsValid(buildPath))
            {
                string gameTitle = buildPath.Split('/').Last();
                SetupButton("btnOpenFolder", () => OnOpenBuildFolderClicked(buildPath), true, container, "Reveal Build Folder");
                SetupButton("btnDelete", () => OnDeleteClicked(buildPath, gameTitle), true, container, "Delete Build");
                SetupButton("btnShare", () => OnShareClicked(buildPath), true, container, "Publish WebGL Build to Unity Connect");
                SetupLabel("lblLastBuildInfo", string.Format("Created: {0} with Unity {1}", File.GetLastWriteTime(buildPath), ShareUtils.GetUnityVersionOfBuild(buildPath)), container);
                SetupLabel("lblGameTitle", gameTitle, container);
                SetupLabel("lblBuildSize", string.Format("Build Size: {0}", ShareUtils.FormatBytes(ShareUtils.GetSizeFolderSize(buildPath))), container);
                container.style.display = DisplayStyle.Flex;
                return;
            }

            SetupButton("btnOpenFolder", null, false, container);
            SetupButton("btnDelete", null, false, container);
            SetupButton("btnShare", null, false, container);
            SetupLabel("lblGameTitle", "-", container);
            SetupLabel("lblLastBuildInfo", "-", container);
            container.style.display = DisplayStyle.None;
        }
        private static bool Zip(Store <AppState> store, string buildOutputDir)
        {
            var projectDir = Directory.GetParent(Application.dataPath).FullName;
            var destPath   = Path.Combine(projectDir, zipName);

            File.Delete(destPath);

            CopyThumbnail(buildOutputDir, store);

            ZipFile.CreateFromDirectory(buildOutputDir, destPath);
            FileInfo fileInfo = new FileInfo(destPath);

            if (fileInfo.Length > ZipFileLimitBytes)
            {
                store.Dispatch(new OnErrorAction {
                    errorMsg = $"Max. allowed WebGL game .zip size is {ShareUtils.FormatBytes(ZipFileLimitBytes)}."
                });
                return(false);
            }
            store.Dispatch(new ZipPathChangeAction {
                zipPath = destPath
            });
            return(true);
        }
Пример #13
0
        void OnLocateBuildClicked()
        {
            AnalyticsHelper.ButtonClicked(string.Format("{0}_LocateBuild", currentTab));

            string lastBuildPath = ShareUtils.GetFirstValidBuildPath();

            if (string.IsNullOrEmpty(lastBuildPath) && ShareBuildProcessor.CreateDefaultBuildsFolder)
            {
                lastBuildPath = ShareBuildProcessor.DefaultBuildsFolderPath;
                if (!Directory.Exists(lastBuildPath))
                {
                    Directory.CreateDirectory(lastBuildPath);
                }
            }

            string buildPath = EditorUtility.OpenFolderPanel("Choose folder", lastBuildPath, string.Empty);

            if (string.IsNullOrEmpty(buildPath))
            {
                return;
            }
            if (!ShareUtils.BuildIsValid(buildPath))
            {
                Store.Dispatch(new OnErrorAction()
                {
                    errorMsg = "This build is corrupted or missing, please delete it and choose another one to share"
                });
                return;
            }
            ShareUtils.AddBuildDirectory(buildPath);
            if (currentTab != TAB_UPLOAD)
            {
                return;
            }
            SetupUploadTab();
        }
        void RebuildFrontend()
        {
            if (!string.IsNullOrEmpty(Store.state.errorMsg))
            {
                LoadTab(TAB_ERROR);
                return;
            }

            if (openedForTheFirstTime.value)
            {
                LoadTab(TAB_INTRODUCTION);
                return;
            }

            if (currentShareStep != Store.state.step)
            {
                currentShareStep = Store.state.step;
            }

            bool loggedOut = (currentShareStep == ShareStep.Login);

            if (loggedOut)
            {
                LoadTab(TAB_NOT_LOGGED_IN);
                return;
            }

            if (!webGLIsInstalled)
            {
                UpdateWebGLInstalledFlag();
                LoadTab(TAB_INSTALL_WEBGL);
                return;
            }

            if (!ShareUtils.ValidBuildExists())
            {
                LoadTab(TAB_NO_BUILD);
                return;
            }

            if (!string.IsNullOrEmpty(Store.state.url))
            {
                LoadTab(TAB_SUCCESS);
                return;
            }


            if (currentShareStep == ShareStep.Upload)
            {
                LoadTab(TAB_UPLOADING);
                return;
            }

            if (currentShareStep == ShareStep.Process)
            {
                LoadTab(TAB_PROCESSING);
                return;
            }

            LoadTab(TAB_UPLOAD);
        }