app.hypergames.hypersdk 1.1.8 → 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 CHANGED
@@ -1,3 +1,17 @@
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
+
8
+ ## [1.1.9](https://github.com/mvmhyper/hyper-sdk/compare/v1.1.8...v1.1.9) (2025-11-25)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * expand HyperSDK installer asset copy ([100bc92](https://github.com/mvmhyper/hyper-sdk/commit/100bc92434498683e885f2d852263b5c1b15edf1))
14
+
1
15
  ## [1.1.8](https://github.com/mvmhyper/hyper-sdk/compare/v1.1.7...v1.1.8) (2025-11-25)
2
16
 
3
17
 
@@ -30,7 +30,7 @@ namespace Hyper.Editor
30
30
  return;
31
31
  }
32
32
 
33
- if (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Action("Starting post-build injection...");
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 (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogSuccess("Post-build injection completed successfully!");
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 (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Build completed. Storing build info: {buildPath}");
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 (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Build size calculated: {buildSize} bytes");
75
+ if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Build size calculated: {buildSize} bytes");
76
76
  }
77
77
  else
78
78
  {
79
- if (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogWarning($"Build path does not exist: {buildPath}");
79
+ if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogWarning($"Build path does not exist: {buildPath}");
80
80
  }
81
81
 
82
82
  try
83
83
  {
84
- Hyper.Editor.HyperBuildAssistant.ClearAssetBreakdownForManualBuild();
85
- Hyper.Editor.HyperBuildAssistant.OnBuildCompleted(buildPath);
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 (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogSuccess("Manifest.json updated successfully");
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 (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Screen orientation set to: {(string.IsNullOrEmpty(acceptedScreenOrientation) ? "any" : acceptedScreenOrientation)}");
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 (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Platform set to: {(string.IsNullOrEmpty(acceptedPlatform) ? "any" : acceptedPlatform)}");
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 (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogSuccess($"Poster image exported to: {exportedPath}");
216
+ if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.LogSuccess($"Poster image exported to: {exportedPath}");
217
217
  }
218
218
  }
219
219
  else
220
220
  {
221
- if (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log("No poster image configured");
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 (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Build path set to: {buildName}");
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 (Hyper.Editor.HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Product name set to: {productName}");
251
+ if (HyperBuildAssistant.IsSDKDeveloper()) HyperDebug.Log($"Product name set to: {productName}");
252
252
 
253
253
  return manifest;
254
254
  }
@@ -16,6 +16,11 @@ namespace Hyper.Editor
16
16
  private const string HyperLoaderSceneDestination = "Assets/HyperSDK/Scenes/HyperLoader.unity";
17
17
  private const string WebGLTemplateRelativePath = "WebGLTemplates/HyperLoader";
18
18
  private const string WebGLTemplateDestination = "Assets/WebGLTemplates/HyperLoader";
19
+ private const string HyperGameContentConfigRelativePath = "Runtime/Resources/HyperGameContentConfig.asset";
20
+ private const string HyperSDKSettingsRelativePath = "Runtime/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
+
19
24
 
20
25
  static HyperSDKInstaller()
21
26
  {
@@ -41,8 +46,14 @@ namespace Hyper.Editor
41
46
  var previousVersion = EditorPrefs.GetString(InstallerPrefsKey, string.Empty);
42
47
  var sceneExists = File.Exists(HyperLoaderSceneDestination);
43
48
  var templateExists = Directory.Exists(WebGLTemplateDestination);
44
-
45
- if (previousVersion == packageInfo.version && sceneExists && templateExists)
49
+ var configExists = File.Exists(HyperGameContentConfigDestination);
50
+ var settingsExists = File.Exists(HyperSDKSettingsDestination);
51
+
52
+ if (previousVersion == packageInfo.version &&
53
+ sceneExists &&
54
+ templateExists &&
55
+ configExists &&
56
+ settingsExists)
46
57
  {
47
58
  return;
48
59
  }
@@ -50,41 +61,32 @@ namespace Hyper.Editor
50
61
  var packageRoot = packageInfo.resolvedPath;
51
62
  var hyperLoaderSource = Path.Combine(packageRoot, HyperLoaderSceneRelativePath);
52
63
  var templateSource = Path.Combine(packageRoot, WebGLTemplateRelativePath);
64
+ var hyperGameContentConfigSource = Path.Combine(packageRoot, HyperGameContentConfigRelativePath);
65
+ var hyperSDKSettingsSource = Path.Combine(packageRoot, HyperSDKSettingsRelativePath);
53
66
 
54
- try
55
- {
56
- CopyScene(hyperLoaderSource);
57
- CopyTemplate(templateSource);
67
+ CopyFileWithoutMeta(hyperLoaderSource, HyperLoaderSceneDestination);
68
+ CopyTemplate(templateSource);
69
+ CopyFileWithoutMeta(hyperGameContentConfigSource, HyperGameContentConfigDestination);
70
+ CopyFileWithoutMeta(hyperSDKSettingsSource, HyperSDKSettingsDestination);
58
71
 
59
- EditorPrefs.SetString(InstallerPrefsKey, packageInfo.version);
60
- AssetDatabase.Refresh();
61
- }
62
- catch (IOException ioException)
63
- {
64
- UnityEngine.Debug.LogWarning($"HyperSDK Installer: failed to copy setup assets. {ioException.Message}");
65
- }
72
+ EditorPrefs.SetString(InstallerPrefsKey, packageInfo.version);
73
+ AssetDatabase.Refresh();
66
74
  }
67
75
 
68
- private static void CopyScene(string sourcePath)
76
+ private static void CopyFileWithoutMeta(string sourcePath, string destinationPath)
69
77
  {
70
78
  if (!File.Exists(sourcePath))
71
79
  {
72
80
  return;
73
81
  }
74
82
 
75
- var destinationDir = Path.GetDirectoryName(HyperLoaderSceneDestination);
83
+ var destinationDir = Path.GetDirectoryName(destinationPath);
76
84
  if (!string.IsNullOrEmpty(destinationDir))
77
85
  {
78
86
  Directory.CreateDirectory(destinationDir);
79
87
  }
80
88
 
81
- FileUtil.CopyFileOrDirectory(sourcePath, HyperLoaderSceneDestination);
82
-
83
- var sourceMeta = $"{sourcePath}.meta";
84
- if (File.Exists(sourceMeta))
85
- {
86
- FileUtil.CopyFileOrDirectory(sourceMeta, $"{HyperLoaderSceneDestination}.meta");
87
- }
89
+ FileUtil.CopyFileOrDirectory(sourcePath, destinationPath);
88
90
  }
89
91
 
90
92
  private static void CopyTemplate(string sourceDirectory)
@@ -106,6 +108,21 @@ namespace Hyper.Editor
106
108
  }
107
109
 
108
110
  FileUtil.CopyFileOrDirectory(sourceDirectory, WebGLTemplateDestination);
111
+ RemoveMetaFiles(WebGLTemplateDestination);
112
+ }
113
+
114
+ private static void RemoveMetaFiles(string directory)
115
+ {
116
+ if (!Directory.Exists(directory))
117
+ {
118
+ return;
119
+ }
120
+
121
+ var metaFiles = Directory.GetFiles(directory, "*.meta", SearchOption.AllDirectories);
122
+ foreach (var meta in metaFiles)
123
+ {
124
+ FileUtil.DeleteFileOrDirectory(meta);
125
+ }
109
126
  }
110
127
  }
111
128
  }
@@ -137,7 +137,8 @@ namespace Hyper.Editor
137
137
  if (stylesInitialized) return;
138
138
 
139
139
  var tabBoxStyleTex = new Texture2D(1, 1);
140
- tabBoxStyleTex.SetPixel(0, 0, new Color(0.4f, 0.4f, 0.4f, 0.2f));
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
- infoBoxStyleTex.SetPixel(0, 0, new Color(0.4f, 0.4f, 0.4f, 0.2f));
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, 2, 0),
158
- margin = new RectOffset(4, 4, 4, 0)
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 = new Color(0.1f, 0.7f, 0.1f) },
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 = new Color(1.0f, 0.6f, 0.0f) },
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 = new Color(0.9f, 0.3f, 0.3f) },
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
- int totalSettings = status.GetTotalSettings();
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
- progressBarColor = new Color(0.9f, 0.3f, 0.3f);
320
- }
321
- else if (percentage >= 70f)
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
- Rect rect = EditorGUILayout.GetControlRect(false, 25);
331
- DrawColoredProgressBar(rect, percentage / 100f, progressBarColor, $"{configuredSettings}/{totalSettings} Settings Configured ({percentage:F0}%)");
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
- EditorGUILayout.Space(5);
338
+ Rect rect = EditorGUILayout.GetControlRect(false, 25);
339
+ DrawColoredProgressBar(rect, percentage / 100f, progressBarColor, $"{configuredSettings}/{totalSettings} Settings Configured ({percentage:F0}%)");
334
340
 
335
- if (percentage == 100f)
336
- {
337
- EditorGUILayout.LabelField("✓ All settings are optimally configured!", goodStatusStyle);
338
- }
339
- else if (outstandingSettings.Count > 0)
340
- {
341
- EditorGUILayout.LabelField($"❌ {outstandingSettings.Count} critical setting(s) need attention. Please fix these before building.", errorStatusStyle);
342
- }
343
- else if (percentage >= 70f)
344
- {
345
- EditorGUILayout.LabelField("⚠ Most settings configured, but some optimizations available", warningStatusStyle);
346
- }
347
- else
348
- {
349
- EditorGUILayout.LabelField("❌ Several settings need attention for optimal performance", errorStatusStyle);
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
- if (hasSDKAssets)
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
- if (isSDKDeveloper)
1279
- {
1280
- categoryFoldoutStates[SDK_CATEGORY] = EditorGUILayout.Foldout(
1281
- categoryFoldoutStates[SDK_CATEGORY],
1282
- $"{SDK_CATEGORY} ({sdkAssets.Count} assets, {FormatBytes(sdkEstimatedSize)}{(hasFinalSize ? " est" : "")}, {sdkPercentage:F1}%)",
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 (isSDKDeveloper && categoryFoldoutStates[SDK_CATEGORY])
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
- hasSyncTool = true;
1532
- break;
1588
+ return true;
1533
1589
  }
1534
1590
  }
1535
1591
 
1536
- // If sync tool doesn't exist, not a dev environment
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() => 15;
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
- if (!assetPath.StartsWith("Assets/"))
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 includes everything under Assets/HyperSDK/ and Assets/WebGLTemplates/
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
+
@@ -0,0 +1,2 @@
1
+ fileFormatVersion: 2
2
+ guid: 3d2d4a03230c53c4e8b11752555a23df
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.46147263
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: -0.12949944}
1543
- m_SizeDelta: {x: -15.3633, y: -6.8068}
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.OnGameStart -= HandleGameStarted;
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 string GameScene;
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 string PracticeScene;
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 string TransitionScene;
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 => !string.IsNullOrWhiteSpace(TransitionScene);
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 /= Screen.height;
48
+ minAnchor.y = 0;
60
49
  maxAnchor.x /= Screen.width;
61
50
  maxAnchor.y /= Screen.height;
62
51
 
@@ -71,7 +71,10 @@ namespace Hyper.Internal
71
71
 
72
72
  void OnDisable()
73
73
  {
74
- HyperRuntime.EventManager.OnGameEnded -= Hide;
74
+ if (HyperRuntime.EventManager != null)
75
+ {
76
+ HyperRuntime.EventManager.OnGameEnded -= Hide;
77
+ }
75
78
  }
76
79
 
77
80
  void Update()
@@ -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
- public const string BANNER_TEXTURE_PATH = "Assets/HyperSDK/Editor/Resources/HyperBanner.png";
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: MathGameplay
16
- PracticeScene: MathGameplay
15
+ GameScene:
16
+ sceneGUID:
17
+ PracticeScene:
18
+ sceneGUID:
17
19
  PracticeSceneType: 0
18
- TransitionScene:
20
+ TransitionScene:
21
+ sceneGUID:
19
22
  gamePosterSprite: {fileID: 0}
@@ -21,7 +21,7 @@ MonoBehaviour:
21
21
  _settings:
22
22
  GameMode: 0
23
23
  ShowInstructions: 0
24
- TimeLimit: 10
24
+ TimeLimit: 60
25
25
  RandomSeed: 0
26
26
  Username:
27
27
  Host:
@@ -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: 41}
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: 189.825, y: -10.5}
329
- m_SizeDelta: {x: 256.65, y: 0}
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: 32.5
386
+ m_fontSize: 35
387
387
  m_fontSizeBase: 32.5
388
388
  m_fontWeight: 400
389
- m_enableAutoSizing: 0
389
+ m_enableAutoSizing: 1
390
390
  m_fontSizeMin: 18
391
- m_fontSizeMax: 72
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: 0, z: 0, w: 0}
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: 0, z: 0, w: 0}
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
+
@@ -0,0 +1,2 @@
1
+ fileFormatVersion: 2
2
+ guid: 4322e1afbf85a694ead3a86b6a404991
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "app.hypergames.hypersdk",
3
- "version": "1.1.8",
3
+ "version": "1.1.10",
4
4
  "displayName": "HyperSDK",
5
- "description": "Official Unity SDK for HyperGames. Plug in platform APIs, multiplayer battles, score submission, tutorials, and build/WebGL tooling so WebGL games ship faster.",
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",
7
7
  "unityRelease": "0b5",
8
8
  "keywords": [