Skip to content

Commit 31f8c4a

Browse files
committed
ios batch build works
1 parent fc7fd7d commit 31f8c4a

File tree

2 files changed

+98
-82
lines changed

2 files changed

+98
-82
lines changed

UnityLauncherPro/MainWindow.xaml.cs

Lines changed: 3 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -2580,93 +2580,14 @@ private void BtnUnityCache_Click(object sender, RoutedEventArgs e)
25802580

25812581
private void MenuBatchBuildAndroid_Click(object sender, RoutedEventArgs e)
25822582
{
2583-
// get selected project path
25842583
var proj = GetSelectedProject();
2585-
if (string.IsNullOrEmpty(proj.Path)) return;
2586-
2587-
// create builder script template (with template string, that can be replaced with project related paths or names?)
2588-
// copy editor build script to Assets/Editor/ folder (if already exists then what? Use UnityLauncherBuildSomething.cs name, so can overwrite..)
2589-
var editorScriptFolder = Path.Combine(proj.Path, "Assets", "Editor");
2590-
if (Directory.Exists(editorScriptFolder) == false)
2591-
{
2592-
Directory.CreateDirectory(editorScriptFolder);
2593-
// TODO check if creation failed
2594-
}
2595-
2596-
// create output file for editor script
2597-
var editorScriptFile = Path.Combine(editorScriptFolder, "UnityLauncherProBuilder.cs");
2598-
2599-
// check build folder and create if missing
2600-
var outputFolder = Path.Combine(proj.Path, "Builds/Android/");
2601-
outputFolder = outputFolder.Replace('\\', '/'); // fix backslashes
2602-
Console.WriteLine("outputFolder= " + outputFolder);
2603-
if (Directory.Exists(outputFolder) == false) Directory.CreateDirectory(outputFolder);
2604-
// TODO check if creation failed
2605-
2606-
// cleanup filename from project name
2607-
var invalidChars = Path.GetInvalidFileNameChars();
2608-
var outputFile = String.Join("_", proj.Title.Split(invalidChars, StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.');
2609-
// replace spaces also, for old time(r)s
2610-
outputFile = outputFile.Replace(' ', '_');
2611-
outputFile = Path.Combine(outputFolder, outputFile + ".apk");
2612-
Console.WriteLine("outputFile= " + outputFile);
2613-
2614-
// TODO move to txt resource? and later load from local custom file if exists, and later open window or add settings for build options
2615-
// TODO ios build script
2616-
var builderScript = @"
2617-
using System.Linq;
2618-
using UnityEditor;
2619-
using UnityEngine;
2620-
public static class UnityLauncherProTools
2621-
{
2622-
public static void BuildAndroid()
2623-
{
2624-
EditorUserBuildSettings.buildAppBundle = false;
2625-
EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
2626-
PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.IL2CPP);
2627-
PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARM64;
2628-
var settings = new BuildPlayerOptions();
2629-
settings.scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(scene => scene.path).ToArray();
2630-
settings.locationPathName = ""###OUTPUTFILE###"";
2631-
settings.target = BuildTarget.Android;
2632-
settings.options = BuildOptions.None;
2633-
var res = BuildPipeline.BuildPlayer(settings);
2634-
}
2635-
}";
2636-
2637-
// fill in project specific data
2638-
builderScript = builderScript.Replace("###OUTPUTFILE###", outputFile);
2639-
2640-
Console.WriteLine("builderScript=" + builderScript);
2641-
2642-
File.WriteAllText(editorScriptFile, builderScript);
2643-
// TODO check if write failed
2644-
2645-
// get selected project unity exe path
2646-
var unityExePath = Tools.GetUnityExePath(proj.Version);
2647-
if (unityExePath == null) return;
2648-
2649-
// create commandline string for building and launch it
2650-
//var buildcmd = $"\"{unityExePath}\" -quit -batchmode -nographics -projectPath \"{proj.Path}\" -executeMethod \"Builder.BuildAndroid\" -buildTarget android -logFile -";
2651-
var buildParams = $" -quit -batchmode -nographics -projectPath \"{proj.Path}\" -executeMethod \"UnityLauncherProTools.BuildAndroid\" -buildTarget android -logFile -";
2652-
Console.WriteLine("buildcmd= " + buildParams);
2653-
2654-
var proc = Tools.LaunchExe(unityExePath, buildParams);
2655-
proc.Exited += (o, i) =>
2656-
{
2657-
Console.WriteLine("Build process exited: " + outputFolder);
2658-
Tools.ExploreFolder(outputFolder);
2659-
//Tools.BrowseForOutputFolder()
2660-
};
2661-
// TODO add event to follow process exit and show info after it? maybe from context menu? or open separate "building.." window, then can see more info there, and output log etc.
2662-
2663-
// open output folder after build ready, maybe can do that from editor script easier?
2584+
Tools.BuildProject(proj, Platform.Android);
26642585
}
26652586

2666-
26672587
private void MenuBatchBuildIOS_Click(object sender, RoutedEventArgs e)
26682588
{
2669-
Console.WriteLine("TODO build ios");
2589+
var proj = GetSelectedProject();
2590+
Tools.BuildProject(proj, Platform.iOS);
26702591
}
26712592

26722593

UnityLauncherPro/Tools.cs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,6 +1304,101 @@ public static void OpenAppdataSpecialFolder(string subfolder)
13041304
}
13051305
}
13061306

1307+
// NOTE android only at the moment
1308+
public static void BuildProject(Project proj, Platform platform)
1309+
{
1310+
Console.WriteLine("Building " + proj.Title + " for " + platform);
1311+
if (string.IsNullOrEmpty(proj.Path)) return;
1312+
1313+
// create builder script template (with template string, that can be replaced with project related paths or names?)
1314+
// copy editor build script to Assets/Editor/ folder (if already exists then what? Use UnityLauncherBuildSomething.cs name, so can overwrite..)
1315+
var editorScriptFolder = Path.Combine(proj.Path, "Assets", "Editor");
1316+
if (Directory.Exists(editorScriptFolder) == false) Directory.CreateDirectory(editorScriptFolder);
1317+
// TODO check if creation failed
1318+
1319+
// create output file for editor script
1320+
var editorScriptFile = Path.Combine(editorScriptFolder, "UnityLauncherProBuilder.cs");
1321+
1322+
// check build folder and create if missing
1323+
var outputFolder = Path.Combine(proj.Path, "Builds/" + platform + "/");
1324+
outputFolder = outputFolder.Replace('\\', '/'); // fix backslashes
1325+
Console.WriteLine("outputFolder= " + outputFolder);
1326+
if (Directory.Exists(outputFolder) == false) Directory.CreateDirectory(outputFolder);
1327+
// TODO check if creation failed
1328+
1329+
// cleanup filename from project name
1330+
var invalidChars = Path.GetInvalidFileNameChars();
1331+
var outputFile = String.Join("_", proj.Title.Split(invalidChars, StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.');
1332+
// replace spaces also, for old time(r)s
1333+
outputFile = outputFile.Replace(' ', '_');
1334+
outputFile = Path.Combine(outputFolder, outputFile + ".apk");
1335+
Console.WriteLine("outputFile= " + outputFile);
1336+
1337+
// TODO move to txt resource? and later load from local custom file if exists, and later open window or add settings for build options
1338+
// TODO different unity versions? wont work in older unitys right now
1339+
var builderScript = @"using System.Linq;
1340+
using UnityEditor;
1341+
using UnityEngine;
1342+
public static class UnityLauncherProTools
1343+
{
1344+
public static void BuildAndroid()
1345+
{
1346+
EditorUserBuildSettings.buildAppBundle = false;
1347+
EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
1348+
PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.IL2CPP);
1349+
PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARM64;
1350+
var settings = new BuildPlayerOptions();
1351+
settings.scenes = GetScenes();
1352+
settings.locationPathName = ""###OUTPUTFILE###"";
1353+
settings.target = BuildTarget.Android;
1354+
settings.options = BuildOptions.None;
1355+
var report = BuildPipeline.BuildPlayer(settings);
1356+
}
1357+
public static void BuildiOS() // Note need to match platform name
1358+
{
1359+
PlayerSettings.iOS.targetDevice = iOSTargetDevice.iPhoneAndiPad;
1360+
var settings = new BuildPlayerOptions();
1361+
settings.scenes = GetScenes();
1362+
settings.locationPathName = ""###OUTPUTFOLDER###"";
1363+
settings.target = BuildTarget.iOS;
1364+
settings.options = BuildOptions.None;
1365+
var report = BuildPipeline.BuildPlayer(settings);
1366+
}
1367+
static string[] GetScenes()
1368+
{
1369+
return EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(scene => scene.path).ToArray();
1370+
}
1371+
}";
1372+
1373+
// fill in project specific data
1374+
builderScript = builderScript.Replace("###OUTPUTFILE###", outputFile); // android
1375+
builderScript = builderScript.Replace("###OUTPUTFOLDER###", outputFolder); // ios
1376+
Console.WriteLine("builderScript=" + builderScript);
1377+
1378+
File.WriteAllText(editorScriptFile, builderScript);
1379+
// TODO check if write failed
1380+
1381+
// get selected project unity exe path
1382+
var unityExePath = Tools.GetUnityExePath(proj.Version);
1383+
if (unityExePath == null) return;
1384+
1385+
// create commandline string for building and launch it
1386+
//var buildcmd = $"\"{unityExePath}\" -quit -batchmode -nographics -projectPath \"{proj.Path}\" -executeMethod \"Builder.BuildAndroid\" -buildTarget android -logFile -";
1387+
var buildParams = $" -quit -batchmode -nographics -projectPath \"{proj.Path}\" -executeMethod \"UnityLauncherProTools.Build{platform}\" -buildTarget {platform} -logFile -";
1388+
Console.WriteLine("buildcmd= " + buildParams);
1389+
1390+
// launch build
1391+
var proc = Tools.LaunchExe(unityExePath, buildParams);
1392+
1393+
// wait for process exit then open output folder
1394+
proc.Exited += (o, i) =>
1395+
{
1396+
Console.WriteLine("Build process exited: " + outputFolder);
1397+
Tools.ExploreFolder(outputFolder);
1398+
};
1399+
1400+
}
1401+
13071402
} // class
13081403
} // namespace
13091404

0 commit comments

Comments
 (0)