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 }); }
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); }
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); }