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

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,10 @@
1
+ # [1.11.0-beta.17](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.16...v1.11.0-beta.17) (2026-09-01)
2
+
3
+
4
+ ### Features
5
+
6
+ * **replay:** refine seek loading progress ([3d01f94](https://github.com/mvmhyper/hyper-sdk/commit/3d01f94d7e6ce360a61dd3d257149cf7f3237bcb))
7
+
1
8
  # [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
9
 
3
10
 
@@ -22,7 +22,8 @@ namespace Hyper.Internal
22
22
  [SerializeField, Min(1f)] private float seekPlaybackSpeed = 10f;
23
23
  [SerializeField, Range(0.25f, 1f)] private float seekSnapshotScale = 0.55f;
24
24
  [SerializeField, Range(0f, 0.5f)] private float seekPreparationProgress = 0.2f;
25
- [SerializeField, Min(0.1f)] private float seekPreparationDuration = 1f;
25
+ [SerializeField, Range(0f, 0.15f)] private float seekPreparationProgressVariation = 0.05f;
26
+ [SerializeField, Min(0.1f)] private float seekPreparationDuration = 3f;
26
27
  [SerializeField] private GameObject seekLoadingOverlay;
27
28
  [SerializeField] private RawImage seekSnapshotImage;
28
29
 
@@ -35,7 +36,11 @@ namespace Hyper.Internal
35
36
  private Image seekOverlayBackground;
36
37
  private Color seekOverlayBackgroundColor;
37
38
  private ReplaySeekOverlay seekOverlay;
39
+ private static readonly System.Random SeekProgressRandom = new System.Random();
38
40
  private static float displayedSeekProgress;
41
+ private static float firstSeekPreparationTarget;
42
+ private static float secondSeekPreparationTarget;
43
+ private static float seekPreparationCeiling;
39
44
 
40
45
  private void Awake()
41
46
  {
@@ -198,7 +203,7 @@ namespace Hyper.Internal
198
203
 
199
204
  float resumeSpeed = SanitizePlaybackSpeed(ReplaySessionState.UserPlaybackSpeed);
200
205
  float fastForwardSpeed = SanitizePlaybackSpeed(seekPlaybackSpeed);
201
- displayedSeekProgress = 0f;
206
+ InitializeSeekProgressPresentation();
202
207
  StartCoroutine(CaptureAndSeek(targetProgress, resumeSpeed, fastForwardSpeed));
203
208
  }
204
209
 
@@ -431,30 +436,98 @@ namespace Hyper.Internal
431
436
  }
432
437
  else if (isCapturingSeek || ReplaySessionState.IsSeekRestartPending)
433
438
  {
434
- float duration = Mathf.Max(0.1f, seekPreparationDuration);
435
- displayedSeekProgress = Mathf.MoveTowards(
436
- displayedSeekProgress,
437
- seekPreparationProgress,
438
- seekPreparationProgress * Time.unscaledDeltaTime / duration);
439
+ AdvanceSeekPreparationProgress();
439
440
  progress = displayedSeekProgress;
440
441
  }
441
442
  else
442
443
  {
444
+ EnsureSeekProgressPresentation();
443
445
  float target = ReplaySessionState.SeekTarget01;
444
446
  float reconstructionProgress = target <= Mathf.Epsilon
445
447
  ? 1f
446
448
  : ReplaySessionState.Progress01 / target;
447
449
  float realProgress = Mathf.Lerp(
448
- seekPreparationProgress,
450
+ seekPreparationCeiling,
449
451
  1f,
450
452
  Mathf.Clamp01(reconstructionProgress));
451
- displayedSeekProgress = Mathf.Max(displayedSeekProgress, realProgress);
453
+ AdvanceSeekReconstructionProgress(realProgress);
452
454
  progress = displayedSeekProgress;
453
455
  }
454
456
 
455
457
  seekOverlay.SetProgress(progress);
456
458
  }
457
459
 
460
+ private void AdvanceSeekPreparationProgress()
461
+ {
462
+ EnsureSeekProgressPresentation();
463
+ float duration = Mathf.Max(0.1f, seekPreparationDuration);
464
+ float deltaTime = Mathf.Min(Time.unscaledDeltaTime, 0.1f);
465
+
466
+ if (displayedSeekProgress < firstSeekPreparationTarget)
467
+ {
468
+ float speed = firstSeekPreparationTarget / (duration * 0.35f);
469
+ displayedSeekProgress = Mathf.MoveTowards(
470
+ displayedSeekProgress,
471
+ firstSeekPreparationTarget,
472
+ speed * deltaTime);
473
+ return;
474
+ }
475
+
476
+ if (displayedSeekProgress < secondSeekPreparationTarget)
477
+ {
478
+ float speed = (secondSeekPreparationTarget - firstSeekPreparationTarget) / (duration * 0.2f);
479
+ displayedSeekProgress = Mathf.MoveTowards(
480
+ displayedSeekProgress,
481
+ secondSeekPreparationTarget,
482
+ speed * deltaTime);
483
+ return;
484
+ }
485
+
486
+ float crawlResponse = 1f - Mathf.Exp(-deltaTime / (duration * 0.65f));
487
+ displayedSeekProgress = Mathf.Lerp(displayedSeekProgress, seekPreparationCeiling, crawlResponse);
488
+ }
489
+
490
+ private void InitializeSeekProgressPresentation()
491
+ {
492
+ float center = Mathf.Clamp01(seekPreparationProgress);
493
+ float variation = Mathf.Max(0f, seekPreparationProgressVariation);
494
+ float minimum = Mathf.Clamp01(center - variation);
495
+ float maximum = Mathf.Clamp01(center + variation);
496
+
497
+ displayedSeekProgress = 0f;
498
+ seekPreparationCeiling = RandomRange(minimum, maximum);
499
+ firstSeekPreparationTarget = seekPreparationCeiling * RandomRange(0.25f, 0.35f);
500
+ secondSeekPreparationTarget = seekPreparationCeiling * RandomRange(0.62f, 0.76f);
501
+ }
502
+
503
+ private void EnsureSeekProgressPresentation()
504
+ {
505
+ if (seekPreparationCeiling > 0f) return;
506
+ InitializeSeekProgressPresentation();
507
+ }
508
+
509
+ private static float RandomRange(float minimum, float maximum)
510
+ {
511
+ if (maximum <= minimum) return minimum;
512
+ return minimum + ((float)SeekProgressRandom.NextDouble() * (maximum - minimum));
513
+ }
514
+
515
+ private void AdvanceSeekReconstructionProgress(float realProgress)
516
+ {
517
+ float target = Mathf.Max(displayedSeekProgress, realProgress);
518
+ if (target >= 0.999f)
519
+ {
520
+ displayedSeekProgress = 1f;
521
+ return;
522
+ }
523
+
524
+ float deltaTime = Mathf.Min(Time.unscaledDeltaTime, 0.1f);
525
+ float gap = target - displayedSeekProgress;
526
+ float responseSpeed = Mathf.Lerp(5f, 14f, Mathf.Clamp01(gap * 4f));
527
+ float response = 1f - Mathf.Exp(-responseSpeed * deltaTime);
528
+ displayedSeekProgress = Mathf.Lerp(displayedSeekProgress, target, response);
529
+ }
530
+
458
531
  private void ConfigureSeekSnapshot()
459
532
  {
460
533
  if (seekSnapshotImage == null)
@@ -320,7 +320,8 @@ MonoBehaviour:
320
320
  seekPlaybackSpeed: 10
321
321
  seekSnapshotScale: 0.725
322
322
  seekPreparationProgress: 0.2
323
- seekPreparationDuration: 1
323
+ seekPreparationProgressVariation: 0.05
324
+ seekPreparationDuration: 3
324
325
  seekLoadingOverlay: {fileID: 0}
325
326
  seekSnapshotImage: {fileID: 0}
326
327
  --- !u!1 &1862654115017658012
@@ -288,7 +288,7 @@ MonoBehaviour:
288
288
  m_Name:
289
289
  m_EditorClassIdentifier:
290
290
  m_Material: {fileID: 0}
291
- m_Color: {r: 1, g: 1, b: 1, a: 0.10980392}
291
+ m_Color: {r: 1, g: 1, b: 1, a: 0.1764706}
292
292
  m_RaycastTarget: 1
293
293
  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
294
294
  m_Maskable: 1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "app.hypergames.hypersdk",
3
- "version": "1.11.0-beta.16",
3
+ "version": "1.11.0-beta.17",
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",