-
Notifications
You must be signed in to change notification settings - Fork 460
Expand file tree
/
Copy pathBuildMultiprocessTestPlayer.cs
More file actions
187 lines (165 loc) · 7.35 KB
/
Copy pathBuildMultiprocessTestPlayer.cs
File metadata and controls
187 lines (165 loc) · 7.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
using System;
using System.IO;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.Build.Reporting;
#endif
using UnityEngine;
namespace Unity.Netcode.MultiprocessRuntimeTests
{
/// <summary>
/// This is needed as Unity throws "An abnormal situation has occurred: the PlayerLoop internal function has been called recursively. Please contact Customer Support with a sample project so that we can reproduce the problem and troubleshoot it."
/// when trying to build from Setup() steps in tests.
/// </summary>
public static class BuildMultiprocessTestPlayer
{
public const string MultiprocessBaseMenuName = "Netcode/Multiprocess Test";
public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build Test Player #t";
public const string MainSceneName = "MultiprocessTestScene";
private static string BuildPathDirectory => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds", "MultiprocessTests");
public static string BuildPath => Path.Combine(BuildPathDirectory, "MultiprocessTestPlayer");
public const string BuildInfoFileName = "BuildInfo.json";
#if UNITY_EDITOR
/// <summary>
/// Build the standalone player on the current platform
/// This method is both a menu item as well as a public method that can be called from CI
/// in order to build the standalone player
/// </summary>
[MenuItem(BuildAndExecuteMenuName)]
public static void BuildRelease()
{
var report = BuildPlayerUtility();
if (report.summary.result != BuildResult.Succeeded)
{
throw new Exception($"Build failed! {report.summary.totalErrors} errors");
}
}
[MenuItem(MultiprocessBaseMenuName + "/Build Test Player (Debug)")]
public static void BuildDebug()
{
var report = BuildPlayerUtility(BuildTarget.NoTarget, null, true);
if (report.summary.result != BuildResult.Succeeded)
{
throw new Exception($"Build failed! {report.summary.totalErrors} errors");
}
}
[MenuItem(MultiprocessBaseMenuName + "/Delete Test Build")]
public static void DeleteBuild()
{
if (Directory.Exists(BuildPathDirectory))
{
Directory.Delete(BuildPathDirectory, recursive: true);
}
else
{
Debug.Log($"[{nameof(BuildMultiprocessTestPlayer)}] build directory does not exist ({BuildPathDirectory}) not deleting anything");
}
}
private static BuildReport BuildPlayerUtility(BuildTarget buildTarget = BuildTarget.NoTarget, string buildPathExtension = null, bool buildDebug = false)
{
SaveBuildInfo(new BuildInfo() { BuildPath = BuildPath });
// deleting so we don't end up testing on outdated builds if there's a build failure
DeleteBuild();
if (buildTarget == BuildTarget.NoTarget)
{
if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor)
{
buildPathExtension += ".exe";
buildTarget = BuildTarget.StandaloneWindows64;
}
else if (Application.platform == RuntimePlatform.OSXPlayer || Application.platform == RuntimePlatform.OSXEditor)
{
buildPathExtension += ".app";
buildTarget = BuildTarget.StandaloneOSX;
}
else if (Application.platform == RuntimePlatform.LinuxEditor || Application.platform == RuntimePlatform.LinuxPlayer)
{
buildPathExtension += "";
buildTarget = BuildTarget.StandaloneLinux64;
}
}
var buildPathToUse = BuildPath;
buildPathToUse += buildPathExtension;
var buildPlayerOptions = new BuildPlayerOptions
{
scenes = new[] { "Assets/Scenes/MultiprocessTestScene.unity" },
locationPathName = buildPathToUse,
target = buildTarget
};
var buildOptions = BuildOptions.None;
if (buildDebug || buildTarget == BuildTarget.Android)
{
buildOptions |= BuildOptions.Development;
buildOptions |= BuildOptions.AllowDebugging;
}
buildOptions |= BuildOptions.StrictMode;
buildOptions |= BuildOptions.IncludeTestAssemblies;
buildPlayerOptions.options = buildOptions;
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
if (summary.result == BuildResult.Succeeded)
{
Debug.Log($"Build succeeded: {summary.totalSize} bytes at {summary.outputPath}");
}
return report;
}
[MenuItem(MultiprocessBaseMenuName + "/Windows Standalone Player")]
public static void BuildWindowsStandalonePlayer()
{
var report = BuildPlayerUtility(BuildTarget.StandaloneWindows64, ".exe");
if (report.summary.result != BuildResult.Succeeded)
{
throw new Exception($"Build failed! {report.summary.totalErrors} errors");
}
}
[MenuItem(MultiprocessBaseMenuName + "/Build OSX")]
public static void BuildOSX()
{
var report = BuildPlayerUtility(BuildTarget.StandaloneOSX, ".app");
if (report.summary.result != BuildResult.Succeeded)
{
throw new Exception($"Build failed! {report.summary.totalErrors} errors");
}
}
[MenuItem(MultiprocessBaseMenuName + "/Build Linux")]
public static void BuildLinux()
{
var report = BuildPlayerUtility(BuildTarget.StandaloneLinux64, "");
if (report.summary.result != BuildResult.Succeeded)
{
throw new Exception($"Build failed! {report.summary.totalErrors} errors");
}
}
[MenuItem(MultiprocessBaseMenuName + "/Build Android")]
public static void BuildAndroid()
{
var report = BuildPlayerUtility(BuildTarget.Android, ".apk");
if (report.summary.result != BuildResult.Succeeded)
{
throw new Exception($"Build failed! {report.summary.totalErrors} errors");
}
}
#endif
[Serializable]
public struct BuildInfo
{
public string BuildPath;
public bool IsDebug;
}
public static bool DoesBuildInfoExist()
{
var buildfileInfo = new FileInfo(Path.Combine(Application.streamingAssetsPath, BuildInfoFileName));
return buildfileInfo.Exists;
}
public static BuildInfo ReadBuildInfo()
{
var jsonString = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, BuildInfoFileName));
return JsonUtility.FromJson<BuildInfo>(jsonString);
}
public static void SaveBuildInfo(BuildInfo toSave)
{
var buildInfoJson = JsonUtility.ToJson(toSave);
File.WriteAllText(Path.Combine(Application.streamingAssetsPath, BuildInfoFileName), buildInfoJson);
}
}
}