app.hypergames.hypersdk 1.11.0-beta.20 → 1.11.0-beta.22

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.11.0-beta.22](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.21...v1.11.0-beta.22) (2026-09-03)
2
+
3
+
4
+ ### Features
5
+
6
+ * **replay:** finalize playback controls and settings ([559a7e4](https://github.com/mvmhyper/hyper-sdk/commit/559a7e48d9998efa022fe87253645dc13f83e901))
7
+
8
+ # [1.11.0-beta.21](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.20...v1.11.0-beta.21) (2026-09-03)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **replay:** align gameplay activities to fixed ticks ([1e681b9](https://github.com/mvmhyper/hyper-sdk/commit/1e681b9c7f314a48c417f6e76cb2d4024c890ad3))
14
+
1
15
  # [1.11.0-beta.20](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.19...v1.11.0-beta.20) (2026-09-02)
2
16
 
3
17
 
@@ -172,11 +172,20 @@ namespace Hyper.Editor
172
172
  settings.useCustomRestartFlow);
173
173
  settings.useCustomReplayRestartFlow = EditorGUILayout.Toggle(
174
174
  new GUIContent(
175
- "Use Custom Replay Restart Flow",
175
+ "Replay Custom Restart",
176
176
  "Use game-owned restart logic for replay Watch Again and seeking. " +
177
177
  "Disabled uses HyperLoader to rebuild deterministic game state."),
178
178
  settings.useCustomReplayRestartFlow);
179
179
 
180
+ EditorGUILayout.Space(12);
181
+ EditorGUILayout.LabelField("Replay Settings", EditorStyles.boldLabel);
182
+ settings.allowReplaySeeking = EditorGUILayout.Toggle(
183
+ new GUIContent(
184
+ "Allow Replay Seeking",
185
+ "Allow viewers to seek using the replay progress bar. " +
186
+ "Leave disabled until accelerated replay reconstruction is validated for this game."),
187
+ settings.allowReplaySeeking);
188
+
180
189
  EditorGUILayout.Space(12);
181
190
  // Draw Editor Testing
182
191
  SerializedProperty settingsProp = serializedObject.FindProperty("_settings");
@@ -103,14 +103,23 @@ namespace Hyper.Internal.Managers
103
103
  if (Mathf.Approximately(Time.timeScale, 0f))
104
104
  return;
105
105
 
106
- float gameTimerDelta = _gameManager != null && _gameManager.IsReplayMode
107
- ? Time.fixedDeltaTime
108
- : Time.fixedUnscaledDeltaTime;
106
+ float gameTimerDelta = GetGameTimerDelta(
107
+ _gameManager != null && _gameManager.IsReplayMode,
108
+ Time.fixedDeltaTime,
109
+ Time.fixedUnscaledDeltaTime);
109
110
 
110
111
  UpdatePracticeTimer(gameTimerDelta);
111
112
  UpdateBattleTimer(gameTimerDelta);
112
113
  }
113
114
 
115
+ internal static float GetGameTimerDelta(
116
+ bool isReplayMode,
117
+ float fixedDeltaTime,
118
+ float fixedUnscaledDeltaTime)
119
+ {
120
+ return isReplayMode ? fixedDeltaTime : fixedUnscaledDeltaTime;
121
+ }
122
+
114
123
  public void Reset()
115
124
  {
116
125
  _practiceTimer = 0;
@@ -299,9 +308,9 @@ namespace Hyper.Internal.Managers
299
308
  }
300
309
 
301
310
  _battleTimer -= delta;
302
- if (_battleTimer <= 0)
311
+ if (_battleTimer <= 0f || Mathf.Approximately(_battleTimer, 0f))
303
312
  {
304
- _battleTimer = 0;
313
+ _battleTimer = 0f;
305
314
  if (!_timeUpTriggered)
306
315
  {
307
316
  QueueTimeUp();
@@ -314,7 +323,8 @@ namespace Hyper.Internal.Managers
314
323
  {
315
324
  _battleTimer = _sessionTimer;
316
325
 
317
- if (_battleTimer <= 0 && !_timeUpTriggered)
326
+ if ((_battleTimer <= 0f || Mathf.Approximately(_battleTimer, 0f)) &&
327
+ !_timeUpTriggered)
318
328
  {
319
329
  QueueTimeUp();
320
330
  }
@@ -80,6 +80,12 @@ namespace Hyper.Internal
80
80
  "Leave disabled to rebuild the game through HyperLoader for deterministic replay state.")]
81
81
  public bool useCustomReplayRestartFlow = false;
82
82
 
83
+ [Space(20)]
84
+ [Header("Replay Settings")]
85
+ [Tooltip("Allow replay viewers to seek from the replay progress bar. " +
86
+ "Leave disabled until the game has been validated for accelerated replay reconstruction.")]
87
+ public bool allowReplaySeeking = false;
88
+
83
89
  #endregion
84
90
 
85
91
  #region Editor Testing
@@ -12,13 +12,14 @@ namespace Hyper.Internal
12
12
  {
13
13
  internal const int AvatarTextureSize = 128;
14
14
 
15
- [SerializeField] private Slider progressSlider;
15
+ [SerializeField] private Slider seekableSlider;
16
+ [SerializeField] private Slider readOnlySlider;
16
17
  [SerializeField] private TextMeshProUGUI replayLabel;
17
18
  [SerializeField] private RawImage playerAvatar;
18
19
  [SerializeField] private Button pauseButton;
19
20
  [SerializeField] private Button playbackSpeedButton;
20
21
  [SerializeField] private TextMeshProUGUI playbackSpeedLabel;
21
- [SerializeField] private float[] playbackSpeeds = { 1.5f, 2f, 3f, 4f, 5f, 1f };
22
+ [SerializeField] private float[] playbackSpeeds = { 1f, 1.25f, 1.75f, 2f, 0.5f };
22
23
  [SerializeField, Min(1f)] private float seekPlaybackSpeed = 10f;
23
24
  [SerializeField, Range(0.25f, 1f)] private float seekSnapshotScale = 0.55f;
24
25
  [SerializeField, Range(0f, 0.5f)] private float seekPreparationProgress = 0.2f;
@@ -28,7 +29,9 @@ namespace Hyper.Internal
28
29
  [SerializeField] private RawImage seekSnapshotImage;
29
30
 
30
31
  private int playbackSpeedIndex;
32
+ private Slider progressSlider;
31
33
  private ReplaySeekInput seekInput;
34
+ private bool seekingAllowed;
32
35
  private bool wasSeeking;
33
36
  private bool isCapturingSeek;
34
37
  private float pendingSeekTarget;
@@ -44,12 +47,21 @@ namespace Hyper.Internal
44
47
 
45
48
  private void Awake()
46
49
  {
50
+ seekingAllowed = HyperRuntime.Settings != null && HyperRuntime.Settings.allowReplaySeeking;
47
51
  AutoBindReferences();
48
- ConfigureProgressSlider();
49
- ConfigureSeekOverlay();
50
- ConfigureSeekSnapshot();
52
+ ConfigureProgressSliders();
53
+ if (seekingAllowed)
54
+ {
55
+ ConfigureSeekOverlay();
56
+ ConfigureSeekSnapshot();
57
+ }
58
+ else if (seekLoadingOverlay != null)
59
+ {
60
+ seekLoadingOverlay.SetActive(false);
61
+ }
62
+
51
63
  ApplyInitialPlaybackSpeed();
52
- ReplaySessionState.SeekCompleted += RestorePlaybackAfterSeek;
64
+ if (seekingAllowed) ReplaySessionState.SeekCompleted += RestorePlaybackAfterSeek;
53
65
  if (pauseButton != null) pauseButton.onClick.AddListener(PauseReplay);
54
66
  if (playbackSpeedButton != null) playbackSpeedButton.onClick.AddListener(CyclePlaybackSpeed);
55
67
  }
@@ -61,13 +73,13 @@ namespace Hyper.Internal
61
73
  if (replayLabel != null) replayLabel.text = $"Replay of @{playerName}";
62
74
  if (progressSlider != null)
63
75
  {
64
- float displayedProgress = ReplaySessionState.IsSeeking
76
+ float displayedProgress = seekingAllowed && ReplaySessionState.IsSeeking
65
77
  ? ReplaySessionState.SeekTarget01
66
78
  : ReplaySessionState.Progress01;
67
79
  progressSlider.SetValueWithoutNotify(displayedProgress);
68
80
  }
69
81
  UpdatePlaybackSpeedLabel(ReplaySessionState.UserPlaybackSpeed);
70
- SetSeekingPresentation(ReplaySessionState.IsSeeking);
82
+ SetSeekingPresentation(seekingAllowed && ReplaySessionState.IsSeeking);
71
83
 
72
84
  if (playerAvatar != null && ReplaySessionState.AvatarTexture != null)
73
85
  {
@@ -77,7 +89,7 @@ namespace Hyper.Internal
77
89
 
78
90
  private void Update()
79
91
  {
80
- bool isSeeking = ReplaySessionState.IsSeeking;
92
+ bool isSeeking = seekingAllowed && ReplaySessionState.IsSeeking;
81
93
  if (wasSeeking && !isSeeking && !ReplaySessionState.HasEnded)
82
94
  {
83
95
  RestorePlaybackAfterSeek(ReplaySessionState.PlaybackSpeed);
@@ -195,7 +207,7 @@ namespace Hyper.Internal
195
207
 
196
208
  private void SeekTo(float targetProgress)
197
209
  {
198
- if (!ReplaySessionState.IsActive || ReplaySessionState.HasEnded ||
210
+ if (!seekingAllowed || !ReplaySessionState.IsActive || ReplaySessionState.HasEnded ||
199
211
  ReplaySessionState.IsSeeking || isCapturingSeek)
200
212
  {
201
213
  return;
@@ -273,10 +285,14 @@ namespace Hyper.Internal
273
285
 
274
286
  private void SetSeekingPresentation(bool isSeeking)
275
287
  {
288
+ isSeeking &= seekingAllowed;
276
289
  ReplayPresentationCanvas.SetSeekingLayer(isSeeking);
277
290
  UpdateSeekProgress(isSeeking);
278
291
  if (seekLoadingOverlay != null) seekLoadingOverlay.SetActive(isSeeking);
279
- if (progressSlider != null) progressSlider.interactable = !isSeeking && !ReplaySessionState.HasEnded;
292
+ if (progressSlider != null)
293
+ {
294
+ progressSlider.interactable = seekingAllowed && !isSeeking && !ReplaySessionState.HasEnded;
295
+ }
280
296
  if (playbackSpeedButton != null)
281
297
  {
282
298
  playbackSpeedButton.interactable = !isSeeking && !ReplaySessionState.HasEnded;
@@ -300,7 +316,7 @@ namespace Hyper.Internal
300
316
 
301
317
  if (playbackSpeedLabel != null)
302
318
  {
303
- playbackSpeedLabel.text = $"{speed:0.#}x";
319
+ playbackSpeedLabel.text = $"{speed:0.##}x";
304
320
  }
305
321
  }
306
322
 
@@ -354,8 +370,6 @@ namespace Hyper.Internal
354
370
 
355
371
  private void AutoBindReferences()
356
372
  {
357
- if (progressSlider == null) progressSlider = GetComponentInChildren<Slider>(true);
358
-
359
373
  Button[] buttons = GetComponentsInChildren<Button>(true);
360
374
  for (int i = 0; i < buttons.Length; i++)
361
375
  {
@@ -375,19 +389,33 @@ namespace Hyper.Internal
375
389
  }
376
390
  }
377
391
 
378
- private void ConfigureProgressSlider()
392
+ private void ConfigureProgressSliders()
379
393
  {
394
+ progressSlider = seekingAllowed ? seekableSlider : readOnlySlider;
395
+
396
+ if (seekableSlider != null)
397
+ {
398
+ seekableSlider.gameObject.SetActive(seekingAllowed);
399
+ }
400
+
401
+ if (readOnlySlider != null)
402
+ {
403
+ readOnlySlider.gameObject.SetActive(!seekingAllowed);
404
+ }
405
+
380
406
  if (progressSlider == null) return;
381
407
 
382
408
  progressSlider.minValue = 0f;
383
409
  progressSlider.maxValue = 1f;
384
410
  progressSlider.wholeNumbers = false;
385
- progressSlider.interactable = true;
386
- float displayedProgress = ReplaySessionState.IsSeeking
411
+ progressSlider.interactable = seekingAllowed;
412
+ float displayedProgress = seekingAllowed && ReplaySessionState.IsSeeking
387
413
  ? ReplaySessionState.SeekTarget01
388
414
  : ReplaySessionState.Progress01;
389
415
  progressSlider.SetValueWithoutNotify(displayedProgress);
390
416
 
417
+ if (!seekingAllowed) return;
418
+
391
419
  seekInput = progressSlider.GetComponent<ReplaySeekInput>();
392
420
  if (seekInput == null) seekInput = progressSlider.gameObject.AddComponent<ReplaySeekInput>();
393
421
  seekInput.Initialize(progressSlider, SeekTo);
@@ -29,6 +29,13 @@ namespace Hyper
29
29
  private double _stoppedElapsed;
30
30
  private bool _isSuspended;
31
31
  private bool _completionPending;
32
+ private bool _gameplayClockStarted;
33
+ private double _gameplaySourceStartTime;
34
+ private double _gameplayElapsedSeconds;
35
+ private double _gameplayStepSeconds;
36
+ private double _gameplayPauseDurationAtStart;
37
+ private long _gameplayTick;
38
+ private double _currentTickDelta;
32
39
 
33
40
  public event Action<float, float> OnValues2;
34
41
  public event Action<float> OnValue;
@@ -76,6 +83,13 @@ namespace Hyper
76
83
  _endedRaised = false;
77
84
  _completionPending = false;
78
85
  _nextActionPrepared = false;
86
+ _gameplayClockStarted = false;
87
+ _gameplaySourceStartTime = 0d;
88
+ _gameplayElapsedSeconds = 0d;
89
+ _gameplayStepSeconds = 0d;
90
+ _gameplayPauseDurationAtStart = 0d;
91
+ _gameplayTick = 0L;
92
+ _currentTickDelta = 0d;
79
93
  DurationSeconds = CalculateDuration(_ndjson);
80
94
  double gameplayStartSeconds = CalculateGameplayStart(_ndjson, out bool hasGameplayReadyMarker);
81
95
  HasGameplayReadyMarker = hasGameplayReadyMarker;
@@ -122,13 +136,19 @@ namespace Hyper
122
136
  double.IsInfinity(fixedSimulationDeltaSeconds)
123
137
  ? 0d
124
138
  : Math.Max(0d, fixedSimulationDeltaSeconds);
139
+ _currentTickDelta = delta;
125
140
  _elapsedSeconds += delta;
141
+ if (_gameplayClockStarted && delta > 0d)
142
+ {
143
+ if (_gameplayStepSeconds <= 0d) _gameplayStepSeconds = delta;
144
+ _gameplayElapsedSeconds += delta;
145
+ _gameplayTick++;
146
+ }
126
147
 
127
148
  int processed = 0;
128
149
  while (IsPlaying && !_completionPending && _hasNext && processed++ < MaxActivitiesPerTick)
129
150
  {
130
- double elapsed = GetElapsedSeconds();
131
- double dueTime = _next.Time - _sourceStartTime - _removedPauseDuration;
151
+ GetSchedulingTime(_next, out double elapsed, out double dueTime);
132
152
  PrepareNextActionIfDue(elapsed, dueTime);
133
153
  if (elapsed + 0.000001d < dueTime) return;
134
154
 
@@ -154,6 +174,13 @@ namespace Hyper
154
174
  _isSuspended = false;
155
175
  _completionPending = false;
156
176
  _nextActionPrepared = false;
177
+ _gameplayClockStarted = false;
178
+ _gameplaySourceStartTime = 0d;
179
+ _gameplayElapsedSeconds = 0d;
180
+ _gameplayStepSeconds = 0d;
181
+ _gameplayPauseDurationAtStart = 0d;
182
+ _gameplayTick = 0L;
183
+ _currentTickDelta = 0d;
157
184
  }
158
185
 
159
186
  public void Suspend()
@@ -224,6 +251,7 @@ namespace Hyper
224
251
  OnGameStarted?.Invoke();
225
252
  break;
226
253
  case GameplayReady:
254
+ StartGameplayClock(activity.Time);
227
255
  OnGameplayReady?.Invoke();
228
256
  break;
229
257
  case GamePaused:
@@ -255,6 +283,47 @@ namespace Hyper
255
283
  OnActionPreparing?.Invoke(_next.Action);
256
284
  }
257
285
 
286
+ private void StartGameplayClock(double sourceTime)
287
+ {
288
+ _gameplayClockStarted = true;
289
+ _gameplaySourceStartTime = sourceTime;
290
+ _gameplayElapsedSeconds = 0d;
291
+ _gameplayStepSeconds = _currentTickDelta;
292
+ _gameplayPauseDurationAtStart = _removedPauseDuration;
293
+ _gameplayTick = 0L;
294
+ }
295
+
296
+ private void GetSchedulingTime(ReplayActivity activity, out double elapsed, out double dueTime)
297
+ {
298
+ if (!_gameplayClockStarted)
299
+ {
300
+ elapsed = GetElapsedSeconds();
301
+ dueTime = activity.Time - _sourceStartTime - _removedPauseDuration;
302
+ return;
303
+ }
304
+
305
+ double removedGameplayPauses = Math.Max(0d,
306
+ _removedPauseDuration - _gameplayPauseDurationAtStart);
307
+ double rawDueTime = Math.Max(0d,
308
+ activity.Time - _gameplaySourceStartTime - removedGameplayPauses);
309
+
310
+ if (_gameplayStepSeconds <= 0d)
311
+ {
312
+ elapsed = _gameplayElapsedSeconds;
313
+ dueTime = rawDueTime;
314
+ return;
315
+ }
316
+
317
+ // Gameplay can only consume an activity on a fixed step. Mapping the
318
+ // timestamp to its nearest GPR-relative tick prevents sub-step JSON
319
+ // precision noise from moving an input to the following physics step.
320
+ long dueTick = Math.Max(0L, (long)Math.Round(
321
+ rawDueTime / _gameplayStepSeconds,
322
+ MidpointRounding.AwayFromZero));
323
+ elapsed = _gameplayTick * _gameplayStepSeconds;
324
+ dueTime = dueTick * _gameplayStepSeconds;
325
+ }
326
+
258
327
  private static bool IsLifecycleAction(string action)
259
328
  {
260
329
  return action == GameStarted || action == GamePaused ||
@@ -22,6 +22,7 @@ MonoBehaviour:
22
22
  controlBarTheme: 1
23
23
  useCustomRestartFlow: 0
24
24
  useCustomReplayRestartFlow: 0
25
+ allowReplaySeeking: 0
25
26
  _settings:
26
27
  GameMode: 0
27
28
  ShowInstructions: 0
@@ -1,5 +1,41 @@
1
1
  %YAML 1.1
2
2
  %TAG !u! tag:unity3d.com,2011:
3
+ --- !u!1 &223417005362504300
4
+ GameObject:
5
+ m_ObjectHideFlags: 0
6
+ m_CorrespondingSourceObject: {fileID: 0}
7
+ m_PrefabInstance: {fileID: 0}
8
+ m_PrefabAsset: {fileID: 0}
9
+ serializedVersion: 6
10
+ m_Component:
11
+ - component: {fileID: 3833324095758096509}
12
+ m_Layer: 5
13
+ m_Name: Fill Area
14
+ m_TagString: Untagged
15
+ m_Icon: {fileID: 0}
16
+ m_NavMeshLayer: 0
17
+ m_StaticEditorFlags: 0
18
+ m_IsActive: 1
19
+ --- !u!224 &3833324095758096509
20
+ RectTransform:
21
+ m_ObjectHideFlags: 0
22
+ m_CorrespondingSourceObject: {fileID: 0}
23
+ m_PrefabInstance: {fileID: 0}
24
+ m_PrefabAsset: {fileID: 0}
25
+ m_GameObject: {fileID: 223417005362504300}
26
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
27
+ m_LocalPosition: {x: 0, y: 0, z: 0}
28
+ m_LocalScale: {x: 1, y: 1, z: 1}
29
+ m_ConstrainProportionsScale: 0
30
+ m_Children:
31
+ - {fileID: 304532445594059503}
32
+ m_Father: {fileID: 6542150060122855028}
33
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
34
+ m_AnchorMin: {x: 0, y: 0}
35
+ m_AnchorMax: {x: 1, y: 1}
36
+ m_AnchoredPosition: {x: -0.018798828, y: 0.0000038146973}
37
+ m_SizeDelta: {x: -10.0378, y: -0.0001}
38
+ m_Pivot: {x: 0.5, y: 0.5}
3
39
  --- !u!1 &369218185311093561
4
40
  GameObject:
5
41
  m_ObjectHideFlags: 0
@@ -305,7 +341,8 @@ MonoBehaviour:
305
341
  m_Script: {fileID: 11500000, guid: 488ba0c343178684c9e74294492a1fa1, type: 3}
306
342
  m_Name:
307
343
  m_EditorClassIdentifier:
308
- progressSlider: {fileID: 6524620082287541530}
344
+ seekableSlider: {fileID: 6524620082287541530}
345
+ readOnlySlider: {fileID: 3931331649244694281}
309
346
  replayLabel: {fileID: 2967308416171677859}
310
347
  playerAvatar: {fileID: 1824686318740396960}
311
348
  pauseButton: {fileID: 6062270276149820752}
@@ -313,9 +350,9 @@ MonoBehaviour:
313
350
  playbackSpeedLabel: {fileID: 4722203154507835557}
314
351
  playbackSpeeds:
315
352
  - 1
316
- - 1.5
353
+ - 1.25
354
+ - 1.75
317
355
  - 2
318
- - 3
319
356
  - 0.5
320
357
  seekPlaybackSpeed: 10
321
358
  seekSnapshotScale: 0.725
@@ -469,7 +506,7 @@ GameObject:
469
506
  - component: {fileID: 6333756719587920619}
470
507
  - component: {fileID: 6524620082287541530}
471
508
  m_Layer: 5
472
- m_Name: Slider
509
+ m_Name: SeekableSlider
473
510
  m_TagString: Untagged
474
511
  m_Icon: {fileID: 0}
475
512
  m_NavMeshLayer: 0
@@ -507,8 +544,8 @@ MonoBehaviour:
507
544
  m_Enabled: 1
508
545
  m_EditorHideFlags: 0
509
546
  m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
510
- m_Name:
511
- m_EditorClassIdentifier:
547
+ m_Name:
548
+ m_EditorClassIdentifier:
512
549
  m_Navigation:
513
550
  m_Mode: 3
514
551
  m_WrapAround: 0
@@ -603,8 +640,8 @@ MonoBehaviour:
603
640
  m_Enabled: 1
604
641
  m_EditorHideFlags: 0
605
642
  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
606
- m_Name:
607
- m_EditorClassIdentifier:
643
+ m_Name:
644
+ m_EditorClassIdentifier:
608
645
  m_Material: {fileID: 0}
609
646
  m_Color: {r: 1, g: 1, b: 1, a: 1}
610
647
  m_RaycastTarget: 1
@@ -654,6 +691,7 @@ RectTransform:
654
691
  m_ConstrainProportionsScale: 0
655
692
  m_Children:
656
693
  - {fileID: 6333756719587920619}
694
+ - {fileID: 6542150060122855028}
657
695
  - {fileID: 6508244257815501699}
658
696
  - {fileID: 1441186342797148716}
659
697
  - {fileID: 3476774662796868632}
@@ -683,8 +721,8 @@ MonoBehaviour:
683
721
  m_Enabled: 1
684
722
  m_EditorHideFlags: 0
685
723
  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
686
- m_Name:
687
- m_EditorClassIdentifier:
724
+ m_Name:
725
+ m_EditorClassIdentifier:
688
726
  m_Material: {fileID: 0}
689
727
  m_Color: {r: 1, g: 1, b: 1, a: 1}
690
728
  m_RaycastTarget: 1
@@ -1197,6 +1235,170 @@ MonoBehaviour:
1197
1235
  m_hasFontAssetChanged: 0
1198
1236
  m_baseMaterial: {fileID: 0}
1199
1237
  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
1238
+ --- !u!1 &4462340644753344622
1239
+ GameObject:
1240
+ m_ObjectHideFlags: 0
1241
+ m_CorrespondingSourceObject: {fileID: 0}
1242
+ m_PrefabInstance: {fileID: 0}
1243
+ m_PrefabAsset: {fileID: 0}
1244
+ serializedVersion: 6
1245
+ m_Component:
1246
+ - component: {fileID: 6542150060122855028}
1247
+ - component: {fileID: 3931331649244694281}
1248
+ m_Layer: 5
1249
+ m_Name: ReadOnlySlider
1250
+ m_TagString: Untagged
1251
+ m_Icon: {fileID: 0}
1252
+ m_NavMeshLayer: 0
1253
+ m_StaticEditorFlags: 0
1254
+ m_IsActive: 0
1255
+ --- !u!224 &6542150060122855028
1256
+ RectTransform:
1257
+ m_ObjectHideFlags: 0
1258
+ m_CorrespondingSourceObject: {fileID: 0}
1259
+ m_PrefabInstance: {fileID: 0}
1260
+ m_PrefabAsset: {fileID: 0}
1261
+ m_GameObject: {fileID: 4462340644753344622}
1262
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
1263
+ m_LocalPosition: {x: 0, y: 0, z: 0}
1264
+ m_LocalScale: {x: 1, y: 1, z: 1}
1265
+ m_ConstrainProportionsScale: 0
1266
+ m_Children:
1267
+ - {fileID: 366657233058180139}
1268
+ - {fileID: 3833324095758096509}
1269
+ m_Father: {fileID: 3329893502925930305}
1270
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
1271
+ m_AnchorMin: {x: 0, y: 1}
1272
+ m_AnchorMax: {x: 1, y: 1}
1273
+ m_AnchoredPosition: {x: 0, y: 3.8920975}
1274
+ m_SizeDelta: {x: 0, y: 7.7843}
1275
+ m_Pivot: {x: 0.5, y: 0.5}
1276
+ --- !u!114 &3931331649244694281
1277
+ MonoBehaviour:
1278
+ m_ObjectHideFlags: 0
1279
+ m_CorrespondingSourceObject: {fileID: 0}
1280
+ m_PrefabInstance: {fileID: 0}
1281
+ m_PrefabAsset: {fileID: 0}
1282
+ m_GameObject: {fileID: 4462340644753344622}
1283
+ m_Enabled: 1
1284
+ m_EditorHideFlags: 0
1285
+ m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
1286
+ m_Name:
1287
+ m_EditorClassIdentifier:
1288
+ m_Navigation:
1289
+ m_Mode: 3
1290
+ m_WrapAround: 0
1291
+ m_SelectOnUp: {fileID: 0}
1292
+ m_SelectOnDown: {fileID: 0}
1293
+ m_SelectOnLeft: {fileID: 0}
1294
+ m_SelectOnRight: {fileID: 0}
1295
+ m_Transition: 0
1296
+ m_Colors:
1297
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
1298
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
1299
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
1300
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
1301
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
1302
+ m_ColorMultiplier: 1
1303
+ m_FadeDuration: 0.1
1304
+ m_SpriteState:
1305
+ m_HighlightedSprite: {fileID: 0}
1306
+ m_PressedSprite: {fileID: 0}
1307
+ m_SelectedSprite: {fileID: 0}
1308
+ m_DisabledSprite: {fileID: 0}
1309
+ m_AnimationTriggers:
1310
+ m_NormalTrigger: Normal
1311
+ m_HighlightedTrigger: Highlighted
1312
+ m_PressedTrigger: Pressed
1313
+ m_SelectedTrigger: Selected
1314
+ m_DisabledTrigger: Disabled
1315
+ m_Interactable: 0
1316
+ m_TargetGraphic: {fileID: 0}
1317
+ m_FillRect: {fileID: 304532445594059503}
1318
+ m_HandleRect: {fileID: 0}
1319
+ m_Direction: 0
1320
+ m_MinValue: 0
1321
+ m_MaxValue: 1
1322
+ m_WholeNumbers: 0
1323
+ m_Value: 0
1324
+ m_OnValueChanged:
1325
+ m_PersistentCalls:
1326
+ m_Calls: []
1327
+ --- !u!1 &4767236606928371908
1328
+ GameObject:
1329
+ m_ObjectHideFlags: 0
1330
+ m_CorrespondingSourceObject: {fileID: 0}
1331
+ m_PrefabInstance: {fileID: 0}
1332
+ m_PrefabAsset: {fileID: 0}
1333
+ serializedVersion: 6
1334
+ m_Component:
1335
+ - component: {fileID: 304532445594059503}
1336
+ - component: {fileID: 6168800224433124105}
1337
+ - component: {fileID: 1731641873342291599}
1338
+ m_Layer: 5
1339
+ m_Name: Fill
1340
+ m_TagString: Untagged
1341
+ m_Icon: {fileID: 0}
1342
+ m_NavMeshLayer: 0
1343
+ m_StaticEditorFlags: 0
1344
+ m_IsActive: 1
1345
+ --- !u!224 &304532445594059503
1346
+ RectTransform:
1347
+ m_ObjectHideFlags: 0
1348
+ m_CorrespondingSourceObject: {fileID: 0}
1349
+ m_PrefabInstance: {fileID: 0}
1350
+ m_PrefabAsset: {fileID: 0}
1351
+ m_GameObject: {fileID: 4767236606928371908}
1352
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
1353
+ m_LocalPosition: {x: 0, y: 0, z: 0}
1354
+ m_LocalScale: {x: 1, y: 1, z: 1}
1355
+ m_ConstrainProportionsScale: 0
1356
+ m_Children: []
1357
+ m_Father: {fileID: 3833324095758096509}
1358
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
1359
+ m_AnchorMin: {x: 0, y: 0}
1360
+ m_AnchorMax: {x: 0, y: 1}
1361
+ m_AnchoredPosition: {x: 0, y: 0}
1362
+ m_SizeDelta: {x: 10, y: 0}
1363
+ m_Pivot: {x: 0.5, y: 0.5}
1364
+ --- !u!222 &6168800224433124105
1365
+ CanvasRenderer:
1366
+ m_ObjectHideFlags: 0
1367
+ m_CorrespondingSourceObject: {fileID: 0}
1368
+ m_PrefabInstance: {fileID: 0}
1369
+ m_PrefabAsset: {fileID: 0}
1370
+ m_GameObject: {fileID: 4767236606928371908}
1371
+ m_CullTransparentMesh: 1
1372
+ --- !u!114 &1731641873342291599
1373
+ MonoBehaviour:
1374
+ m_ObjectHideFlags: 0
1375
+ m_CorrespondingSourceObject: {fileID: 0}
1376
+ m_PrefabInstance: {fileID: 0}
1377
+ m_PrefabAsset: {fileID: 0}
1378
+ m_GameObject: {fileID: 4767236606928371908}
1379
+ m_Enabled: 1
1380
+ m_EditorHideFlags: 0
1381
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
1382
+ m_Name:
1383
+ m_EditorClassIdentifier:
1384
+ m_Material: {fileID: 0}
1385
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
1386
+ m_RaycastTarget: 1
1387
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
1388
+ m_Maskable: 1
1389
+ m_OnCullStateChanged:
1390
+ m_PersistentCalls:
1391
+ m_Calls: []
1392
+ m_Sprite: {fileID: 0}
1393
+ m_Type: 1
1394
+ m_PreserveAspect: 0
1395
+ m_FillCenter: 1
1396
+ m_FillMethod: 4
1397
+ m_FillAmount: 1
1398
+ m_FillClockwise: 1
1399
+ m_FillOrigin: 0
1400
+ m_UseSpriteMesh: 0
1401
+ m_PixelsPerUnitMultiplier: 1
1200
1402
  --- !u!1 &4812803750956349496
1201
1403
  GameObject:
1202
1404
  m_ObjectHideFlags: 0
@@ -1269,6 +1471,81 @@ MonoBehaviour:
1269
1471
  y: 0
1270
1472
  width: 1
1271
1473
  height: 1
1474
+ --- !u!1 &5057041956718479770
1475
+ GameObject:
1476
+ m_ObjectHideFlags: 0
1477
+ m_CorrespondingSourceObject: {fileID: 0}
1478
+ m_PrefabInstance: {fileID: 0}
1479
+ m_PrefabAsset: {fileID: 0}
1480
+ serializedVersion: 6
1481
+ m_Component:
1482
+ - component: {fileID: 366657233058180139}
1483
+ - component: {fileID: 2710470428584502286}
1484
+ - component: {fileID: 5573806685945753042}
1485
+ m_Layer: 5
1486
+ m_Name: Background
1487
+ m_TagString: Untagged
1488
+ m_Icon: {fileID: 0}
1489
+ m_NavMeshLayer: 0
1490
+ m_StaticEditorFlags: 0
1491
+ m_IsActive: 1
1492
+ --- !u!224 &366657233058180139
1493
+ RectTransform:
1494
+ m_ObjectHideFlags: 0
1495
+ m_CorrespondingSourceObject: {fileID: 0}
1496
+ m_PrefabInstance: {fileID: 0}
1497
+ m_PrefabAsset: {fileID: 0}
1498
+ m_GameObject: {fileID: 5057041956718479770}
1499
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
1500
+ m_LocalPosition: {x: 0, y: 0, z: 0}
1501
+ m_LocalScale: {x: 1, y: 1, z: 1}
1502
+ m_ConstrainProportionsScale: 0
1503
+ m_Children: []
1504
+ m_Father: {fileID: 6542150060122855028}
1505
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
1506
+ m_AnchorMin: {x: 0, y: 0}
1507
+ m_AnchorMax: {x: 1, y: 1}
1508
+ m_AnchoredPosition: {x: 0, y: -0.000030517578}
1509
+ m_SizeDelta: {x: 0, y: -0.000038624}
1510
+ m_Pivot: {x: 0.5, y: 0.5}
1511
+ --- !u!222 &2710470428584502286
1512
+ CanvasRenderer:
1513
+ m_ObjectHideFlags: 0
1514
+ m_CorrespondingSourceObject: {fileID: 0}
1515
+ m_PrefabInstance: {fileID: 0}
1516
+ m_PrefabAsset: {fileID: 0}
1517
+ m_GameObject: {fileID: 5057041956718479770}
1518
+ m_CullTransparentMesh: 1
1519
+ --- !u!114 &5573806685945753042
1520
+ MonoBehaviour:
1521
+ m_ObjectHideFlags: 0
1522
+ m_CorrespondingSourceObject: {fileID: 0}
1523
+ m_PrefabInstance: {fileID: 0}
1524
+ m_PrefabAsset: {fileID: 0}
1525
+ m_GameObject: {fileID: 5057041956718479770}
1526
+ m_Enabled: 1
1527
+ m_EditorHideFlags: 0
1528
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
1529
+ m_Name:
1530
+ m_EditorClassIdentifier:
1531
+ m_Material: {fileID: 0}
1532
+ m_Color: {r: 0.09019608, g: 0.06666667, b: 0.15294118, a: 0.78431374}
1533
+ m_RaycastTarget: 1
1534
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
1535
+ m_Maskable: 1
1536
+ m_OnCullStateChanged:
1537
+ m_PersistentCalls:
1538
+ m_Calls: []
1539
+ m_Sprite: {fileID: 0}
1540
+ m_Type: 1
1541
+ m_PreserveAspect: 0
1542
+ m_FillCenter: 1
1543
+ m_FillMethod: 4
1544
+ m_FillAmount: 1
1545
+ m_FillClockwise: 1
1546
+ m_FillOrigin: 0
1547
+ m_UseSpriteMesh: 0
1548
+ m_PixelsPerUnitMultiplier: 1
1272
1549
  --- !u!1 &8322051490674722239
1273
1550
  GameObject:
1274
1551
  m_ObjectHideFlags: 0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "app.hypergames.hypersdk",
3
- "version": "1.11.0-beta.20",
3
+ "version": "1.11.0-beta.22",
4
4
  "displayName": "HyperSDK",
5
5
  "description": "Official Unity SDK for Hyper: multiplayer battles, leaderboards, deterministic RNG, session management, tutorials, and WebGL optimizations for production-ready games.",
6
6
  "unity": "6000.0",