public static void Execute(UnityEditor.BuildTarget target) { string platform = target.ToString(); Execute(platform); AssetDatabase.Refresh(); }
void IncrementalGUI() { //增量包按钮 GUILayout.Label("增量包:"); GUILayout.BeginHorizontal(); GUILayout.Space(80); if (GUILayout.Button("一键打包: [增量]资源包", GUILayout.Width(300), GUILayout.Height(30))) { //开始打包 CreateAssetBundle_Editor.Execute(buildTarget); //生成hash CreateHashList.StartLoad((bool issuccess) => { EditorUtility.DisplayDialog("", "打包成功", "OK"); }); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(80); if (GUILayout.Button("生成服务端增量文件", GUILayout.Width(300), GUILayout.Height(30))) { mEditorVersion = new VersionCtrl_Editor(); mEditorVersion.mResServerAddress = "http://api-resource.ptdev.cn/v1/res"; //获取上个版本的hash string platform = AssetBundleCtrl_Windows.GetPlatformName(buildTarget); string newVersionHash = System.IO.Path.Combine(Application.dataPath, "AssetBundle/" + platform + "/VersionNum/VersionHash-old.xml"); //将服务器的hash写到本地 mEditorVersion.Start("3", "100", "V0uFhE2GRNnRipS0hery9OhY", newVersionHash, (bool issuccess) => { if (issuccess) { mTaskQue.Enqueue(() => { CreateVersionUpdateList.Execute(buildTarget); EditorUtility.DisplayDialog("", "生成成功", "OK"); }); } else { mTaskQue.Enqueue(() => { EditorUtility.DisplayDialog("", "生成失败", "OK"); }); } }); } if (mTaskQue.Count > 0) { var action = mTaskQue.Dequeue(); action(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(80); if (GUILayout.Button("一键导出", GUILayout.Width(300), GUILayout.Height(30))) { var outpath = EditorUtility.OpenFolderPanel("选择导出文件夹", "", ""); if (outpath != null && outpath != "") { CreateVersionUpdateList.ExportFile(buildTarget, outpath); EditorUtility.DisplayDialog("", buildTarget.ToString() + "- 导出到" + outpath + "成功", "OK"); } } GUILayout.EndHorizontal(); }
/** * from build target to human friendly string for display purpose. */ public static string TargetToHumaneString(UnityEditor.BuildTarget t) { switch (t) { case BuildTarget.Android: return("Android"); case BuildTarget.iOS: return("iOS"); case BuildTarget.PS4: return("PlayStation 4"); case BuildTarget.PSM: return("PlayStation Mobile"); case BuildTarget.PSP2: return("PlayStation Vita"); case BuildTarget.SamsungTV: return("Samsung TV"); case BuildTarget.StandaloneLinux: return("Linux Standalone"); case BuildTarget.StandaloneLinux64: return("Linux Standalone(64-bit)"); case BuildTarget.StandaloneLinuxUniversal: return("Linux Standalone(Universal)"); case BuildTarget.StandaloneOSXIntel: return("OSX Standalone"); case BuildTarget.StandaloneOSXIntel64: return("OSX Standalone(64-bit)"); case BuildTarget.StandaloneOSXUniversal: return("OSX Standalone(Universal)"); case BuildTarget.StandaloneWindows: return("Windows Standalone"); case BuildTarget.StandaloneWindows64: return("Windows Standalone(64-bit)"); case BuildTarget.Tizen: return("Tizen"); case BuildTarget.tvOS: return("tvOS"); case BuildTarget.WebGL: return("WebGL"); case BuildTarget.WiiU: return("Wii U"); case BuildTarget.WSAPlayer: return("Windows Store Apps"); case BuildTarget.XboxOne: return("Xbox One"); #if !UNITY_5_5_OR_NEWER case BuildTarget.Nintendo3DS: return("Nintendo 3DS"); case BuildTarget.PS3: return("PlayStation 3"); case BuildTarget.XBOX360: return("Xbox 360"); #endif default: return(t.ToString() + "(deprecated)"); } }
/// <summary> /// Get platform folder /// </summary> /// <param name="platform"></param> /// <returns>each platform folder</returns> public static string GetPlatformFolder(UnityEditor.BuildTarget platform) { switch (platform) { case BuildTarget.StandaloneOSXUniversal: case BuildTarget.StandaloneOSXIntel: return("Standalone"); case BuildTarget.StandaloneWindows: return("Standalone"); #if UNITY_5 case BuildTarget.WebGL: #endif #if !UNITY_5_5_OR_NEWER case BuildTarget.WebPlayer: case BuildTarget.WebPlayerStreamed: #endif return("WebPlayer"); #if UNITY_5 case BuildTarget.iOS: #else case BuildTarget.iPhone: #endif return("iPhone"); #if !UNITY_5_5_OR_NEWER case BuildTarget.PS3: return("PS3"); case BuildTarget.XBOX360: return("XBOX360"); #endif case BuildTarget.Android: return("Android"); #if !UNITY_5 case BuildTarget.StandaloneGLESEmu: case BuildTarget.NaCl: break; case BuildTarget.FlashPlayer: return("Flash"); #endif case BuildTarget.StandaloneLinux: case BuildTarget.StandaloneWindows64: #if UNITY_5 case BuildTarget.WSAPlayer: #else case BuildTarget.MetroPlayer: case BuildTarget.WP8Player: #endif case BuildTarget.StandaloneLinux64: case BuildTarget.StandaloneLinuxUniversal: case BuildTarget.StandaloneOSXIntel64: return("Standalone"); #if UNITY_4_5 || UNITY_5 #if !UNITY_5_4_OR_NEWER case BuildTarget.BlackBerry: #endif //case BuildTarget.BB10: case BuildTarget.Tizen: case BuildTarget.PSP2: case BuildTarget.PS4: return("PS4"); case BuildTarget.PSM: return("PSM"); case BuildTarget.XboxOne: return("XboxOne"); case BuildTarget.SamsungTV: break; #endif } return(platform.ToString()); }
public static bool CheckPlatform(UnityEditor.BuildTarget target) { if (EditorUserBuildSettings.activeBuildTarget != target) { EditorUtility.DisplayDialog("Target platform isn't the same as Active platform.\nPlease switch to the target platform firstly.", "Current platform : " + EditorUserBuildSettings.activeBuildTarget + "\nTarget platform : " + target.ToString(), "OK"); return(false); } return(true); }
public static void OnPostProcessBuild(ActualUnityEditor.BuildTarget build, string path) { //Make sure this build is for iOS. //Unity 4 uses 'iPhone' for the enum value; Unity 5 changes it to 'iOS'. if (build.ToString() != "iPhone" && build.ToString() != "iOS") { UnityEngine.Debug.LogWarning("Skillz cannot be set up for a platform other than iOS."); return; } if (Application.platform != RuntimePlatform.OSXEditor) { UnityEngine.Debug.LogError("Skillz cannot be set up for XCode automatically on a platform other than OSX."); return; } //Get whether this is an append build by checking whether a custom file has already been created. //If it is, then nothing needs to be modified. string checkAppendFilePath = Path.Combine(path, checkAppendFileName); FileInfo checkAppend = new FileInfo(checkAppendFilePath); if (checkAppend.Exists) { return; } checkAppend.Create().Close(); bool trySetUp = SetUpSDKFiles(path); if (!trySetUp) { //These failures aren't fatal; the developer can do them manually. UnityEngine.Debug.LogWarning("Skillz XCode export is missing Skillz Framework."); } //Set up XCode project settings. var xcodeProjectPath = Path.Combine(path, "Unity-iPhone.xcodeproj/project.pbxproj"); Debug.Log($"Loading the XCode project at '{xcodeProjectPath}'"); try { using (var xcodeProjectSettings = XcodeProjectSettings.Load(xcodeProjectPath)) { xcodeProjectSettings.DisableBitcode(); xcodeProjectSettings.AddRunScript(); xcodeProjectSettings.ModifyMiscellaneous(); } } catch (System.Exception) { UnityEngine.Debug.LogError("Skillz automated XCode editing failed!"); } XCProject project = new XCProject(path); if (project != null) { project.AddFile( filePath: path + "/Skillz.framework", parent: project.GetGroup("Embed Frameworks"), tree: "SOURCE_ROOT", createBuildFiles: true, weak: false, embed: true ); //AddFile should also add FrameworkSearchPaths if required but doesn't project.AddFrameworkSearchPaths("$(PROJECT_DIR)"); project.AddOtherLDFlags("-ObjC -lc++ -lz -lsqlite3 -lxml2 -weak_framework PassKit -framework Skillz"); //Unity_4 doesn't exist so we check for Unity 5 defines. Unity 6 is used for futureproofing. #if !UNITY_5 && !UNITY_6 project.AddFile(Path.Combine(Application.dataPath, "Skillz", "Internal", "Build", "iOS", "IncludeInXcode", "Skillz+Unity.mm")); SetAllowSkillzExit(Path.Combine(path, "Libraries", "Skillz", "Internal", "Build", "iOS", "IncludeInXcode", "Skillz+Unity.mm")); #endif project.Save(); } else { UnityEngine.Debug.LogError("Skillz automated XCode export failed!"); return; } }
public static void Build() { const string autoBuildBlock = "AutoBuild.Build()"; BuildLogger.OpenBlock(autoBuildBlock); BuildLogger.LogMessage("Invoke PackageImporter explicitly"); PackageAssetPostprocessor.ImportPackages(); BuildLogger.LogMessage("Parsing additional params"); var args = Environment.GetCommandLineArgs(); UnityEditor.BuildOptions buildOptions = BuildOptions.None; for (int i = 0; i < args.Length; i++) { if (args[i] == "+outdir" && args.Length > i + 1) { outDir = args[i + 1]; BuildLogger.LogMessage("outDir: " + outDir); } else if (args[i] == "+configTypeName" && args.Length > i + 1) { configTypeName = args[i + 1]; BuildLogger.LogMessage("configTypeName: " + configTypeName); if (!configTypeName.Equals(configTypeName.Trim())) // to detect 'CR' at the end { BuildLogger.LogWarning("Build configurator type contains whitespaces (+configTypeName length = " + configTypeName.Length + ")!"); } } else if (args[i] == "+buildTag" && args.Length > i + 1) { buildTag = args[i + 1]; BuildLogger.LogMessage("buildTag: " + buildTag); } else if (args[i] == "+configuration" && args.Length > i + 1) //Test = development build; Release = None { if (args[i + 1] == "Test") { buildOptions = BuildOptions.Development; BuildLogger.LogMessage("configuration: Test(Development build)"); } else { BuildLogger.LogMessage("configuration: Release"); } } } // produce Assets/Resources/build_tag.txt if (buildTag != null) { if (!Directory.Exists("Assets/Resources")) { BuildLogger.LogMessage("Creating Assets/Resources"); Directory.CreateDirectory("Assets/Resources"); } BuildLogger.LogMessage(string.Format("Writing Assets/Resources/{0}.txt: {1}", BuildInfo.k_build_tag, buildTag)); Stream file = File.Create(string.Format("Assets/Resources/{0}.txt", BuildInfo.k_build_tag)); StreamWriter sw = new StreamWriter(file); sw.Write(buildTag); sw.Close(); file.Close(); AssetDatabase.Refresh(); } // prepare default build params BuildLogger.LogMessage("Preparing default build params"); List <string> scenesToBuild = GetScenesToBuild(); UnityEditor.BuildTarget buildTarget = BuildTarget.iPhone; BuildLogger.LogMessage("Default scenes to build:"); foreach (string sceneName in scenesToBuild) { BuildLogger.LogMessage('\t' + sceneName); } BuildLogger.LogMessage("Default buildTarget=" + buildTarget.ToString()); BuildLogger.LogMessage("Default buildOptions=" + buildOptions.ToString()); // run custom builder (or fall back to default) Type configType = null; if (configTypeName != null) { configType = Type.GetType(configTypeName); } IBuildConfig buildConfig = null; if (configType != null) { if (configType.GetInterface("IBuildConfig") != null) { ConstructorInfo defaultConstructorInfo = configType.GetConstructor(new Type [0]); if (defaultConstructorInfo != null) { buildConfig = defaultConstructorInfo.Invoke(new object [0]) as IBuildConfig; if (buildConfig != null) { BuildLogger.LogMessage("Using build configurator \"" + buildConfig.ToString() + "\""); } else { BuildLogger.LogWarning("Failed to construct an instance of build configurator type (+configTypeName \"" + configTypeName + "\")"); } } else { BuildLogger.LogWarning("Build configurator type (+configTypeName \"" + configTypeName + "\") does NOT have a default constructor"); } } else { BuildLogger.LogWarning("Build configurator type (+configTypeName \"" + configTypeName + "\") does NOT implement IBuildConfig"); } } else { BuildLogger.LogWarning("Build configurator type NOT found (+configTypeName \"" + configTypeName + "\")"); } if (buildConfig != null) { string block = string.Format("{0}.Build()", buildConfig.GetType().Name); BuildLogger.OpenBlock(block); buildConfig.Build(scenesToBuild, buildTarget, buildOptions); BuildLogger.CloseBlock(block); } else { BuildLogger.LogError("Unable to configure build for " + configTypeName); throw new ApplicationException("Error: unable to configure build for " + configTypeName); } BuildLogger.CloseBlock(autoBuildBlock); }
public void OnPreprocessBuild(UnityEditor.BuildTarget target, string path) { StringBuilder warningStringBuilder = new StringBuilder(); PluginImporter[] pluginImporters = PluginImporter.GetImporters(target); foreach (PluginImporter pluginImporter in pluginImporters) { NativePlugin plugin = GetPluginByName(pluginImporter.GetEditorData("PLUGIN_NAME")); if (plugin != null) { string version = pluginImporter.GetEditorData("PLUGIN_VERSION"); if (plugin.Version != version) { warningStringBuilder.AppendFormat(@"Plugin version number mismatch: ""{0}"" is set to ""{1}"", while ""{2}"" was built with ""{3}""" + '\n', plugin.Name, plugin.Version, target.ToString(), version); } string buildNumberStr = pluginImporter.GetEditorData("PLUGIN_BUILD_NUMBER"); int buildNumber; if (int.TryParse(buildNumberStr, out buildNumber)) { if (plugin.BuildNumber != buildNumber) { warningStringBuilder.AppendFormat(@"Plugin build number mismatch: ""{0}"" is set to ""{1}"", while ""{2}"" was built with ""{3}""" + '\n', plugin.Name, plugin.BuildNumber, target.ToString(), buildNumber); } } string buildTypeStr = pluginImporter.GetEditorData("BUILD_TYPE"); BuildType buildType = (BuildType)Enum.Parse(typeof(BuildType), buildTypeStr, true); if ((EditorUserBuildSettings.development && buildType == BuildType.Release) || (!EditorUserBuildSettings.development && buildType == BuildType.Debug)) { warningStringBuilder.AppendFormat(@"Plugin build type mismatch: current build is set to development=""{0}"", while plugin ""{1}"" for ""{2}"" is ""{3}""." + '\n', EditorUserBuildSettings.development, plugin.Name, target, buildType); } } } string warnings = warningStringBuilder.ToString(); if (!string.IsNullOrEmpty(warnings)) { Debug.LogWarning(warnings); } }