app.hypergames.hypersdk 1.1.9 → 1.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/Editor/Scripts/Build/HyperPostBuildInjector.cs +14 -14
- package/Editor/Scripts/Setup/HyperSDKInstaller.cs +9 -15
- package/Editor/Scripts/Tools/HyperBuildAssistant.cs +160 -78
- package/Editor/Scripts/Utils/SceneReferenceDrawer.cs +67 -0
- package/Editor/Scripts/Utils/SceneReferenceDrawer.cs.meta +2 -0
- package/HyperLoader.unity +3 -3
- package/Runtime/Internal/Bootstrap/HyperLoader.cs +5 -5
- package/Runtime/Internal/Managers/GameManager.cs +11 -8
- package/Runtime/Internal/ScriptableObjects/HyperGameContentConfig.cs +5 -4
- package/Runtime/Internal/UI/Components/SafeArea.cs +1 -12
- package/Runtime/Internal/UI/Components/SnackBar.cs +4 -1
- package/Runtime/Internal/Utils/HyperConstants.cs +32 -2
- package/Runtime/Resources/HyperGameContentConfig.asset +6 -3
- package/Runtime/Resources/HyperSDKSettings.asset +1 -1
- package/Runtime/Resources/UIPrefabs/SnackBar.prefab +8 -8
- package/Runtime/Shared/Utils/SceneReference.cs +95 -0
- package/Runtime/Shared/Utils/SceneReference.cs.meta +2 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [1.1.10](https://github.com/mvmhyper/hyper-sdk/compare/v1.1.9...v1.1.10) (2025-11-26)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* installer path resolution, add SceneReference ([f73583c](https://github.com/mvmhyper/hyper-sdk/commit/f73583c5c44c91276a539fca4b511e7ec37717ad))
|
|
7
|
+
|
|
1
8
|
## [1.1.9](https://github.com/mvmhyper/hyper-sdk/compare/v1.1.8...v1.1.9) (2025-11-25)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -30,7 +30,7 @@ namespace Hyper.Editor
|
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
if (
|
|
33
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Action("Starting post-build injection...");
|
|
34
34
|
|
|
35
35
|
try
|
|
36
36
|
{
|
|
@@ -46,7 +46,7 @@ namespace Hyper.Editor
|
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
if (
|
|
49
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogSuccess("Post-build injection completed successfully!");
|
|
50
50
|
|
|
51
51
|
// Notify Build Assistant that build completed (works for any build, not just Build Assistant)
|
|
52
52
|
NotifyBuildCompleted(pathToBuiltProject);
|
|
@@ -61,7 +61,7 @@ namespace Hyper.Editor
|
|
|
61
61
|
{
|
|
62
62
|
try
|
|
63
63
|
{
|
|
64
|
-
if (
|
|
64
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Build completed. Storing build info: {buildPath}");
|
|
65
65
|
|
|
66
66
|
// Store build path in EditorPrefs (works even if Build Assistant window isn't open)
|
|
67
67
|
EditorPrefs.SetString("HyperSDK.LastBuildPath", buildPath);
|
|
@@ -72,17 +72,17 @@ namespace Hyper.Editor
|
|
|
72
72
|
{
|
|
73
73
|
long buildSize = CalculateBuildSize(buildPath);
|
|
74
74
|
EditorPrefs.SetString("HyperSDK.LastBuildSize", buildSize.ToString());
|
|
75
|
-
if (
|
|
75
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Build size calculated: {buildSize} bytes");
|
|
76
76
|
}
|
|
77
77
|
else
|
|
78
78
|
{
|
|
79
|
-
if (
|
|
79
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogWarning($"Build path does not exist: {buildPath}");
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
try
|
|
83
83
|
{
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
HyperBuildAssistant.ClearAssetBreakdownForManualBuild();
|
|
85
|
+
HyperBuildAssistant.OnBuildCompleted(buildPath);
|
|
86
86
|
}
|
|
87
87
|
catch (System.Exception)
|
|
88
88
|
{
|
|
@@ -166,7 +166,7 @@ namespace Hyper.Editor
|
|
|
166
166
|
manifest = InjectProductName(manifest);
|
|
167
167
|
|
|
168
168
|
File.WriteAllText(manifestPath, manifest);
|
|
169
|
-
if (
|
|
169
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogSuccess("Manifest.json updated successfully");
|
|
170
170
|
|
|
171
171
|
return true;
|
|
172
172
|
}
|
|
@@ -184,7 +184,7 @@ namespace Hyper.Editor
|
|
|
184
184
|
|
|
185
185
|
manifest = manifest.Replace("{{ACCEPTED_SCREEN_ORIENTATION}}", acceptedScreenOrientation);
|
|
186
186
|
|
|
187
|
-
if (
|
|
187
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Screen orientation set to: {(string.IsNullOrEmpty(acceptedScreenOrientation) ? "any" : acceptedScreenOrientation)}");
|
|
188
188
|
|
|
189
189
|
return manifest;
|
|
190
190
|
}
|
|
@@ -198,7 +198,7 @@ namespace Hyper.Editor
|
|
|
198
198
|
|
|
199
199
|
manifest = manifest.Replace("{{ACCEPTED_PLATFORM}}", acceptedPlatform);
|
|
200
200
|
|
|
201
|
-
if (
|
|
201
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Platform set to: {(string.IsNullOrEmpty(acceptedPlatform) ? "any" : acceptedPlatform)}");
|
|
202
202
|
|
|
203
203
|
return manifest;
|
|
204
204
|
}
|
|
@@ -213,12 +213,12 @@ namespace Hyper.Editor
|
|
|
213
213
|
if (!string.IsNullOrEmpty(exportedPath))
|
|
214
214
|
{
|
|
215
215
|
posterValue = $"\"{exportedPath}\"";
|
|
216
|
-
if (
|
|
216
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogSuccess($"Poster image exported to: {exportedPath}");
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
else
|
|
220
220
|
{
|
|
221
|
-
if (
|
|
221
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log("No poster image configured");
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
manifest = manifest.Replace("\"{{POSTER_PATH}}\"", posterValue);
|
|
@@ -238,7 +238,7 @@ namespace Hyper.Editor
|
|
|
238
238
|
|
|
239
239
|
manifest = manifest.Replace("{{BUILD_PATH}}", buildName);
|
|
240
240
|
|
|
241
|
-
if (
|
|
241
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Build path set to: {buildName}");
|
|
242
242
|
|
|
243
243
|
return manifest;
|
|
244
244
|
}
|
|
@@ -248,7 +248,7 @@ namespace Hyper.Editor
|
|
|
248
248
|
string productName = PlayerSettings.productName;
|
|
249
249
|
manifest = manifest.Replace("{{PRODUCT_NAME}}", productName);
|
|
250
250
|
|
|
251
|
-
if (
|
|
251
|
+
if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Product name set to: {productName}");
|
|
252
252
|
|
|
253
253
|
return manifest;
|
|
254
254
|
}
|
|
@@ -18,8 +18,9 @@ namespace Hyper.Editor
|
|
|
18
18
|
private const string WebGLTemplateDestination = "Assets/WebGLTemplates/HyperLoader";
|
|
19
19
|
private const string HyperGameContentConfigRelativePath = "Runtime/Resources/HyperGameContentConfig.asset";
|
|
20
20
|
private const string HyperSDKSettingsRelativePath = "Runtime/Resources/HyperSDKSettings.asset";
|
|
21
|
-
private const string HyperGameContentConfigDestination = "Assets/HyperSDK/Resources/HyperGameContentConfig.asset";
|
|
22
|
-
private const string HyperSDKSettingsDestination = "Assets/HyperSDK/Resources/HyperSDKSettings.asset";
|
|
21
|
+
private const string HyperGameContentConfigDestination = "Assets/HyperSDK/Runtime/Resources/HyperGameContentConfig.asset";
|
|
22
|
+
private const string HyperSDKSettingsDestination = "Assets/HyperSDK/Runtime/Resources/HyperSDKSettings.asset";
|
|
23
|
+
|
|
23
24
|
|
|
24
25
|
static HyperSDKInstaller()
|
|
25
26
|
{
|
|
@@ -63,20 +64,13 @@ namespace Hyper.Editor
|
|
|
63
64
|
var hyperGameContentConfigSource = Path.Combine(packageRoot, HyperGameContentConfigRelativePath);
|
|
64
65
|
var hyperSDKSettingsSource = Path.Combine(packageRoot, HyperSDKSettingsRelativePath);
|
|
65
66
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
CopyFileWithoutMeta(hyperGameContentConfigSource, HyperGameContentConfigDestination);
|
|
71
|
-
CopyFileWithoutMeta(hyperSDKSettingsSource, HyperSDKSettingsDestination);
|
|
67
|
+
CopyFileWithoutMeta(hyperLoaderSource, HyperLoaderSceneDestination);
|
|
68
|
+
CopyTemplate(templateSource);
|
|
69
|
+
CopyFileWithoutMeta(hyperGameContentConfigSource, HyperGameContentConfigDestination);
|
|
70
|
+
CopyFileWithoutMeta(hyperSDKSettingsSource, HyperSDKSettingsDestination);
|
|
72
71
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
catch (IOException ioException)
|
|
77
|
-
{
|
|
78
|
-
UnityEngine.Debug.LogWarning($"HyperSDK Installer: failed to copy setup assets. {ioException.Message}");
|
|
79
|
-
}
|
|
72
|
+
EditorPrefs.SetString(InstallerPrefsKey, packageInfo.version);
|
|
73
|
+
AssetDatabase.Refresh();
|
|
80
74
|
}
|
|
81
75
|
|
|
82
76
|
private static void CopyFileWithoutMeta(string sourcePath, string destinationPath)
|
|
@@ -137,7 +137,8 @@ namespace Hyper.Editor
|
|
|
137
137
|
if (stylesInitialized) return;
|
|
138
138
|
|
|
139
139
|
var tabBoxStyleTex = new Texture2D(1, 1);
|
|
140
|
-
|
|
140
|
+
ColorUtility.TryParseHtmlString("#66666633", out Color tabBoxColor);
|
|
141
|
+
tabBoxStyleTex.SetPixel(0, 0, tabBoxColor);
|
|
141
142
|
tabBoxStyleTex.Apply();
|
|
142
143
|
|
|
143
144
|
tabBoxStyle = new GUIStyle(EditorStyles.miniButtonRight)
|
|
@@ -148,14 +149,16 @@ namespace Hyper.Editor
|
|
|
148
149
|
};
|
|
149
150
|
|
|
150
151
|
var infoBoxStyleTex = new Texture2D(1, 1);
|
|
151
|
-
|
|
152
|
+
string infoBoxColorString = EditorGUIUtility.isProSkin ? "#7575751F" : "#B8B8B880";
|
|
153
|
+
ColorUtility.TryParseHtmlString(infoBoxColorString, out Color infoBoxColor);
|
|
154
|
+
infoBoxStyleTex.SetPixel(0, 0, infoBoxColor);
|
|
152
155
|
infoBoxStyleTex.Apply();
|
|
153
156
|
|
|
154
157
|
infoBoxStyle = new GUIStyle()
|
|
155
158
|
{
|
|
156
159
|
normal = { background = infoBoxStyleTex },
|
|
157
|
-
padding = new RectOffset(4, 4,
|
|
158
|
-
margin = new RectOffset(4, 4, 4,
|
|
160
|
+
padding = new RectOffset(4, 4, 4, 4),
|
|
161
|
+
margin = new RectOffset(4, 4, 4, 4)
|
|
159
162
|
};
|
|
160
163
|
|
|
161
164
|
var headerStyleTex = new Texture2D(1, 1);
|
|
@@ -182,21 +185,24 @@ namespace Hyper.Editor
|
|
|
182
185
|
margin = new RectOffset(5, 5, 5, 5)
|
|
183
186
|
};
|
|
184
187
|
|
|
188
|
+
ColorUtility.TryParseHtmlString("#1AB31A", out Color goodStatusColor);
|
|
185
189
|
goodStatusStyle = new GUIStyle(EditorStyles.label)
|
|
186
190
|
{
|
|
187
|
-
normal = { textColor =
|
|
191
|
+
normal = { textColor = goodStatusColor },
|
|
188
192
|
fontStyle = FontStyle.Bold
|
|
189
193
|
};
|
|
190
194
|
|
|
195
|
+
ColorUtility.TryParseHtmlString("#FF9900", out Color warningStatusColor);
|
|
191
196
|
warningStatusStyle = new GUIStyle(EditorStyles.label)
|
|
192
197
|
{
|
|
193
|
-
normal = { textColor =
|
|
198
|
+
normal = { textColor = warningStatusColor },
|
|
194
199
|
fontStyle = FontStyle.Bold
|
|
195
200
|
};
|
|
196
201
|
|
|
202
|
+
ColorUtility.TryParseHtmlString("#E64D4D", out Color errorStatusColor);
|
|
197
203
|
errorStatusStyle = new GUIStyle(EditorStyles.label)
|
|
198
204
|
{
|
|
199
|
-
normal = { textColor =
|
|
205
|
+
normal = { textColor = errorStatusColor },
|
|
200
206
|
fontStyle = FontStyle.Bold
|
|
201
207
|
};
|
|
202
208
|
|
|
@@ -305,49 +311,53 @@ namespace Hyper.Editor
|
|
|
305
311
|
{
|
|
306
312
|
EditorGUILayout.LabelField("Configuration Status", subHeaderStyle);
|
|
307
313
|
|
|
308
|
-
|
|
309
|
-
int configuredSettings = status.GetConfiguredSettings();
|
|
310
|
-
float percentage = (float)configuredSettings / totalSettings * 100f;
|
|
311
|
-
|
|
312
|
-
Color progressBarColor;
|
|
313
|
-
if (percentage == 100f)
|
|
314
|
-
{
|
|
315
|
-
progressBarColor = new Color(0.0f, 0.7f, 0.0f);
|
|
316
|
-
}
|
|
317
|
-
else if (outstandingSettings.Count > 0)
|
|
314
|
+
EditorGUILayout.BeginVertical(infoBoxStyle);
|
|
318
315
|
{
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
{
|
|
323
|
-
progressBarColor = new Color(1.0f, 0.6f, 0.0f);
|
|
324
|
-
}
|
|
325
|
-
else
|
|
326
|
-
{
|
|
327
|
-
progressBarColor = new Color(0.9f, 0.3f, 0.3f);
|
|
328
|
-
}
|
|
316
|
+
int totalSettings = status.GetTotalSettings();
|
|
317
|
+
int configuredSettings = status.GetConfiguredSettings();
|
|
318
|
+
float percentage = (float)configuredSettings / totalSettings * 100f;
|
|
329
319
|
|
|
330
|
-
|
|
331
|
-
|
|
320
|
+
Color progressBarColor;
|
|
321
|
+
if (percentage == 100f)
|
|
322
|
+
{
|
|
323
|
+
progressBarColor = new Color(0.0f, 0.7f, 0.0f);
|
|
324
|
+
}
|
|
325
|
+
else if (outstandingSettings.Count > 0)
|
|
326
|
+
{
|
|
327
|
+
progressBarColor = new Color(0.9f, 0.3f, 0.3f);
|
|
328
|
+
}
|
|
329
|
+
else if (percentage >= 70f)
|
|
330
|
+
{
|
|
331
|
+
progressBarColor = new Color(1.0f, 0.6f, 0.0f);
|
|
332
|
+
}
|
|
333
|
+
else
|
|
334
|
+
{
|
|
335
|
+
progressBarColor = new Color(0.9f, 0.3f, 0.3f);
|
|
336
|
+
}
|
|
332
337
|
|
|
333
|
-
|
|
338
|
+
Rect rect = EditorGUILayout.GetControlRect(false, 25);
|
|
339
|
+
DrawColoredProgressBar(rect, percentage / 100f, progressBarColor, $"{configuredSettings}/{totalSettings} Settings Configured ({percentage:F0}%)");
|
|
334
340
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
341
|
+
EditorGUILayout.Space(5);
|
|
342
|
+
|
|
343
|
+
if (percentage == 100f)
|
|
344
|
+
{
|
|
345
|
+
EditorGUILayout.LabelField("✓ All settings are optimally configured!", goodStatusStyle);
|
|
346
|
+
}
|
|
347
|
+
else if (outstandingSettings.Count > 0)
|
|
348
|
+
{
|
|
349
|
+
EditorGUILayout.LabelField($"❌ {outstandingSettings.Count} critical setting(s) need attention. Please fix these before building.", errorStatusStyle);
|
|
350
|
+
}
|
|
351
|
+
else if (percentage >= 70f)
|
|
352
|
+
{
|
|
353
|
+
EditorGUILayout.LabelField("⚠ Most settings configured, but some optimizations available", warningStatusStyle);
|
|
354
|
+
}
|
|
355
|
+
else
|
|
356
|
+
{
|
|
357
|
+
EditorGUILayout.LabelField("❌ Several settings need attention for optimal performance", errorStatusStyle);
|
|
358
|
+
}
|
|
350
359
|
}
|
|
360
|
+
EditorGUILayout.EndVertical();
|
|
351
361
|
}
|
|
352
362
|
EditorGUILayout.EndVertical();
|
|
353
363
|
}
|
|
@@ -558,6 +568,22 @@ namespace Hyper.Editor
|
|
|
558
568
|
};
|
|
559
569
|
CategorizeSettings(sceneIndexSetting, optimalSettings, recommendedSettings, outstandingSettings);
|
|
560
570
|
|
|
571
|
+
var colorSpaceSetting = new SettingInfo
|
|
572
|
+
{
|
|
573
|
+
name = "Color Space",
|
|
574
|
+
isOptimal = status.colorSpace == ColorSpace.Gamma,
|
|
575
|
+
current = $"• Current: {status.colorSpace}",
|
|
576
|
+
recommended = "• Recommended: Gamma",
|
|
577
|
+
description = "Gamma color space is recommended for WebGL builds as it provides better compatibility and performance on web platforms. Gamma is the legacy color space that works well with WebGL's rendering pipeline.",
|
|
578
|
+
priority = SettingPriority.Normal,
|
|
579
|
+
type = SettingType.ColorSpace
|
|
580
|
+
};
|
|
581
|
+
CategorizeSettings(colorSpaceSetting, optimalSettings, recommendedSettings, outstandingSettings);
|
|
582
|
+
|
|
583
|
+
// Note: Texture compression is platform-specific (Android/iOS) and not applicable to WebGL builds
|
|
584
|
+
// WebGL handles texture compression at runtime via browser support
|
|
585
|
+
// This setting is kept for reference but won't affect WebGL builds
|
|
586
|
+
|
|
561
587
|
DrawOutstandingSection(outstandingSettings);
|
|
562
588
|
DrawRecommendedSection(recommendedSettings);
|
|
563
589
|
DrawOptimalSection(optimalSettings);
|
|
@@ -688,6 +714,17 @@ namespace Hyper.Editor
|
|
|
688
714
|
type = SettingType.ShowSplashScreen
|
|
689
715
|
};
|
|
690
716
|
CategorizeSettings(splashScreenSetting, optimal, recommended, outstanding);
|
|
717
|
+
|
|
718
|
+
var colorSpaceSetting = new SettingInfo
|
|
719
|
+
{
|
|
720
|
+
name = "Color Space",
|
|
721
|
+
isOptimal = status.colorSpace == ColorSpace.Gamma,
|
|
722
|
+
priority = SettingPriority.Normal,
|
|
723
|
+
type = SettingType.ColorSpace
|
|
724
|
+
};
|
|
725
|
+
CategorizeSettings(colorSpaceSetting, optimal, recommended, outstanding);
|
|
726
|
+
|
|
727
|
+
// Note: Texture compression is platform-specific and not applicable to WebGL builds
|
|
691
728
|
}
|
|
692
729
|
|
|
693
730
|
private static void DrawOptimalSection(System.Collections.Generic.List<SettingInfo> settings)
|
|
@@ -1029,6 +1066,17 @@ namespace Hyper.Editor
|
|
|
1029
1066
|
HyperDebug.LogWarning($"Could not move HyperLoader scene: {e.Message}");
|
|
1030
1067
|
}
|
|
1031
1068
|
break;
|
|
1069
|
+
|
|
1070
|
+
case SettingType.ColorSpace:
|
|
1071
|
+
PlayerSettings.colorSpace = ColorSpace.Gamma;
|
|
1072
|
+
if (IsSDKDeveloper()) HyperDebug.LogSuccess("Applied: Color Space -> Gamma");
|
|
1073
|
+
break;
|
|
1074
|
+
|
|
1075
|
+
case SettingType.TextureCompression:
|
|
1076
|
+
// Texture compression is platform-specific (Android/iOS) and not applicable to WebGL
|
|
1077
|
+
// WebGL handles texture compression at runtime via browser support
|
|
1078
|
+
HyperDebug.LogWarning("Texture compression settings are not applicable to WebGL builds. WebGL handles texture compression automatically at runtime based on browser support.");
|
|
1079
|
+
break;
|
|
1032
1080
|
}
|
|
1033
1081
|
|
|
1034
1082
|
RepaintWindow();
|
|
@@ -1267,33 +1315,25 @@ namespace Hyper.Editor
|
|
|
1267
1315
|
GUILayout.ExpandHeight(true)
|
|
1268
1316
|
);
|
|
1269
1317
|
|
|
1270
|
-
|
|
1271
|
-
{
|
|
1272
|
-
bool isSDKDeveloper = IsSDKDeveloper();
|
|
1318
|
+
bool isSDKDeveloper = IsSDKDeveloper();
|
|
1273
1319
|
|
|
1320
|
+
// For SDK developers: show HyperSDK at the top
|
|
1321
|
+
// For client devs: show HyperSDK at the bottom
|
|
1322
|
+
if (hasSDKAssets && isSDKDeveloper)
|
|
1323
|
+
{
|
|
1274
1324
|
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
|
1275
1325
|
{
|
|
1276
1326
|
EditorGUILayout.BeginHorizontal();
|
|
1277
1327
|
{
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
true
|
|
1284
|
-
);
|
|
1285
|
-
}
|
|
1286
|
-
else
|
|
1287
|
-
{
|
|
1288
|
-
EditorGUILayout.LabelField(
|
|
1289
|
-
$"{SDK_CATEGORY} ({sdkAssets.Count} assets, {FormatBytes(sdkEstimatedSize)}{(hasFinalSize ? " est" : "")}, {sdkPercentage:F1}%)",
|
|
1290
|
-
EditorStyles.label
|
|
1291
|
-
);
|
|
1292
|
-
}
|
|
1328
|
+
categoryFoldoutStates[SDK_CATEGORY] = EditorGUILayout.Foldout(
|
|
1329
|
+
categoryFoldoutStates[SDK_CATEGORY],
|
|
1330
|
+
$"{SDK_CATEGORY} ({sdkAssets.Count} assets, {FormatBytes(sdkEstimatedSize)}{(hasFinalSize ? " est" : "")}, {sdkPercentage:F1}%)",
|
|
1331
|
+
true
|
|
1332
|
+
);
|
|
1293
1333
|
}
|
|
1294
1334
|
EditorGUILayout.EndHorizontal();
|
|
1295
1335
|
|
|
1296
|
-
if (
|
|
1336
|
+
if (categoryFoldoutStates[SDK_CATEGORY])
|
|
1297
1337
|
{
|
|
1298
1338
|
EditorGUILayout.Space(4);
|
|
1299
1339
|
|
|
@@ -1316,6 +1356,7 @@ namespace Hyper.Editor
|
|
|
1316
1356
|
EditorGUILayout.Space(4);
|
|
1317
1357
|
}
|
|
1318
1358
|
|
|
1359
|
+
// Show developer categories (always shown, ordered by size)
|
|
1319
1360
|
foreach (var categoryGroup in developerCategories.OrderByDescending(x => x.Value))
|
|
1320
1361
|
{
|
|
1321
1362
|
string category = categoryGroup.Key;
|
|
@@ -1374,6 +1415,23 @@ namespace Hyper.Editor
|
|
|
1374
1415
|
EditorGUILayout.Space(4);
|
|
1375
1416
|
}
|
|
1376
1417
|
|
|
1418
|
+
// For client devs: show HyperSDK at the bottom
|
|
1419
|
+
if (hasSDKAssets && !isSDKDeveloper)
|
|
1420
|
+
{
|
|
1421
|
+
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
|
1422
|
+
{
|
|
1423
|
+
EditorGUILayout.BeginHorizontal();
|
|
1424
|
+
{
|
|
1425
|
+
EditorGUILayout.LabelField(
|
|
1426
|
+
$"{SDK_CATEGORY} ({sdkAssets.Count} assets, {FormatBytes(sdkEstimatedSize)}{(hasFinalSize ? " est" : "")}, {sdkPercentage:F1}%)",
|
|
1427
|
+
EditorStyles.label
|
|
1428
|
+
);
|
|
1429
|
+
}
|
|
1430
|
+
EditorGUILayout.EndHorizontal();
|
|
1431
|
+
}
|
|
1432
|
+
EditorGUILayout.EndVertical();
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1377
1435
|
EditorGUILayout.EndScrollView();
|
|
1378
1436
|
}
|
|
1379
1437
|
|
|
@@ -1522,22 +1580,16 @@ namespace Hyper.Editor
|
|
|
1522
1580
|
internal static bool IsSDKDeveloper()
|
|
1523
1581
|
{
|
|
1524
1582
|
// Check if HyperSDKSyncTool exists (meaning we're in dev environment)
|
|
1525
|
-
bool hasSyncTool = false;
|
|
1526
1583
|
foreach (var assembly in System.AppDomain.CurrentDomain.GetAssemblies())
|
|
1527
1584
|
{
|
|
1528
1585
|
var type = assembly.GetType("HyperSDKSyncTool");
|
|
1529
1586
|
if (type != null)
|
|
1530
1587
|
{
|
|
1531
|
-
|
|
1532
|
-
break;
|
|
1588
|
+
return true;
|
|
1533
1589
|
}
|
|
1534
1590
|
}
|
|
1535
1591
|
|
|
1536
|
-
|
|
1537
|
-
if (!hasSyncTool) return false;
|
|
1538
|
-
|
|
1539
|
-
// If sync tool exists, check the user's preference (default = true)
|
|
1540
|
-
return EditorPrefs.GetBool("HyperSDK.DeveloperModeEnabled", true);
|
|
1592
|
+
return false;
|
|
1541
1593
|
}
|
|
1542
1594
|
|
|
1543
1595
|
private static void DrawAssetRows(
|
|
@@ -2441,7 +2493,9 @@ namespace Hyper.Editor
|
|
|
2441
2493
|
NameFilesAsHashes,
|
|
2442
2494
|
DecompressionFallback,
|
|
2443
2495
|
MemoryGrowthMode,
|
|
2444
|
-
ShowSplashScreen
|
|
2496
|
+
ShowSplashScreen,
|
|
2497
|
+
ColorSpace,
|
|
2498
|
+
TextureCompression
|
|
2445
2499
|
}
|
|
2446
2500
|
|
|
2447
2501
|
private class SettingInfo
|
|
@@ -2473,9 +2527,11 @@ namespace Hyper.Editor
|
|
|
2473
2527
|
public bool nameFilesAsHashes;
|
|
2474
2528
|
public bool decompressionFallback;
|
|
2475
2529
|
public string memoryGrowthMode; // "None", "Linear", "Geometric"
|
|
2530
|
+
public ColorSpace colorSpace;
|
|
2531
|
+
public TextureImporterFormat textureCompression;
|
|
2476
2532
|
public bool showSplashScreen;
|
|
2477
2533
|
|
|
2478
|
-
public int GetTotalSettings() =>
|
|
2534
|
+
public int GetTotalSettings() => 16;
|
|
2479
2535
|
|
|
2480
2536
|
public int GetConfiguredSettings()
|
|
2481
2537
|
{
|
|
@@ -2497,6 +2553,7 @@ namespace Hyper.Editor
|
|
|
2497
2553
|
// Code Optimization and IL2CPP Code Generation removed - developer choices
|
|
2498
2554
|
if (IsHyperLoaderTemplate(webGLTemplate)) count++;
|
|
2499
2555
|
if (hyperLoaderAtIndex0) count++;
|
|
2556
|
+
if (colorSpace == ColorSpace.Gamma) count++;
|
|
2500
2557
|
|
|
2501
2558
|
return count;
|
|
2502
2559
|
}
|
|
@@ -2647,6 +2704,13 @@ namespace Hyper.Editor
|
|
|
2647
2704
|
}
|
|
2648
2705
|
catch { /* Ignore if properties don't exist in this Unity version */ }
|
|
2649
2706
|
|
|
2707
|
+
// Get Color Space
|
|
2708
|
+
ColorSpace currentColorSpace = PlayerSettings.colorSpace;
|
|
2709
|
+
|
|
2710
|
+
// Texture compression is not applicable to WebGL - browsers handle it at runtime
|
|
2711
|
+
// Setting to Automatic as placeholder (not used for WebGL)
|
|
2712
|
+
TextureImporterFormat defaultTexFormat = TextureImporterFormat.Automatic;
|
|
2713
|
+
|
|
2650
2714
|
return new WebGLSettingsStatus
|
|
2651
2715
|
{
|
|
2652
2716
|
compressionFormat = PlayerSettings.WebGL.compressionFormat,
|
|
@@ -2665,7 +2729,9 @@ namespace Hyper.Editor
|
|
|
2665
2729
|
nameFilesAsHashes = nameAsHashes,
|
|
2666
2730
|
decompressionFallback = decompFallback,
|
|
2667
2731
|
memoryGrowthMode = memGrowthMode,
|
|
2668
|
-
showSplashScreen = PlayerSettings.SplashScreen.show
|
|
2732
|
+
showSplashScreen = PlayerSettings.SplashScreen.show,
|
|
2733
|
+
colorSpace = currentColorSpace,
|
|
2734
|
+
textureCompression = defaultTexFormat
|
|
2669
2735
|
};
|
|
2670
2736
|
}
|
|
2671
2737
|
|
|
@@ -2741,7 +2807,6 @@ namespace Hyper.Editor
|
|
|
2741
2807
|
}
|
|
2742
2808
|
|
|
2743
2809
|
if (assetPath.StartsWith("Library/") ||
|
|
2744
|
-
assetPath.StartsWith("Packages/com.unity.") ||
|
|
2745
2810
|
assetPath.StartsWith("Resources/unity_builtin") ||
|
|
2746
2811
|
assetPath.Contains("Built-in") ||
|
|
2747
2812
|
string.IsNullOrEmpty(assetPath))
|
|
@@ -2749,7 +2814,14 @@ namespace Hyper.Editor
|
|
|
2749
2814
|
continue;
|
|
2750
2815
|
}
|
|
2751
2816
|
|
|
2752
|
-
|
|
2817
|
+
// Include Assets/ and Packages/app.hypergames.hypersdk/ (our SDK package)
|
|
2818
|
+
// Filter out other Unity packages (com.unity.*)
|
|
2819
|
+
if (assetPath.StartsWith("Packages/com.unity."))
|
|
2820
|
+
{
|
|
2821
|
+
continue;
|
|
2822
|
+
}
|
|
2823
|
+
|
|
2824
|
+
if (!assetPath.StartsWith("Assets/") && !assetPath.StartsWith("Packages/app.hypergames.hypersdk/"))
|
|
2753
2825
|
{
|
|
2754
2826
|
continue;
|
|
2755
2827
|
}
|
|
@@ -2811,12 +2883,22 @@ namespace Hyper.Editor
|
|
|
2811
2883
|
private static string CategorizeAsset(string assetPath, System.Type assetType)
|
|
2812
2884
|
{
|
|
2813
2885
|
// WebGLTemplates files are NOT in BuildReport (copied post-build)
|
|
2814
|
-
// HyperSDK
|
|
2886
|
+
// HyperSDK categorization:
|
|
2887
|
+
// - SDK dev mode: Assets/HyperSDK/ and Assets/WebGLTemplates/
|
|
2888
|
+
// - Client dev mode: Packages/app.hypergames.hypersdk/ (UPM package)
|
|
2889
|
+
bool isSDKDev = IsSDKDeveloper();
|
|
2890
|
+
|
|
2815
2891
|
if (assetPath.StartsWith("Assets/HyperSDK/", System.StringComparison.OrdinalIgnoreCase) ||
|
|
2816
2892
|
assetPath.StartsWith("Assets/WebGLTemplates/", System.StringComparison.OrdinalIgnoreCase))
|
|
2817
2893
|
{
|
|
2818
2894
|
return "HyperSDK";
|
|
2819
2895
|
}
|
|
2896
|
+
|
|
2897
|
+
// Only include package path for client devs (not SDK developers)
|
|
2898
|
+
if (!isSDKDev && assetPath.StartsWith("Packages/app.hypergames.hypersdk/", System.StringComparison.OrdinalIgnoreCase))
|
|
2899
|
+
{
|
|
2900
|
+
return "HyperSDK";
|
|
2901
|
+
}
|
|
2820
2902
|
|
|
2821
2903
|
string extension = System.IO.Path.GetExtension(assetPath).ToLower();
|
|
2822
2904
|
if (assetType != null)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#if UNITY_EDITOR
|
|
2
|
+
using UnityEditor;
|
|
3
|
+
using UnityEngine;
|
|
4
|
+
using Hyper.Shared;
|
|
5
|
+
|
|
6
|
+
namespace Hyper.Editor
|
|
7
|
+
{
|
|
8
|
+
/// <summary>
|
|
9
|
+
/// Custom property drawer for SceneReference that allows drag-and-drop scene assignment.
|
|
10
|
+
/// </summary>
|
|
11
|
+
[CustomPropertyDrawer(typeof(SceneReference))]
|
|
12
|
+
public class SceneReferenceDrawer : PropertyDrawer
|
|
13
|
+
{
|
|
14
|
+
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
|
15
|
+
{
|
|
16
|
+
EditorGUI.BeginProperty(position, label, property);
|
|
17
|
+
|
|
18
|
+
SerializedProperty guidProperty = property.FindPropertyRelative("sceneGUID");
|
|
19
|
+
if (guidProperty == null)
|
|
20
|
+
{
|
|
21
|
+
EditorGUI.LabelField(position, label.text, "SceneReference: Invalid property structure");
|
|
22
|
+
EditorGUI.EndProperty();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
string currentGUID = guidProperty.stringValue;
|
|
27
|
+
string currentPath = string.IsNullOrEmpty(currentGUID)
|
|
28
|
+
? null
|
|
29
|
+
: AssetDatabase.GUIDToAssetPath(currentGUID);
|
|
30
|
+
|
|
31
|
+
// Get current scene asset if valid
|
|
32
|
+
SceneAsset currentScene = null;
|
|
33
|
+
if (!string.IsNullOrEmpty(currentPath))
|
|
34
|
+
{
|
|
35
|
+
currentScene = AssetDatabase.LoadAssetAtPath<SceneAsset>(currentPath);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Draw object field for scene
|
|
39
|
+
SceneAsset newScene = EditorGUI.ObjectField(
|
|
40
|
+
position,
|
|
41
|
+
label,
|
|
42
|
+
currentScene,
|
|
43
|
+
typeof(SceneAsset),
|
|
44
|
+
false
|
|
45
|
+
) as SceneAsset;
|
|
46
|
+
|
|
47
|
+
// Update GUID if scene changed
|
|
48
|
+
if (newScene != currentScene)
|
|
49
|
+
{
|
|
50
|
+
if (newScene != null)
|
|
51
|
+
{
|
|
52
|
+
string newPath = AssetDatabase.GetAssetPath(newScene);
|
|
53
|
+
string newGUID = AssetDatabase.AssetPathToGUID(newPath);
|
|
54
|
+
guidProperty.stringValue = newGUID;
|
|
55
|
+
}
|
|
56
|
+
else
|
|
57
|
+
{
|
|
58
|
+
guidProperty.stringValue = string.Empty;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
EditorGUI.EndProperty();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
#endif
|
|
67
|
+
|
package/HyperLoader.unity
CHANGED
|
@@ -669,7 +669,7 @@ MonoBehaviour:
|
|
|
669
669
|
m_Name:
|
|
670
670
|
m_EditorClassIdentifier:
|
|
671
671
|
m_AspectMode: 0
|
|
672
|
-
m_AspectRatio: 0.
|
|
672
|
+
m_AspectRatio: 0.46165884
|
|
673
673
|
--- !u!1 &948186152
|
|
674
674
|
GameObject:
|
|
675
675
|
m_ObjectHideFlags: 0
|
|
@@ -1539,8 +1539,8 @@ RectTransform:
|
|
|
1539
1539
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
1540
1540
|
m_AnchorMin: {x: 0, y: 0}
|
|
1541
1541
|
m_AnchorMax: {x: 1, y: 1}
|
|
1542
|
-
m_AnchoredPosition: {x: 0.09716797, y: -
|
|
1543
|
-
m_SizeDelta: {x: -15.3633, y: -
|
|
1542
|
+
m_AnchoredPosition: {x: 0.09716797, y: -1.1364162}
|
|
1543
|
+
m_SizeDelta: {x: -15.3633, y: -8.8209}
|
|
1544
1544
|
m_Pivot: {x: 0.5, y: 0.5}
|
|
1545
1545
|
--- !u!224 &5943681541187729561 stripped
|
|
1546
1546
|
RectTransform:
|
|
@@ -217,7 +217,7 @@ namespace Hyper.Internal
|
|
|
217
217
|
|
|
218
218
|
private IEnumerator InitializeBackendGame(float progress)
|
|
219
219
|
{
|
|
220
|
-
_targetSceneName = _gameContentConfig.GameScene;
|
|
220
|
+
_targetSceneName = _gameContentConfig.GameScene?.SceneName;
|
|
221
221
|
|
|
222
222
|
// Initialize WebSocket
|
|
223
223
|
HyperRuntime.BackendManager.InitializeWebSocket();
|
|
@@ -252,7 +252,7 @@ namespace Hyper.Internal
|
|
|
252
252
|
|
|
253
253
|
private void InitializeNonBackendBattle()
|
|
254
254
|
{
|
|
255
|
-
_targetSceneName = _gameContentConfig.GameScene;
|
|
255
|
+
_targetSceneName = _gameContentConfig.GameScene?.SceneName;
|
|
256
256
|
long seed = GetRandomSeed();
|
|
257
257
|
_backendManager.RegisterSeed(seed);
|
|
258
258
|
}
|
|
@@ -261,9 +261,9 @@ namespace Hyper.Internal
|
|
|
261
261
|
{
|
|
262
262
|
long seed = GetRandomSeed();
|
|
263
263
|
_backendManager.RegisterSeed(seed);
|
|
264
|
-
_targetSceneName = !string.IsNullOrWhiteSpace(_gameContentConfig.PracticeScene)
|
|
265
|
-
? _gameContentConfig.PracticeScene
|
|
266
|
-
: _gameContentConfig.GameScene;
|
|
264
|
+
_targetSceneName = !string.IsNullOrWhiteSpace(_gameContentConfig.PracticeScene?.SceneName)
|
|
265
|
+
? _gameContentConfig.PracticeScene.SceneName
|
|
266
|
+
: _gameContentConfig.GameScene?.SceneName;
|
|
267
267
|
}
|
|
268
268
|
|
|
269
269
|
private long GetRandomSeed()
|
|
@@ -326,18 +326,18 @@ namespace Hyper.Internal.Managers
|
|
|
326
326
|
}
|
|
327
327
|
else
|
|
328
328
|
{
|
|
329
|
-
SceneManager.LoadScene(HyperRuntime.GameContent.PracticeScene);
|
|
329
|
+
SceneManager.LoadScene(HyperRuntime.GameContent.PracticeScene?.SceneName);
|
|
330
330
|
}
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
private IEnumerator PracticeMenuLoadingCoroutine()
|
|
334
334
|
{
|
|
335
|
-
yield return LoadAsyncScene(HyperRuntime.GameContent.TransitionScene, LoadSceneMode.Additive);
|
|
335
|
+
yield return LoadAsyncScene(HyperRuntime.GameContent.TransitionScene?.SceneName, LoadSceneMode.Additive);
|
|
336
336
|
#if UNITY_EDITOR
|
|
337
337
|
yield return new WaitForSecondsRealtime(1f);
|
|
338
338
|
#endif
|
|
339
339
|
yield return UnloadAsyncScene(SceneManager.GetActiveScene().name);
|
|
340
|
-
yield return LoadAsyncScene(HyperRuntime.GameContent.PracticeScene, LoadSceneMode.Single);
|
|
340
|
+
yield return LoadAsyncScene(HyperRuntime.GameContent.PracticeScene?.SceneName, LoadSceneMode.Single);
|
|
341
341
|
}
|
|
342
342
|
|
|
343
343
|
private IEnumerator UnloadAsyncScene(string sceneName)
|
|
@@ -583,7 +583,10 @@ namespace Hyper.Internal.Managers
|
|
|
583
583
|
private void OnDisable()
|
|
584
584
|
{
|
|
585
585
|
SceneManager.sceneLoaded -= OnSceneLoaded;
|
|
586
|
-
HyperRuntime.EventManager
|
|
586
|
+
if (HyperRuntime.EventManager != null)
|
|
587
|
+
{
|
|
588
|
+
HyperRuntime.EventManager.OnGameStart -= HandleGameStarted;
|
|
589
|
+
}
|
|
587
590
|
}
|
|
588
591
|
|
|
589
592
|
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
|
|
@@ -592,11 +595,11 @@ namespace Hyper.Internal.Managers
|
|
|
592
595
|
_dataManager.ConfigurePlayerSoundSetting();
|
|
593
596
|
|
|
594
597
|
string menuSceneName = HyperRuntime.GameContent.IsPracticeMenu ?
|
|
595
|
-
HyperRuntime.GameContent.PracticeScene : null;
|
|
596
|
-
string transitionSceneName = HyperRuntime.GameContent.TransitionScene;
|
|
598
|
+
HyperRuntime.GameContent.PracticeScene?.SceneName : null;
|
|
599
|
+
string transitionSceneName = HyperRuntime.GameContent.TransitionScene?.SceneName;
|
|
597
600
|
|
|
598
|
-
if (scene.name.Equals(menuSceneName, StringComparison.OrdinalIgnoreCase) ||
|
|
599
|
-
scene.name.Equals(transitionSceneName, StringComparison.OrdinalIgnoreCase))
|
|
601
|
+
if ((!string.IsNullOrEmpty(menuSceneName) && scene.name.Equals(menuSceneName, StringComparison.OrdinalIgnoreCase)) ||
|
|
602
|
+
(!string.IsNullOrEmpty(transitionSceneName) && scene.name.Equals(transitionSceneName, StringComparison.OrdinalIgnoreCase)))
|
|
600
603
|
{
|
|
601
604
|
HideTopBarElements();
|
|
602
605
|
return;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
using UnityEngine;
|
|
2
|
+
using Hyper.Shared;
|
|
2
3
|
|
|
3
4
|
namespace Hyper.Internal
|
|
4
5
|
{
|
|
@@ -12,7 +13,7 @@ namespace Hyper.Internal
|
|
|
12
13
|
[Header("Battle Mode")]
|
|
13
14
|
[Tooltip("BATTLE mode → Gameplay Scene: go straight into the match (no menu) after the loading screen.")]
|
|
14
15
|
[Space(2)]
|
|
15
|
-
public
|
|
16
|
+
public SceneReference GameScene;
|
|
16
17
|
|
|
17
18
|
#endregion
|
|
18
19
|
|
|
@@ -21,7 +22,7 @@ namespace Hyper.Internal
|
|
|
21
22
|
[Header("Practice Mode")]
|
|
22
23
|
[Tooltip("PRACTICE mode → Menu Scene: open a menu after the loading screen so players can choose stage/options.")]
|
|
23
24
|
[Space(2)]
|
|
24
|
-
public
|
|
25
|
+
public SceneReference PracticeScene;
|
|
25
26
|
|
|
26
27
|
public PracticeSceneType PracticeSceneType = PracticeSceneType.Menu;
|
|
27
28
|
|
|
@@ -38,13 +39,13 @@ namespace Hyper.Internal
|
|
|
38
39
|
[Header("Scene Transitions")]
|
|
39
40
|
[Tooltip("Optional: Scene used for transitions or loading between other scenes.")]
|
|
40
41
|
[Space(2)]
|
|
41
|
-
public
|
|
42
|
+
public SceneReference TransitionScene;
|
|
42
43
|
|
|
43
44
|
/// <summary>
|
|
44
45
|
/// Returns true if transition scene exists.
|
|
45
46
|
/// </summary>
|
|
46
47
|
[HideInInspector]
|
|
47
|
-
public bool HasTransitionScene =>
|
|
48
|
+
public bool HasTransitionScene => TransitionScene != null && TransitionScene.IsValid;
|
|
48
49
|
|
|
49
50
|
#endregion
|
|
50
51
|
|
|
@@ -32,17 +32,6 @@ namespace Hyper.Internal
|
|
|
32
32
|
private void Awake()
|
|
33
33
|
{
|
|
34
34
|
_gameManager = HyperRuntime.GameManager;
|
|
35
|
-
Camera mainCamera = Camera.main;
|
|
36
|
-
|
|
37
|
-
if (mainCamera != null)
|
|
38
|
-
{
|
|
39
|
-
mainCamera.clearFlags = CameraClearFlags.SolidColor;
|
|
40
|
-
|
|
41
|
-
if (_gameManager.ControlBarTheme == ControlBarTheme.Dark)
|
|
42
|
-
mainCamera.backgroundColor = Color.black;
|
|
43
|
-
else if (_gameManager.ControlBarTheme == ControlBarTheme.Light)
|
|
44
|
-
mainCamera.backgroundColor = Color.black; //mainCamera.backgroundColor = HexToColor("#F5F5F5");
|
|
45
|
-
}
|
|
46
35
|
|
|
47
36
|
rectTransform = GetComponent<RectTransform>();
|
|
48
37
|
|
|
@@ -56,7 +45,7 @@ namespace Hyper.Internal
|
|
|
56
45
|
maxAnchor = minAnchor + safeArea.size;
|
|
57
46
|
|
|
58
47
|
minAnchor.x /= Screen.width;
|
|
59
|
-
minAnchor.y
|
|
48
|
+
minAnchor.y = 0;
|
|
60
49
|
maxAnchor.x /= Screen.width;
|
|
61
50
|
maxAnchor.y /= Screen.height;
|
|
62
51
|
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
#if UNITY_EDITOR
|
|
2
|
+
using UnityEditor;
|
|
3
|
+
#endif
|
|
4
|
+
|
|
1
5
|
namespace Hyper.Internal
|
|
2
6
|
{
|
|
3
7
|
/// <summary>
|
|
@@ -32,8 +36,34 @@ namespace Hyper.Internal
|
|
|
32
36
|
#if UNITY_EDITOR
|
|
33
37
|
public const string SETTINGS_ASSET_PATH = "Assets/HyperSDK/Runtime/Resources/HyperSDKSettings.asset";
|
|
34
38
|
public const string GAME_CONTENT_ASSET_PATH = "Assets/HyperSDK/Runtime/Resources/HyperGameContentConfig.asset";
|
|
35
|
-
public const string RESOURCES_FOLDER_PATH = "Assets/Resources";
|
|
36
|
-
|
|
39
|
+
public const string RESOURCES_FOLDER_PATH = "Assets/HyperSDK/Runtime/Resources";
|
|
40
|
+
|
|
41
|
+
/// <summary>
|
|
42
|
+
/// Returns the banner texture path, checking dev mode (Assets/) first, then package mode (Packages/).
|
|
43
|
+
/// </summary>
|
|
44
|
+
public static string BANNER_TEXTURE_PATH
|
|
45
|
+
{
|
|
46
|
+
get
|
|
47
|
+
{
|
|
48
|
+
const string devPath = "Assets/HyperSDK/Editor/Resources/HyperBanner.png";
|
|
49
|
+
const string packagePath = "Packages/app.hypergames.hypersdk/Editor/Resources/HyperBanner.png";
|
|
50
|
+
|
|
51
|
+
// Check dev mode first (Assets/)
|
|
52
|
+
if (AssetDatabase.LoadAssetAtPath<UnityEngine.Texture2D>(devPath) != null)
|
|
53
|
+
{
|
|
54
|
+
return devPath;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Fall back to package mode (Packages/)
|
|
58
|
+
if (AssetDatabase.LoadAssetAtPath<UnityEngine.Texture2D>(packagePath) != null)
|
|
59
|
+
{
|
|
60
|
+
return packagePath;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Default to dev path if neither found (for backwards compatibility)
|
|
64
|
+
return devPath;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
37
67
|
#endif
|
|
38
68
|
|
|
39
69
|
#endregion
|
|
@@ -12,8 +12,11 @@ MonoBehaviour:
|
|
|
12
12
|
m_Script: {fileID: 11500000, guid: d7755d71e4323fb4e93fd4fcac8588ac, type: 3}
|
|
13
13
|
m_Name: HyperGameContentConfig
|
|
14
14
|
m_EditorClassIdentifier:
|
|
15
|
-
GameScene:
|
|
16
|
-
|
|
15
|
+
GameScene:
|
|
16
|
+
sceneGUID:
|
|
17
|
+
PracticeScene:
|
|
18
|
+
sceneGUID:
|
|
17
19
|
PracticeSceneType: 0
|
|
18
|
-
TransitionScene:
|
|
20
|
+
TransitionScene:
|
|
21
|
+
sceneGUID:
|
|
19
22
|
gamePosterSprite: {fileID: 0}
|
|
@@ -174,7 +174,7 @@ RectTransform:
|
|
|
174
174
|
m_AnchorMin: {x: 0, y: 0}
|
|
175
175
|
m_AnchorMax: {x: 0, y: 0}
|
|
176
176
|
m_AnchoredPosition: {x: 0, y: 0}
|
|
177
|
-
m_SizeDelta: {x: 51.5, y:
|
|
177
|
+
m_SizeDelta: {x: 51.5, y: 44.2169}
|
|
178
178
|
m_Pivot: {x: 0.5, y: 0.5}
|
|
179
179
|
--- !u!222 &6181031279965490734
|
|
180
180
|
CanvasRenderer:
|
|
@@ -325,8 +325,8 @@ RectTransform:
|
|
|
325
325
|
m_LocalEulerAnglesHint: {x: 0, y: -0, z: -0}
|
|
326
326
|
m_AnchorMin: {x: 0, y: 1}
|
|
327
327
|
m_AnchorMax: {x: 0, y: 1}
|
|
328
|
-
m_AnchoredPosition: {x:
|
|
329
|
-
m_SizeDelta: {x:
|
|
328
|
+
m_AnchoredPosition: {x: 199.7, y: -10.5}
|
|
329
|
+
m_SizeDelta: {x: 276.4, y: 0}
|
|
330
330
|
m_Pivot: {x: 0.5, y: 0.5}
|
|
331
331
|
--- !u!222 &8979309464556769080
|
|
332
332
|
CanvasRenderer:
|
|
@@ -383,12 +383,12 @@ MonoBehaviour:
|
|
|
383
383
|
m_faceColor:
|
|
384
384
|
serializedVersion: 2
|
|
385
385
|
rgba: 4294967295
|
|
386
|
-
m_fontSize:
|
|
386
|
+
m_fontSize: 35
|
|
387
387
|
m_fontSizeBase: 32.5
|
|
388
388
|
m_fontWeight: 400
|
|
389
|
-
m_enableAutoSizing:
|
|
389
|
+
m_enableAutoSizing: 1
|
|
390
390
|
m_fontSizeMin: 18
|
|
391
|
-
m_fontSizeMax:
|
|
391
|
+
m_fontSizeMax: 35
|
|
392
392
|
m_fontStyle: 32
|
|
393
393
|
m_HorizontalAlignment: 1
|
|
394
394
|
m_VerticalAlignment: 256
|
|
@@ -421,7 +421,7 @@ MonoBehaviour:
|
|
|
421
421
|
m_VertexBufferAutoSizeReduction: 0
|
|
422
422
|
m_useMaxVisibleDescender: 1
|
|
423
423
|
m_pageToDisplay: 1
|
|
424
|
-
m_margin: {x: 0, y:
|
|
424
|
+
m_margin: {x: 0, y: 4.69, z: 0, w: 0}
|
|
425
425
|
m_isUsingLegacyAnimationComponent: 0
|
|
426
426
|
m_isVolumetricText: 0
|
|
427
427
|
m_hasFontAssetChanged: 0
|
|
@@ -648,7 +648,7 @@ MonoBehaviour:
|
|
|
648
648
|
m_VertexBufferAutoSizeReduction: 0
|
|
649
649
|
m_useMaxVisibleDescender: 1
|
|
650
650
|
m_pageToDisplay: 1
|
|
651
|
-
m_margin: {x: 0, y:
|
|
651
|
+
m_margin: {x: 0, y: 4.69, z: 0, w: 0}
|
|
652
652
|
m_isUsingLegacyAnimationComponent: 0
|
|
653
653
|
m_isVolumetricText: 0
|
|
654
654
|
m_hasFontAssetChanged: 0
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using UnityEngine;
|
|
3
|
+
|
|
4
|
+
namespace Hyper.Shared
|
|
5
|
+
{
|
|
6
|
+
/// <summary>
|
|
7
|
+
/// Serializable scene reference that stores scene GUID and provides scene name access.
|
|
8
|
+
/// Allows drag-and-drop scene assignment in the inspector without external dependencies.
|
|
9
|
+
/// </summary>
|
|
10
|
+
[Serializable]
|
|
11
|
+
public class SceneReference
|
|
12
|
+
{
|
|
13
|
+
[SerializeField]
|
|
14
|
+
private string sceneGUID;
|
|
15
|
+
|
|
16
|
+
/// <summary>
|
|
17
|
+
/// Gets the scene name from the GUID, or null if invalid.
|
|
18
|
+
/// </summary>
|
|
19
|
+
public string SceneName
|
|
20
|
+
{
|
|
21
|
+
get
|
|
22
|
+
{
|
|
23
|
+
if (string.IsNullOrEmpty(sceneGUID))
|
|
24
|
+
{
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
#if UNITY_EDITOR
|
|
29
|
+
string assetPath = UnityEditor.AssetDatabase.GUIDToAssetPath(sceneGUID);
|
|
30
|
+
if (string.IsNullOrEmpty(assetPath))
|
|
31
|
+
{
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Extract scene name from path (e.g., "Assets/Scenes/MyScene.unity" -> "MyScene")
|
|
36
|
+
string sceneName = System.IO.Path.GetFileNameWithoutExtension(assetPath);
|
|
37
|
+
return sceneName;
|
|
38
|
+
#else
|
|
39
|
+
// In builds, we can't resolve GUIDs, so return null
|
|
40
|
+
return null;
|
|
41
|
+
#endif
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// <summary>
|
|
46
|
+
/// Gets the scene GUID.
|
|
47
|
+
/// </summary>
|
|
48
|
+
public string GUID => sceneGUID;
|
|
49
|
+
|
|
50
|
+
/// <summary>
|
|
51
|
+
/// Returns true if the scene reference is valid (has a GUID and resolves to a scene).
|
|
52
|
+
/// </summary>
|
|
53
|
+
public bool IsValid
|
|
54
|
+
{
|
|
55
|
+
get
|
|
56
|
+
{
|
|
57
|
+
if (string.IsNullOrEmpty(sceneGUID))
|
|
58
|
+
{
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
#if UNITY_EDITOR
|
|
63
|
+
string assetPath = UnityEditor.AssetDatabase.GUIDToAssetPath(sceneGUID);
|
|
64
|
+
if (string.IsNullOrEmpty(assetPath))
|
|
65
|
+
{
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Check if it's actually a scene file
|
|
70
|
+
return assetPath.EndsWith(".unity", System.StringComparison.OrdinalIgnoreCase);
|
|
71
|
+
#else
|
|
72
|
+
// In builds, assume valid if GUID exists (can't verify without AssetDatabase)
|
|
73
|
+
return true;
|
|
74
|
+
#endif
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// <summary>
|
|
79
|
+
/// Implicit conversion to string for backward compatibility.
|
|
80
|
+
/// </summary>
|
|
81
|
+
public static implicit operator string(SceneReference sceneRef)
|
|
82
|
+
{
|
|
83
|
+
return sceneRef?.SceneName;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// <summary>
|
|
87
|
+
/// Returns the scene name, or empty string if invalid.
|
|
88
|
+
/// </summary>
|
|
89
|
+
public override string ToString()
|
|
90
|
+
{
|
|
91
|
+
return SceneName ?? string.Empty;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "app.hypergames.hypersdk",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.10",
|
|
4
4
|
"displayName": "HyperSDK",
|
|
5
5
|
"description": "Official Unity SDK for HyperGames. Brings platform APIs, multiplayer battle flow, score and tutorial systems, and WebGL build tooling straight into your project.",
|
|
6
6
|
"unity": "6000.0",
|