Skip to content

Commit 3969c9e

Browse files
committed
[Win] Make paths configurable in which Unity installations are searched
1 parent e2371d7 commit 3969c9e

File tree

4 files changed

+42
-5
lines changed

4 files changed

+42
-5
lines changed

sttz.InstallUnity/Installer/Configuration.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,18 @@ public class Configuration
6262
+ "/Applications/Unity {major}.{minor}.{patch}{type}{build};"
6363
+ "/Applications/Unity {major}.{minor}.{patch}{type}{build} ({hash})";
6464

65-
6665
[Description("Windows installation paths, separted by ; (first non-existing will be used, variables: {major} {minor} {patch} {type} {build} {hash} {ProgramFiles}).")]
6766
public string installPathWindows =
6867
"{ProgramFiles}\\Unity {major}.{minor};"
6968
+ "{ProgramFiles}\\Unity {major}.{minor}.{patch}{type}{build};"
7069
+ "{ProgramFiles}\\Unity {major}.{minor}.{patch}{type}{build} ({hash});";
7170

71+
[Description("Windows directories which are searched for Unity installations, separted by ; (variables: {ProgramFiles}).")]
72+
public string searchPathWindows =
73+
"{ProgramFiles};"
74+
+ "{ProgramFiles}\\Unity\\Editor;"
75+
+ "{ProgramFiles}\\Unity\\Hub\\Editor;";
76+
7277
// -------- Serialization --------
7378

7479
/// <summary>

sttz.InstallUnity/Installer/IInstallerPlatform.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ public interface IInstallerPlatform
4646
/// </summary>
4747
string GetConfigurationDirectory();
4848

49+
/// <summary>
50+
/// Set the configuration instance to use.
51+
/// </summary>
52+
/// <remarks>
53+
/// Note that other methods might be called before the configuraiton
54+
/// is set, namely <see cref="GetConfigurationDirectory"/>.
55+
/// </remarks>
56+
void SetConfiguration(Configuration configuration);
57+
4958
/// <summary>
5059
/// The directory where cache files are stored.
5160
/// </summary>

sttz.InstallUnity/Installer/Platforms/MacPlatform.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ public string GetConfigurationDirectory()
9191
return GetUserApplicationSupportDirectory();
9292
}
9393

94+
public void SetConfiguration(Configuration configuration)
95+
{
96+
// Not used
97+
}
98+
9499
public string GetCacheDirectory()
95100
{
96101
return GetUserApplicationSupportDirectory();

sttz.InstallUnity/Installer/Platforms/WindowsPlatform.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ public class WindowsPlatform : IInstallerPlatform
2525
/// <summary>
2626
/// Paths where Unity installations are searched in.
2727
/// </summary>
28-
/// <value></value>
2928
static readonly string[] INSTALL_LOCATIONS = new string[] {
3029
ProgramFilesPath,
3130
Path.Combine(ProgramFilesPath, "Unity", "Editor"),
@@ -53,6 +52,11 @@ string GetLocalApplicationDataDirectory()
5352
UnityInstaller.PRODUCT_NAME);
5453
}
5554

55+
public void SetConfiguration(Configuration configuration)
56+
{
57+
this.configuration = configuration;
58+
}
59+
5660
public Task<CachePlatform> GetCurrentPlatform()
5761
{
5862
return Task.FromResult(CachePlatform.Windows);
@@ -115,12 +119,23 @@ public Task<Installation> CompleteInstall(bool aborted, CancellationToken cancel
115119

116120
public async Task<IEnumerable<Installation>> FindInstallations(CancellationToken cancellation = default)
117121
{
122+
var locations = INSTALL_LOCATIONS;
123+
if (configuration != null && !string.IsNullOrEmpty(configuration.searchPathWindows)) {
124+
locations = configuration.searchPathWindows.Split(';', StringSplitOptions.RemoveEmptyEntries);
125+
var comparison = StringComparison.OrdinalIgnoreCase;
126+
for (int i = 0; i < locations.Length; i++) {
127+
locations[i] = Helpers.Replace(locations[i], "{ProgramFiles}", ProgramFilesPath, comparison);
128+
}
129+
}
130+
118131
var unityInstallations = new List<Installation>();
119-
foreach (var installPath in INSTALL_LOCATIONS)
132+
foreach (var installPath in locations)
120133
{
121134
if (!Directory.Exists(installPath))
122135
continue;
123136

137+
Logger.LogDebug($"Searching directory for Unity installations: {installPath}");
138+
124139
foreach (var unityCandidate in Directory.EnumerateDirectories(installPath))
125140
{
126141
var unityExePath = Path.Combine(unityCandidate, "Editor", "Unity.exe");
@@ -133,7 +148,8 @@ public async Task<IEnumerable<Installation>> FindInstallations(CancellationToken
133148
var versionInfo = FileVersionInfo.GetVersionInfo(unityExePath);
134149
var splitCharacter = versionInfo.ProductVersion.Contains("_") ? '_' : '.'; // Versions are on format 2020.3.34f1_xxxx or 2020.3.34f1.xxxx
135150

136-
Logger.LogDebug($"Found version {versionInfo.ProductVersion}");
151+
Logger.LogDebug($"Found version {versionInfo.ProductVersion} at path: {unityCandidate}");
152+
137153
unityInstallations.Add(new Installation {
138154
executable = unityExePath,
139155
path = unityCandidate,
@@ -260,6 +276,8 @@ public async Task Uninstall(Installation installation, CancellationToken cancell
260276

261277
ILogger Logger = UnityInstaller.CreateLogger<WindowsPlatform>();
262278

279+
Configuration configuration;
280+
263281
VersionMetadata installing;
264282
string installationPaths;
265283
bool installedEditor;
@@ -294,7 +312,7 @@ string GetInstallationPath(UnityVersion version, string installationPaths)
294312
if (!string.IsNullOrEmpty(installationPaths))
295313
{
296314
var comparison = StringComparison.OrdinalIgnoreCase;
297-
var paths = installationPaths.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
315+
var paths = installationPaths.Split(';', StringSplitOptions.RemoveEmptyEntries);
298316
foreach (var path in paths)
299317
{
300318
expanded = path.Trim();

0 commit comments

Comments
 (0)