app.hypergames.hypersdk 1.11.0-beta.2 → 1.11.0-beta.4
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 +15 -0
- package/Runtime/Internal/Core/HyperRuntime.cs +22 -1
- package/Runtime/Internal/Managers/DataManager.cs +1 -1
- package/Runtime/Internal/Managers/GameManager.cs +3 -1
- package/Samples~/LaneRunner/LaneRunnerSample.unity +4 -3
- package/Samples~/LaneRunner/Prefabs/DoubleScorePickup.prefab +1 -1
- package/Samples~/LaneRunner/Prefabs/Obstacle.prefab +1 -1
- package/Samples~/LaneRunner/README.md +8 -1
- package/Samples~/LaneRunner/Scripts/Gameplay/LaneRunnerPlayer.cs +18 -4
- package/Samples~/LaneRunner/Scripts/Gameplay/LaneRunnerSpawner.cs +3 -1
- package/Samples~/LaneRunner/Scripts/Hyper/LaneRunnerTournamentAdapter.cs +7 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# [1.11.0-beta.4](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.3...v1.11.0-beta.4) (2026-08-28)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **replay:** align recording with fixed simulation ([ae2b322](https://github.com/mvmhyper/hyper-sdk/commit/ae2b32216a0a9ea125572d788eee3bfd846414b0))
|
|
7
|
+
|
|
8
|
+
# [1.11.0-beta.3](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.2...v1.11.0-beta.3) (2026-08-28)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **replay:** reset random state before playback restart ([526a4d9](https://github.com/mvmhyper/hyper-sdk/commit/526a4d98c9b22241e3c52bb6837145bad999fb2b))
|
|
14
|
+
* **sample:** support lane runner custom restart ([49da385](https://github.com/mvmhyper/hyper-sdk/commit/49da385aaa917de438672a8630d4fe7927741b2a))
|
|
15
|
+
|
|
1
16
|
# [1.11.0-beta.2](https://github.com/mvmhyper/hyper-sdk/compare/v1.11.0-beta.1...v1.11.0-beta.2) (2026-08-27)
|
|
2
17
|
|
|
3
18
|
|
|
@@ -20,6 +20,7 @@ namespace Hyper.Internal
|
|
|
20
20
|
|
|
21
21
|
private static bool _isInitialized;
|
|
22
22
|
private static bool _isSoftRestarting;
|
|
23
|
+
private static bool _replayRandomResetPending;
|
|
23
24
|
private static bool _customLoadingComplete;
|
|
24
25
|
private static bool _customLoadingActive;
|
|
25
26
|
private static float _customLoadingProgress;
|
|
@@ -32,6 +33,7 @@ namespace Hyper.Internal
|
|
|
32
33
|
private static EventManager _eventManager;
|
|
33
34
|
private static TimerManager _timerManager;
|
|
34
35
|
private static ReplayManager _replayManager;
|
|
36
|
+
private static double _fixedSimulationTimeSeconds;
|
|
35
37
|
|
|
36
38
|
internal static bool IsInitialized => _isInitialized;
|
|
37
39
|
internal static bool IsSoftRestarting
|
|
@@ -58,6 +60,7 @@ namespace Hyper.Internal
|
|
|
58
60
|
internal static EventManager EventManager => _eventManager;
|
|
59
61
|
internal static TimerManager Timer => _timerManager;
|
|
60
62
|
internal static ReplayManager ReplayManager => _replayManager;
|
|
63
|
+
internal static double FixedSimulationTimeSeconds => _fixedSimulationTimeSeconds;
|
|
61
64
|
|
|
62
65
|
internal static event Action CustomLoadingStarted
|
|
63
66
|
{
|
|
@@ -145,7 +148,8 @@ namespace Hyper.Internal
|
|
|
145
148
|
_gameManager != null && _eventManager != null)
|
|
146
149
|
{
|
|
147
150
|
_replayManager?.PrepareForRestart();
|
|
148
|
-
|
|
151
|
+
// Custom cleanup may use random streams. Rewind after cleanup, immediately before OnGameStart.
|
|
152
|
+
DeferReplayRandomReset();
|
|
149
153
|
_gameManager.ResetUIStateForCustomRestart();
|
|
150
154
|
_eventManager.InvokeCustomRestartEvent();
|
|
151
155
|
_isSoftRestarting = false;
|
|
@@ -176,6 +180,19 @@ namespace Hyper.Internal
|
|
|
176
180
|
HyperRandom.Init(ReplaySessionState.OriginalRandomSeed);
|
|
177
181
|
}
|
|
178
182
|
|
|
183
|
+
internal static void ApplyPendingReplayRandomReset()
|
|
184
|
+
{
|
|
185
|
+
if (!_replayRandomResetPending) return;
|
|
186
|
+
|
|
187
|
+
_replayRandomResetPending = false;
|
|
188
|
+
ResetReplayRandomState();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
internal static void DeferReplayRandomReset()
|
|
192
|
+
{
|
|
193
|
+
_replayRandomResetPending = true;
|
|
194
|
+
}
|
|
195
|
+
|
|
179
196
|
/// <summary>
|
|
180
197
|
/// Coroutine-based restart that properly unloads all scenes before reloading.
|
|
181
198
|
/// Handles async scene operations and ensures clean state before restart.
|
|
@@ -381,6 +398,7 @@ namespace Hyper.Internal
|
|
|
381
398
|
internal static void FixedTick()
|
|
382
399
|
{
|
|
383
400
|
if (!_isInitialized) return;
|
|
401
|
+
_fixedSimulationTimeSeconds += Time.fixedDeltaTime;
|
|
384
402
|
_replayManager?.FixedTick();
|
|
385
403
|
_timerManager?.FixedTick();
|
|
386
404
|
}
|
|
@@ -414,6 +432,7 @@ namespace Hyper.Internal
|
|
|
414
432
|
_customLoadingComplete = false;
|
|
415
433
|
_customLoadingActive = false;
|
|
416
434
|
_customLoadingProgress = 0f;
|
|
435
|
+
_replayRandomResetPending = false;
|
|
417
436
|
|
|
418
437
|
if (_singletonObject != null)
|
|
419
438
|
{
|
|
@@ -472,6 +491,8 @@ namespace Hyper.Internal
|
|
|
472
491
|
_customLoadingComplete = false;
|
|
473
492
|
_customLoadingActive = false;
|
|
474
493
|
_customLoadingProgress = 0f;
|
|
494
|
+
_replayRandomResetPending = false;
|
|
495
|
+
_fixedSimulationTimeSeconds = 0d;
|
|
475
496
|
}
|
|
476
497
|
}
|
|
477
498
|
}
|
|
@@ -1025,6 +1025,8 @@ namespace Hyper.Internal.Managers
|
|
|
1025
1025
|
if (_gameStartRequested || _hasGameStarted || _hasGameEnded || !IsInGameScene) return;
|
|
1026
1026
|
_gameStartRequested = true;
|
|
1027
1027
|
|
|
1028
|
+
HyperRuntime.ApplyPendingReplayRandomReset();
|
|
1029
|
+
|
|
1028
1030
|
HideStartGameDeadlineSnackBar();
|
|
1029
1031
|
_dataManager.UpdateScore(0);
|
|
1030
1032
|
HyperRuntime.Timer.StartActiveGameTimer();
|
|
@@ -1062,7 +1064,7 @@ namespace Hyper.Internal.Managers
|
|
|
1062
1064
|
|
|
1063
1065
|
/// <summary>
|
|
1064
1066
|
/// Resets SDK UI state for custom restart flow.
|
|
1065
|
-
/// Called
|
|
1067
|
+
/// Called before OnCustomRestart so the developer's cleanup starts from reset SDK state.
|
|
1066
1068
|
/// </summary>
|
|
1067
1069
|
internal void ResetUIStateForCustomRestart()
|
|
1068
1070
|
{
|
|
@@ -491,7 +491,8 @@ MonoBehaviour:
|
|
|
491
491
|
laneChangeSpeed: 14
|
|
492
492
|
jumpVelocity: 7.5
|
|
493
493
|
swipeThreshold: 45
|
|
494
|
-
startPosition: {x: 3.62, y: 0.
|
|
494
|
+
startPosition: {x: 3.62, y: 0.5, z: 0}
|
|
495
|
+
groundHeight: 0.5
|
|
495
496
|
--- !u!54 &554141008
|
|
496
497
|
Rigidbody:
|
|
497
498
|
m_ObjectHideFlags: 0
|
|
@@ -574,7 +575,7 @@ BoxCollider:
|
|
|
574
575
|
m_Material: {fileID: 0}
|
|
575
576
|
m_IncludeLayers:
|
|
576
577
|
serializedVersion: 2
|
|
577
|
-
m_Bits:
|
|
578
|
+
m_Bits: 1
|
|
578
579
|
m_ExcludeLayers:
|
|
579
580
|
serializedVersion: 2
|
|
580
581
|
m_Bits: 0
|
|
@@ -1051,7 +1052,7 @@ BoxCollider:
|
|
|
1051
1052
|
m_Material: {fileID: 0}
|
|
1052
1053
|
m_IncludeLayers:
|
|
1053
1054
|
serializedVersion: 2
|
|
1054
|
-
m_Bits:
|
|
1055
|
+
m_Bits: 1
|
|
1055
1056
|
m_ExcludeLayers:
|
|
1056
1057
|
serializedVersion: 2
|
|
1057
1058
|
m_Bits: 0
|
|
@@ -13,13 +13,20 @@ deterministic spawning, a timed score multiplier, and replay integration.
|
|
|
13
13
|
Assign `LaneRunnerSample` as the Game and Practice scene in Hyper Game Content
|
|
14
14
|
Config, then use Hyper's Editor game-mode menu to run Practice, Battle, or Replay.
|
|
15
15
|
Battle sessions record to `hyper-replay.ndjson` in `Application.persistentDataPath`.
|
|
16
|
+
Enable Custom Restart Flow in Hyper SDK Settings to test in-place Watch Again and
|
|
17
|
+
replay seeking without reloading the scene.
|
|
18
|
+
|
|
19
|
+
The sample uses only Unity's built-in `Default` layer, `Untagged`, and
|
|
20
|
+
`MainCamera`. Its collider overrides and ground safety do not require changes to
|
|
21
|
+
the importing project's tags, layers, or physics collision matrix.
|
|
16
22
|
|
|
17
23
|
## Integration structure
|
|
18
24
|
|
|
19
25
|
- `LaneRunnerGame` owns rules, score, speed, and power-up state.
|
|
20
26
|
- `LaneRunnerPlayer` owns physical input and applies commands in `FixedUpdate`.
|
|
21
27
|
- `LaneRunnerSpawner` creates deterministic rows using `HyperRandom`.
|
|
22
|
-
- `LaneRunnerTournamentAdapter` connects score, power-ups,
|
|
28
|
+
- `LaneRunnerTournamentAdapter` connects score, power-ups, lifecycle, and custom
|
|
29
|
+
restart handling to HyperSDK.
|
|
23
30
|
- `LaneRunnerReplayAdapter` records accepted commands and injects replay commands
|
|
24
31
|
through the same player path.
|
|
25
32
|
|
|
@@ -11,7 +11,8 @@ namespace HyperSamples.LaneRunner
|
|
|
11
11
|
[SerializeField] private float laneChangeSpeed = 14f;
|
|
12
12
|
[SerializeField] private float jumpVelocity = 7.5f;
|
|
13
13
|
[SerializeField] private float swipeThreshold = 45f;
|
|
14
|
-
[SerializeField] private Vector3 startPosition = new Vector3(0f, 0.
|
|
14
|
+
[SerializeField] private Vector3 startPosition = new Vector3(0f, 0.5f, 0f);
|
|
15
|
+
[SerializeField] private float groundHeight = 0.5f;
|
|
15
16
|
|
|
16
17
|
public event Action<LaneRunnerCommand> CommandApplied;
|
|
17
18
|
|
|
@@ -48,18 +49,18 @@ namespace HyperSamples.LaneRunner
|
|
|
48
49
|
|
|
49
50
|
private void FixedUpdate()
|
|
50
51
|
{
|
|
52
|
+
StabilizeGround();
|
|
53
|
+
|
|
51
54
|
if (pendingLaneDelta != 0)
|
|
52
55
|
{
|
|
53
56
|
int nextLane = Mathf.Clamp(targetLane + pendingLaneDelta, -1, 1);
|
|
54
57
|
pendingLaneDelta = 0;
|
|
55
|
-
Debug.Log($"LaneRunnerPlayer: Moving from lane {targetLane} to {nextLane}");
|
|
56
58
|
if (nextLane != targetLane)
|
|
57
59
|
{
|
|
58
60
|
LaneRunnerCommand applied = nextLane < targetLane
|
|
59
61
|
? LaneRunnerCommand.MoveLeft
|
|
60
62
|
: LaneRunnerCommand.MoveRight;
|
|
61
63
|
targetLane = nextLane;
|
|
62
|
-
Debug.Log($"targetLane updated to {targetLane}");
|
|
63
64
|
CommandApplied?.Invoke(applied);
|
|
64
65
|
}
|
|
65
66
|
}
|
|
@@ -120,7 +121,20 @@ namespace HyperSamples.LaneRunner
|
|
|
120
121
|
|
|
121
122
|
private bool IsGrounded()
|
|
122
123
|
{
|
|
123
|
-
return body.position.y <= 0.
|
|
124
|
+
return body.position.y <= groundHeight + 0.18f && body.linearVelocity.y <= 0.05f;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private void StabilizeGround()
|
|
128
|
+
{
|
|
129
|
+
if (body.position.y >= groundHeight || body.linearVelocity.y > 0f) return;
|
|
130
|
+
|
|
131
|
+
Vector3 position = body.position;
|
|
132
|
+
position.y = groundHeight;
|
|
133
|
+
body.position = position;
|
|
134
|
+
|
|
135
|
+
Vector3 velocity = body.linearVelocity;
|
|
136
|
+
velocity.y = 0f;
|
|
137
|
+
body.linearVelocity = velocity;
|
|
124
138
|
}
|
|
125
139
|
|
|
126
140
|
private void ReadTouchInput()
|
|
@@ -61,7 +61,9 @@ namespace HyperSamples.LaneRunner
|
|
|
61
61
|
{
|
|
62
62
|
for (int i = activeItems.Count - 1; i >= 0; i--)
|
|
63
63
|
{
|
|
64
|
-
if (activeItems[i]
|
|
64
|
+
if (activeItems[i] == null) continue;
|
|
65
|
+
activeItems[i].gameObject.SetActive(false);
|
|
66
|
+
Destroy(activeItems[i].gameObject);
|
|
65
67
|
}
|
|
66
68
|
activeItems.Clear();
|
|
67
69
|
}
|
|
@@ -16,6 +16,7 @@ namespace HyperSamples.LaneRunner
|
|
|
16
16
|
{
|
|
17
17
|
HyperSDK.Event.OnGameStart += HandleGameStart;
|
|
18
18
|
HyperSDK.Event.OnGameEnded += HandleGameEnded;
|
|
19
|
+
HyperSDK.Event.OnCustomRestart += HandleCustomRestart;
|
|
19
20
|
game.ScoreChanged += HandleScoreChanged;
|
|
20
21
|
game.DoubleScoreChanged += HandleDoubleScoreChanged;
|
|
21
22
|
game.GameOverRequested += HandleGameOverRequested;
|
|
@@ -25,6 +26,7 @@ namespace HyperSamples.LaneRunner
|
|
|
25
26
|
{
|
|
26
27
|
HyperSDK.Event.OnGameStart -= HandleGameStart;
|
|
27
28
|
HyperSDK.Event.OnGameEnded -= HandleGameEnded;
|
|
29
|
+
HyperSDK.Event.OnCustomRestart -= HandleCustomRestart;
|
|
28
30
|
game.ScoreChanged -= HandleScoreChanged;
|
|
29
31
|
game.DoubleScoreChanged -= HandleDoubleScoreChanged;
|
|
30
32
|
game.GameOverRequested -= HandleGameOverRequested;
|
|
@@ -35,6 +37,11 @@ namespace HyperSamples.LaneRunner
|
|
|
35
37
|
game.Begin(!HyperSDK.Game.IsReplayMode);
|
|
36
38
|
}
|
|
37
39
|
|
|
40
|
+
private void HandleCustomRestart()
|
|
41
|
+
{
|
|
42
|
+
game.Stop();
|
|
43
|
+
}
|
|
44
|
+
|
|
38
45
|
private void HandleGameEnded()
|
|
39
46
|
{
|
|
40
47
|
game.Stop();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "app.hypergames.hypersdk",
|
|
3
|
-
"version": "1.11.0-beta.
|
|
3
|
+
"version": "1.11.0-beta.4",
|
|
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",
|