app.hypergames.hypersdk 1.11.0-beta.14 → 1.11.0-beta.16

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.16](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.15...v1.11.0-beta.16) (2026-08-31)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **replay:** show seek preparation progress ([60213f7](https://github.com/mvmhyper/hyper-sdk/commit/60213f784c5bff39da4634590545fe4d0e4c0911))
7
+
8
+ # [1.11.0-beta.15](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.14...v1.11.0-beta.15) (2026-08-31)
9
+
10
+
11
+ ### Features
12
+
13
+ * **replay:** show seek completion progress ([4e7c1b8](https://github.com/mvmhyper/hyper-sdk/commit/4e7c1b807bd9f34b97477ef39aa9ca3c06316ef3))
14
+
1
15
  # [1.11.0-beta.14](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.13...v1.11.0-beta.14) (2026-08-31)
2
16
 
3
17
 
@@ -21,6 +21,8 @@ namespace Hyper.Internal
21
21
  [SerializeField] private float[] playbackSpeeds = { 1.5f, 2f, 3f, 4f, 5f, 1f };
22
22
  [SerializeField, Min(1f)] private float seekPlaybackSpeed = 10f;
23
23
  [SerializeField, Range(0.25f, 1f)] private float seekSnapshotScale = 0.55f;
24
+ [SerializeField, Range(0f, 0.5f)] private float seekPreparationProgress = 0.2f;
25
+ [SerializeField, Min(0.1f)] private float seekPreparationDuration = 1f;
24
26
  [SerializeField] private GameObject seekLoadingOverlay;
25
27
  [SerializeField] private RawImage seekSnapshotImage;
26
28
 
@@ -32,6 +34,8 @@ namespace Hyper.Internal
32
34
  private Texture2D seekSnapshotTexture;
33
35
  private Image seekOverlayBackground;
34
36
  private Color seekOverlayBackgroundColor;
37
+ private ReplaySeekOverlay seekOverlay;
38
+ private static float displayedSeekProgress;
35
39
 
36
40
  private void Awake()
37
41
  {
@@ -79,6 +83,11 @@ namespace Hyper.Internal
79
83
  SetSeekingPresentation(isSeeking);
80
84
  }
81
85
 
86
+ if (isSeeking)
87
+ {
88
+ UpdateSeekProgress(true);
89
+ }
90
+
82
91
  if (progressSlider != null && (seekInput == null || !seekInput.IsDragging))
83
92
  {
84
93
  float displayedProgress = isCapturingSeek
@@ -189,6 +198,7 @@ namespace Hyper.Internal
189
198
 
190
199
  float resumeSpeed = SanitizePlaybackSpeed(ReplaySessionState.UserPlaybackSpeed);
191
200
  float fastForwardSpeed = SanitizePlaybackSpeed(seekPlaybackSpeed);
201
+ displayedSeekProgress = 0f;
192
202
  StartCoroutine(CaptureAndSeek(targetProgress, resumeSpeed, fastForwardSpeed));
193
203
  }
194
204
 
@@ -260,6 +270,7 @@ namespace Hyper.Internal
260
270
  private void SetSeekingPresentation(bool isSeeking)
261
271
  {
262
272
  ReplayPresentationCanvas.SetSeekingLayer(isSeeking);
273
+ UpdateSeekProgress(isSeeking);
263
274
  if (seekLoadingOverlay != null) seekLoadingOverlay.SetActive(isSeeking);
264
275
  if (progressSlider != null) progressSlider.interactable = !isSeeking && !ReplaySessionState.HasEnded;
265
276
  if (playbackSpeedButton != null)
@@ -404,10 +415,46 @@ namespace Hyper.Internal
404
415
  seekLoadingOverlay.transform.SetAsFirstSibling();
405
416
  seekOverlayBackground = seekLoadingOverlay.GetComponent<Image>();
406
417
  if (seekOverlayBackground != null) seekOverlayBackgroundColor = seekOverlayBackground.color;
418
+ seekOverlay = seekLoadingOverlay.GetComponent<ReplaySeekOverlay>();
407
419
  seekLoadingOverlay.SetActive(ReplaySessionState.IsSeeking);
408
420
  wasSeeking = ReplaySessionState.IsSeeking;
409
421
  }
410
422
 
423
+ private void UpdateSeekProgress(bool isSeeking)
424
+ {
425
+ if (seekOverlay == null) return;
426
+
427
+ float progress;
428
+ if (!isSeeking)
429
+ {
430
+ progress = 1f;
431
+ }
432
+ else if (isCapturingSeek || ReplaySessionState.IsSeekRestartPending)
433
+ {
434
+ float duration = Mathf.Max(0.1f, seekPreparationDuration);
435
+ displayedSeekProgress = Mathf.MoveTowards(
436
+ displayedSeekProgress,
437
+ seekPreparationProgress,
438
+ seekPreparationProgress * Time.unscaledDeltaTime / duration);
439
+ progress = displayedSeekProgress;
440
+ }
441
+ else
442
+ {
443
+ float target = ReplaySessionState.SeekTarget01;
444
+ float reconstructionProgress = target <= Mathf.Epsilon
445
+ ? 1f
446
+ : ReplaySessionState.Progress01 / target;
447
+ float realProgress = Mathf.Lerp(
448
+ seekPreparationProgress,
449
+ 1f,
450
+ Mathf.Clamp01(reconstructionProgress));
451
+ displayedSeekProgress = Mathf.Max(displayedSeekProgress, realProgress);
452
+ progress = displayedSeekProgress;
453
+ }
454
+
455
+ seekOverlay.SetProgress(progress);
456
+ }
457
+
411
458
  private void ConfigureSeekSnapshot()
412
459
  {
413
460
  if (seekSnapshotImage == null)
@@ -0,0 +1,18 @@
1
+ using TMPro;
2
+ using UnityEngine;
3
+
4
+ namespace Hyper.Internal
5
+ {
6
+ internal sealed class ReplaySeekOverlay : MonoBehaviour
7
+ {
8
+ [SerializeField] private TextMeshProUGUI progressText;
9
+
10
+ internal void SetProgress(float progress01)
11
+ {
12
+ if (progressText == null) return;
13
+
14
+ int percentage = Mathf.RoundToInt(Mathf.Clamp01(progress01) * 100f);
15
+ progressText.text = $"{percentage}%";
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,2 @@
1
+ fileFormatVersion: 2
2
+ guid: a7d0eb352f3c4d64a687b8c4509e1fa2