// This overload is used by the Build & Run menu item & hot key - prompt for location only if the configured // output location is not valid. static void BuildPlayerAndRun() { var buildTarget = EditorUserBuildSettingsUtils.CalculateSelectedBuildTarget(); var buildLocation = EditorUserBuildSettings.GetBuildLocation(buildTarget); BuildPlayerAndRun(!BuildLocationIsValid(buildLocation)); }
// This overload is used by the Build & Run menu item & hot key - prompt for location only if the configured // output location is not valid. static void BuildPlayerAndRun() { var buildTarget = EditorUserBuildSettingsUtils.CalculateSelectedBuildTarget(); var lastBuildLocation = EditorUserBuildSettings.GetBuildLocation(buildTarget); bool buildLocationIsValid = BuildLocationIsValid(lastBuildLocation); if (buildLocationIsValid && (buildTarget == BuildTarget.StandaloneWindows || buildTarget == BuildTarget.StandaloneWindows64)) { // Case 1208041: Windows Standalone .exe name depends on productName player setting var newBuildLocation = Path.Combine(Path.GetDirectoryName(lastBuildLocation), Paths.MakeValidFileName(PlayerSettings.productName) + ".exe").Replace(Path.DirectorySeparatorChar, '/'); EditorUserBuildSettings.SetBuildLocation(buildTarget, newBuildLocation); } BuildPlayerAndRun(!buildLocationIsValid); }
private static bool PickBuildLocation(BuildTargetGroup targetGroup, BuildTarget target, BuildOptions options, out bool updateExistingBuild) { updateExistingBuild = false; var previousPath = EditorUserBuildSettings.GetBuildLocation(target); string defaultFolder; string defaultName; if (previousPath == String.Empty) { defaultFolder = FileUtil.DeleteLastPathNameComponent(Application.dataPath); defaultName = ""; } else { defaultFolder = FileUtil.DeleteLastPathNameComponent(previousPath); defaultName = FileUtil.GetLastPathNameComponent(previousPath); } string extension = PostprocessBuildPlayer.GetExtensionForBuildTarget(targetGroup, target, options); // Invalidate default name, if extension mismatches the default file (for ex., when switching between folder type export to file type export, see Android) if (extension != Path.GetExtension(defaultName).Replace(".", "")) { defaultName = string.Empty; } // Hack: For Windows Standalone, we want the BuildPanel to choose a folder, // but we don't want BuildPlayer to take a folder path because historically it took an .exe path // and we would be breaking tons of projects! bool isWindowsStandalone = target == BuildTarget.StandaloneWindows || target == BuildTarget.StandaloneWindows64; string realExtension = extension; if (isWindowsStandalone) { extension = string.Empty; // Remove the filename.exe part from the path if (!string.IsNullOrEmpty(defaultName)) { defaultName = Path.GetDirectoryName(defaultName); } } string title = "Build " + BuildPlatforms.instance.GetBuildTargetDisplayName(targetGroup, target); string path = EditorUtility.SaveBuildPanel(target, title, defaultFolder, defaultName, extension, out updateExistingBuild); if (path == string.Empty) { return(false); } if (isWindowsStandalone) { extension = realExtension; path = Path.Combine(path, Paths.MakeValidFileName(PlayerSettings.productName) + '.' + extension); } if (!IsBuildPathValid(path)) { return(false); } // Enforce extension if needed if (extension != string.Empty && FileUtil.GetPathExtension(path).ToLower() != extension) { path += '.' + extension; } // A path may not be empty initially, but it could contain, e.g., a drive letter (as in Windows), // so even appending an extension will work fine, but in reality the name will be, for example, // G:/ //Debug.Log(path); string currentlyChosenName = FileUtil.GetLastPathNameComponent(path); if (currentlyChosenName == string.Empty) { return(false); // No nameless projects, please } // We don't want to re-create a directory that already exists, this may // result in access-denials that will make users unhappy. string check_dir = extension != string.Empty ? FileUtil.DeleteLastPathNameComponent(path) : path; if (!Directory.Exists(check_dir)) { Directory.CreateDirectory(check_dir); } // On OSX we've got replace/update dialog, for other platforms warn about deleting // files in target folder. if ((target == BuildTarget.iOS) && (Application.platform != RuntimePlatform.OSXEditor)) { if (!FolderIsEmpty(path) && !UserWantsToDeleteFiles(path)) { return(false); } } EditorUserBuildSettings.SetBuildLocation(target, path); return(true); }
internal static BuildPlayerOptions GetBuildPlayerOptionsInternal(bool askForBuildLocation, BuildPlayerOptions defaultBuildPlayerOptions) { var options = defaultBuildPlayerOptions; bool updateExistingBuild = false; BuildTarget buildTarget = EditorUserBuildSettingsUtils.CalculateSelectedBuildTarget(); BuildTargetGroup buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; // Pick location for the build string newLocation = ""; //Check if Lz4 is supported for the current buildtargetgroup and enable it if need be if (PostprocessBuildPlayer.SupportsLz4Compression(buildTargetGroup, buildTarget)) { if (EditorUserBuildSettings.GetCompressionType(buildTargetGroup) == Compression.Lz4) { options.options |= BuildOptions.CompressWithLz4; } else if (EditorUserBuildSettings.GetCompressionType(buildTargetGroup) == Compression.Lz4HC) { options.options |= BuildOptions.CompressWithLz4HC; } } bool developmentBuild = EditorUserBuildSettings.development; if (developmentBuild) { options.options |= BuildOptions.Development; } if (EditorUserBuildSettings.datalessPlayer && developmentBuild) { options.options |= BuildOptionsExperimental.DatalessPlayer; } if (EditorUserBuildSettings.allowDebugging && developmentBuild) { options.options |= BuildOptions.AllowDebugging; } if (EditorUserBuildSettings.symlinkLibraries) { options.options |= BuildOptions.SymlinkLibraries; } if (EditorUserBuildSettings.enableHeadlessMode) { options.options |= BuildOptions.EnableHeadlessMode; } if (EditorUserBuildSettings.connectProfiler && (developmentBuild || buildTarget == BuildTarget.WSAPlayer)) { options.options |= BuildOptions.ConnectWithProfiler; } if (EditorUserBuildSettings.buildScriptsOnly) { options.options |= BuildOptions.BuildScriptsOnly; } if (IsInstallInBuildFolderOption()) { options.options |= BuildOptions.InstallInBuildFolder; } else { if (askForBuildLocation && !PickBuildLocation(buildTargetGroup, buildTarget, options.options, out updateExistingBuild)) { throw new BuildMethodException(); } newLocation = EditorUserBuildSettings.GetBuildLocation(buildTarget); if (newLocation.Length == 0) { throw new BuildMethodException("Build location for buildTarget " + buildTarget.ToString() + "is not valid."); } if (!askForBuildLocation) { switch (UnityEditorInternal.InternalEditorUtility.BuildCanBeAppended(buildTarget, newLocation)) { case CanAppendBuild.Unsupported: break; case CanAppendBuild.Yes: updateExistingBuild = true; break; case CanAppendBuild.No: if (!PickBuildLocation(buildTargetGroup, buildTarget, options.options, out updateExistingBuild)) { throw new BuildMethodException(); } newLocation = EditorUserBuildSettings.GetBuildLocation(buildTarget); if (!BuildLocationIsValid(newLocation)) { throw new BuildMethodException("Build location for buildTarget " + buildTarget.ToString() + "is not valid."); } break; } } } if (updateExistingBuild) { options.options |= BuildOptions.AcceptExternalModificationsToPlayer; } options.target = buildTarget; options.targetGroup = buildTargetGroup; options.locationPathName = EditorUserBuildSettings.GetBuildLocation(buildTarget); options.assetBundleManifestPath = null; // Build a list of scenes that are enabled ArrayList scenesList = new ArrayList(); EditorBuildSettingsScene[] editorScenes = EditorBuildSettings.scenes; foreach (EditorBuildSettingsScene scene in editorScenes) { if (scene.enabled) { scenesList.Add(scene.path); } } options.scenes = scenesList.ToArray(typeof(string)) as string[]; return(options); }