Skip to content

Commit e1c8537

Browse files
Merge pull request #1231 from EOS-Contrib/release-6.0.0
[Public] Release 6.0.0
2 parents 82cffe7 + 847c4be commit e1c8537

386 files changed

Lines changed: 15105 additions & 6889 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,12 @@ There are many EOS features that do not require your player to have an Epic Game
6969
|[Voice with Lobbies](https://dev.epicgames.com/docs/game-services/voice#voicewithlobbies) || ["Lobbies"](/com.playeveryware.eos/Documentation~/scene_walkthrough/lobbies_walkthrough.md), [Information](/com.playeveryware.eos/Documentation~/enabling_voice.md) | |
7070
|[Voice Trusted Server](https://dev.epicgames.com/docs/game-services/voice#voicewithatrustedserverapplication) || NA | |
7171

72-
Efforts will be made to add corresponding support to features as they are added to the Epic Online Services SDK. The table above reflects the features as of November 2023.
72+
Efforts will be made to add corresponding support to features as they are added to the Epic Online Services SDK. The table above reflects the features as of December 2025.
7373

74-
[^2]: Overlay features aren't supported yet on mobile devices as of EOSSDK 1.17. That includes Social Overlay and Store Overlay.
74+
[^2]: As of EOS SDK 1.18.1.2, only the Store Overlay is supported on mobile. The Social Overlay isn't supported.
75+
76+
The mobile Epic Games Store is currently in closed beta. We’re excited to launch our self-publishing tools in the near future.
77+
Interested in joining our mobile store? Submit your game through our [Leads Intake form](https://e.acct.epicgames.com/click?EZWdzdG9yZS10ZWFtQGVwaWNnYW1lcy5jb20/CeyJtaWQiOiIxNzYzNTcxOTU3NDUzMTk2NTk2OGRjNzFiIiwiY3QiOiJlcGljLXR4LXByb2QtODI0ODA2ZmU0NDUwYjQ4ZTQ3MDVhODM3Y2Q4MzAwNGItMSIsInJkIjoiZXBpY2dhbWVzLmNvbSJ9/VaHR0cHM6Ly9mb3Jtcy51bnJlYWxlbmdpbmUuY29tL3MvZWdzLWxlYWQtaW50YWtlLWZvcm0/SWkhfYWNjdF9OTlRBTjExMTkyMDI1YzE4NjM3NjJiMQ/LYWUx/qP2xhbmd1YWdlPWVuX1VT/gaR35mw/JMTExOTIwMjVDMTg2Mzc2MkIx/s1v93de8f7c)
7578

7679
## Supported Platforms
7780

@@ -83,6 +86,7 @@ We currently support the following platforms, details of each can be found on ou
8386
* Android
8487
* iOS
8588
* Nintendo Switch™
89+
* Nintendo Switch 2™
8690
* Xbox One
8791
* Xbox Series X|S
8892
* PlayStation®4
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:ae602e95143c53fdde16671d45c8305eef62ec6b68f3c3354081b33d51a4ecc8
3-
size 26287120
2+
oid sha256:6313b4a6aff51216e778f1c86ca29a4ebb77c6e7e8558004e8ff0172f028fde8
3+
size 26666496
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
using PlayEveryWare.EpicOnlineServices;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using UnityEditor;
6+
using UnityEditor.Build;
7+
using UnityEditor.Build.Reporting;
8+
9+
/// <summary>
10+
/// Validates platform-specific identifier and EOS-related configuration prior to starting a build.
11+
/// Implements <see cref="UnityEditor.Build.IPreprocessBuildWithReport"/> to run checks early in the
12+
/// build pipeline, preventing invalid builds and surfacing actionable diagnostics.
13+
/// </summary>
14+
/// <remarks>
15+
/// <para>
16+
/// Responsibilities:<br/>
17+
/// - Verify that target platform has a valid deploy and sandbox ID.<br/>
18+
/// - Accumulate detected issues in <see cref="EOSConfigBuildValidator.ErrorCode"/> (via <c>errorCode</c>) and construct a
19+
/// human-readable summary using <c>BuildErrorMessage</c>.
20+
/// </para>
21+
/// <para>
22+
/// Behavior:<br/>
23+
/// - Runs during <see cref="OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport)"/>.<br/>
24+
/// - If any errors are detected, throws <see cref="UnityEditor.Build.BuildFailedException"/> with a
25+
/// detailed message to halt the build.<br/>
26+
/// - If no errors are present, the build continues normally.
27+
/// </para>
28+
/// <para>
29+
/// Notes:<br/>
30+
/// - Extend platform checks as needed (Android/iOS/Windows/macOS/PS4/PS5/XBox One/XBox Series)
31+
/// and align validation rules with your EOS Config.<br/>
32+
/// - Keep validations deterministic and side-effect free; this class should only read settings
33+
/// and report issues.
34+
/// </para>
35+
/// </remarks>
36+
public class EOSConfigBuildValidator : IPreprocessBuildWithReport
37+
{
38+
/// <summary>
39+
/// Error flags for the pre-build validation system.
40+
/// Flags can be combined (bitwise) to represent multiple failures.
41+
/// </summary>
42+
[Flags]
43+
private enum ErrorCode : uint
44+
{
45+
None = 0x0,
46+
InvalidSandboxId = 0x1,
47+
InvalidDeploymentId = 0x2,
48+
}
49+
50+
/// <summary>
51+
/// Maps Unity BuildTarget to PlatformManager.Platform
52+
/// </summary>
53+
private static readonly IDictionary<BuildTarget, PlatformManager.Platform> TargetToPlatformsMap =
54+
new Dictionary<BuildTarget, PlatformManager.Platform>()
55+
{
56+
{ BuildTarget.Android, PlatformManager.Platform.Android },
57+
{ BuildTarget.GameCoreXboxOne, PlatformManager.Platform.XboxOne },
58+
{ BuildTarget.GameCoreXboxSeries, PlatformManager.Platform.XboxSeriesX },
59+
{ BuildTarget.iOS, PlatformManager.Platform.iOS },
60+
{ BuildTarget.StandaloneLinux64, PlatformManager.Platform.Linux },
61+
{ BuildTarget.PS4, PlatformManager.Platform.PS4 },
62+
{ BuildTarget.PS5, PlatformManager.Platform.PS5 },
63+
{ BuildTarget.Switch, PlatformManager.Platform.Switch },
64+
{ BuildTarget.StandaloneOSX, PlatformManager.Platform.macOS },
65+
{ BuildTarget.StandaloneWindows, PlatformManager.Platform.Windows },
66+
{ BuildTarget.StandaloneWindows64, PlatformManager.Platform.Windows },
67+
};
68+
69+
/// <summary>
70+
/// Returns the relative callback order for callbacks. Callbacks with lower values
71+
/// are called before ones with higher values.
72+
/// </summary>
73+
public int callbackOrder => 0;
74+
75+
/// <summary>
76+
/// Accumulates error flags detected during pre-build validation.
77+
/// Uses bitwise combinations of <see cref="ErrorCode"/> to represent multiple issues in a single value.
78+
/// </summary>
79+
private ErrorCode errorCode = ErrorCode.None;
80+
81+
/// <summary>
82+
/// Produces a human-readable message based on active error flags in <see cref = "errorCode" />.
83+
/// Aggregates explanations and corrective actions for each flagged issue.
84+
/// </summary>
85+
/// <returns></returns>
86+
private string BuildErrorMessage()
87+
{
88+
bool isInvalidSandbox = errorCode.HasFlag(ErrorCode.InvalidSandboxId);
89+
bool isInvalidDeployment = errorCode.HasFlag(ErrorCode.InvalidDeploymentId);
90+
if (isInvalidSandbox && isInvalidDeployment)
91+
{
92+
return "Both sandbox and deployment ID missing. Please configure a valid Deployment and Sandbox IDs in EOS Plugin->EOS Configuration.";
93+
}
94+
95+
if (isInvalidDeployment)
96+
{
97+
return "Deployment ID is missing. Please configure a valid Deployment ID in EOS Plugin->EOS Configuration.";
98+
}
99+
100+
return "Sandbox ID missing. Please configure a valid Sandbox ID in EOS Plugin->EOS Configuration.";
101+
}
102+
103+
/// <summary>
104+
/// Executes pre-build validations for platform-specific identifiers.
105+
/// Verifies that target platform IDs are present and correctly formatted.
106+
/// If inconsistencies or missing values are detected, the method
107+
/// sets the corresponding flags in <see cref="errorCode"/> to block the build and notify the user.
108+
/// </summary>
109+
/// <param name="report">The BuildReport API gives you information about the Unity build process.</param>
110+
/// <exception cref="BuildFailedException">An exception class that represents a failed build.</exception>
111+
public void OnPreprocessBuild(BuildReport report)
112+
{
113+
errorCode = ErrorCode.None;
114+
BuildTarget target = report.summary.platform;
115+
if (!PlatformManager.TryGetConfigFilePath(target, out string configFilePath))
116+
{
117+
throw new BuildFailedException($"{target} not supported.");
118+
}
119+
120+
if (!File.Exists(configFilePath))
121+
{
122+
throw new BuildFailedException($"{target} config file not found, Set EOS configuration.");
123+
}
124+
125+
if (!TargetToPlatformsMap.TryGetValue(target, out PlatformManager.Platform supportedPlatform))
126+
{
127+
throw new BuildFailedException($"{target} not found on PlatformManager platforms.");
128+
}
129+
130+
if (!PlatformManager.TryGetConfig(supportedPlatform, out PlatformConfig platformConfig))
131+
{
132+
throw new BuildFailedException("Platform manager was unable to obtain the platform configuration.");
133+
}
134+
135+
if (String.IsNullOrEmpty(platformConfig.deployment.SandboxId.Value))
136+
{
137+
errorCode = errorCode | ErrorCode.InvalidSandboxId;
138+
}
139+
if (platformConfig.deployment.DeploymentId.Equals(Guid.Empty))
140+
{
141+
errorCode = errorCode | ErrorCode.InvalidDeploymentId;
142+
}
143+
144+
if (errorCode != ErrorCode.None)
145+
{
146+
throw new BuildFailedException(BuildErrorMessage());
147+
}
148+
}
149+
}

com.playeveryware.eos/Runtime/EOS_SDK/Generated/PageQuery.cs.meta renamed to Assets/Plugins/Source/Editor/Build/EOSConfigBuildValidator.cs.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Plugins/Source/Editor/Build/PlatformSpecificBuilder.cs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,6 @@ protected void AddProjectFileToBinaryMapping(string projectFile, params string[]
138138
/// <param name="report"></param>
139139
public virtual void PreBuild(BuildReport report)
140140
{
141-
// Check to make sure that the platform configuration exists
142-
CheckPlatformConfiguration();
143-
144141
// Configure the version numbers per user defined preferences
145142
ConfigureVersion();
146143

@@ -208,19 +205,6 @@ protected virtual void CheckPlatformBinaries()
208205
}
209206
}
210207

211-
/// <summary>
212-
/// Checks to make sure that the platform configuration file exists where it is expected to be
213-
/// TODO: Add configuration validation.
214-
/// </summary>
215-
private static void CheckPlatformConfiguration()
216-
{
217-
string configFilePath = PlatformManager.GetConfigFilePath();
218-
if (!File.Exists(configFilePath))
219-
{
220-
throw new BuildFailedException($"Expected config file \"{configFilePath}\" for platform {PlatformManager.GetFullName(PlatformManager.CurrentPlatform)} does not exist.");
221-
}
222-
}
223-
224208
/// <summary>
225209
/// Completes all configuration tasks.
226210
/// </summary>

Assets/Plugins/Source/Editor/EditorWindows/EOSSettingsWindow.cs

Lines changed: 95 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public class EOSSettingsWindow : EOSEditorWindow
8181
fontSize = 14,
8282
padding = new RectOffset(10, 10, 10, 10),
8383
alignment = TextAnchor.MiddleCenter,
84-
fixedHeight = 40
84+
fixedHeight = 60
8585
};
8686

8787
public EOSSettingsWindow() : base("EOS Configuration") { }
@@ -137,6 +137,7 @@ private void ReloadClientCredentialsForPlatformConfigEditors(object sender,
137137
// config within the PlatformConfigEditor.
138138
platformConfigEditor.SetClientCredentials(platformConfigFromDisk.clientCredentials);
139139
}
140+
Repaint();
140141
}
141142

142143
// TODO: Refactor to reduce massive overlap between this function and
@@ -168,13 +169,12 @@ private void ReloadDeploymentSettingsForPlatformConfigEditors(object sender, Pro
168169
// within the PlatformConfigEditor.
169170
platformConfigEditor.SetDeployment(platformConfigFromDisk.deployment);
170171
}
172+
Repaint();
171173
}
172174

173175
protected override async Task AsyncSetup()
174176
{
175177
await _productConfigEditor.LoadAsync();
176-
177-
List<GUIContent> tabContents = new();
178178
int tabIndex = 0;
179179
foreach (PlatformManager.Platform platform in Enum.GetValues(typeof(PlatformManager.Platform)))
180180
{
@@ -209,8 +209,6 @@ protected override async Task AsyncSetup()
209209
tabIndex++;
210210

211211
_platformConfigEditors.Add(editor);
212-
213-
tabContents.Add(new GUIContent($" {editor.GetLabelText()}", editor.GetPlatformIconTexture()));
214212
}
215213

216214
// If (for some reason) a default platform was not selected, then
@@ -220,7 +218,7 @@ protected override async Task AsyncSetup()
220218
_selectedTab = 0;
221219
}
222220

223-
_platformTabs = tabContents.ToArray();
221+
_platformTabs = BuildPlatformTabsDynamic();
224222
}
225223

226224
protected override void RenderWindow()
@@ -255,15 +253,104 @@ private void Save()
255253
// Save the product config editor
256254
_productConfigEditor.Save();
257255

258-
// reload the product config editor
259-
256+
//Update deployment in current platform
257+
if(!ProductConfig.Get<ProductConfig>().Environments.TryGetFirstDefinedNamedDeployment(out var namedDep))
258+
{
259+
Debug.LogError($"{nameof(EOSSettingsWindow)} {nameof(Save)}: No named deployment found for current platform tab: {_platformConfigEditors[_selectedTab].GetPlatform()}");
260+
return;
261+
}
260262
// Save each of the platform config editors.
261263
foreach (IConfigEditor editor in _platformConfigEditors)
262264
{
263265
editor.Save();
264266
}
265267
AssetDatabase.SaveAssets();
266268
AssetDatabase.Refresh();
269+
_platformTabs = BuildPlatformTabsDynamic();
270+
Repaint();
271+
}
272+
273+
/// <summary>
274+
/// Determines whether a Deployment object represents a valid and fully defined deployment.
275+
/// </summary>
276+
private static bool IsDeploymentSet(Deployment dep)
277+
{
278+
return dep.IsComplete && dep.DeploymentId != Guid.Empty;
279+
}
280+
281+
/// <summary>
282+
/// Produces a simple text label describing the deployment type based on its name.
283+
/// </summary>
284+
private static bool TryGetDeploymentDisplayName(ProductionEnvironments envs, Deployment target, out string displayName)
285+
{
286+
displayName = null;
287+
if (envs == null || target.DeploymentId == Guid.Empty)
288+
{
289+
return false;
290+
}
291+
292+
var named = envs.Deployments.FirstOrDefault(d => d != null && d.Value.DeploymentId == target.DeploymentId);
293+
294+
if (named != null)
295+
{
296+
displayName = named.Name;
297+
return true;
298+
}
299+
300+
return false;
301+
}
302+
303+
/// <summary>
304+
/// Converts a GUID into a shorter, UI-friendly representation.
305+
/// Used only as a fallback when a deployment does not have a valid name.
306+
/// </summary>
307+
private static string ShortenGuid(Guid id)
308+
{
309+
var s = id.ToString("N");
310+
return s.Length > 8 ? s.Substring(0, 8) : s;
311+
}
312+
313+
/// <summary>
314+
/// Builds the GUIContent array used for drawing the platform selection toolbar.
315+
/// Unlike the static version initialized at window setup, this version refreshes
316+
/// dynamically so that each platform tab displays the current deployment name
317+
/// </summary>
318+
private GUIContent[] BuildPlatformTabsDynamic()
319+
{
320+
var product = ProductConfig.Get<ProductConfig>();
321+
var envs = product?.Environments;
322+
var contents = new List<GUIContent>(_platformConfigEditors.Count);
323+
324+
foreach (var editor in _platformConfigEditors)
325+
{
326+
string platformLabel = editor.GetLabelText();
327+
string deploymentName = "-";
328+
329+
if (PlatformManager.TryGetConfig(editor.GetPlatform(), out PlatformConfig cfg) && cfg != null)
330+
{
331+
if (IsDeploymentSet(cfg.deployment))
332+
{
333+
if (TryGetDeploymentDisplayName(envs, cfg.deployment, out var displayName))
334+
{
335+
deploymentName = displayName;
336+
}
337+
else
338+
{
339+
deploymentName = ShortenGuid(cfg.deployment.DeploymentId);
340+
}
341+
}
342+
else
343+
{
344+
deploymentName = "nameless";
345+
}
346+
347+
}
348+
349+
string text = $" {platformLabel} \n [{deploymentName}]";
350+
contents.Add(new GUIContent(text, editor.GetPlatformIconTexture()));
351+
}
352+
353+
return contents.ToArray();
267354
}
268355
}
269356
}

Assets/Plugins/Source/Editor/EditorWindows/InstallEOSZipWindow.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ static public void UnzipFile(string pathToZipFile, string dest)
128128

129129
protected override void Setup()
130130
{
131-
pathToImportDescDirectory = Path.Combine(FileSystemUtility.GetProjectPath(), "etc/EOSImportDesriptions");
131+
pathToImportDescDirectory = Path.Combine(FileSystemUtility.GetProjectPath(), "etc/EOSImportDescriptions");
132132
importInfoList = JsonUtility.FromJsonFile<PlatformImportInfoList>(Path.Combine(pathToImportDescDirectory, PlatformImportInfoListFileName));
133133
}
134134

0 commit comments

Comments
 (0)