Skip to content

feat: pointerEvents component maxCameraDistance - #9902

Open
robtfm wants to merge 6 commits into
devfrom
feat/max-camera-distance
Open

feat: pointerEvents component maxCameraDistance#9902
robtfm wants to merge 6 commits into
devfrom
feat/max-camera-distance

Conversation

@robtfm

@robtfm robtfm commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Pull Request Description

What does this PR change?

Implements decentraland/protocol#470 for PBPointerEvents.Info:

  • max_distance is the player-distance threshold (this is what the explorer has effectively measured since 2024 — avatar head in every mode except first-person — and what deployed scenes rely on; the protocol comment now says so instead of "camera distance").
  • max_player_distance is a deprecated alias for max_distance; when both are set the larger wins.
  • New max_camera_distance: the camera-origin check (ray length), for scenes driving a virtual camera away from the avatar.
  • Combination rules keep their shape: only player → player check; only camera → camera check; both → OR; neither → player distance ≤ 10.

Fixes #9320: PrepareDefaultValues wrote MaxDistance = 10 / MaxPlayerDistance = 0 onto the live message, and the generated setters flip the Has* presence bits, so every entry looked like it had both fields and only the OR branch of IsQualifiedByDistance ever ran (the "only max_player_distance" branch was dead code). The fallback now lives in IsQualifiedByDistance.

Changes:

  • InteractionInputUtils.IsQualifiedByDistance (cursor overload): resolves the player and camera thresholds from field presence, then the 4-way rule. Proximity overload untouched.
  • InteractionInputUtils.PrepareDefaultValues: no longer touches the distance fields.
  • PlayerOriginatedRaycastSystem: scene-entity SetupHit gets hitInfo.distance as the camera distance in every camera mode (previously mode-dependent). Global-entity path unchanged.
  • PointerEvents.gen.cs regenerated from the Feat: worlds compatibility chat commands #470 protocol (scripts/npm run build-protocol); scripts/package.json still pins the older npm release — bump it once Feat: worlds compatibility chat commands #470 is published.
  • InteractionInputUtilsShould.QualifyByDistance covers the four rules and the alias.

Behaviour deltas to be aware of: first-person maxDistance now measures from the avatar root to the hit point rather than along the ray from the near plane; scenes setting only maxPlayerDistance no longer get an implicit || rayDistance <= 10.

Test scene: pointer-camera-distance-scene (cubes with maxDistance: 2, maxPlayerDistance: 2, maxCameraDistance: 5, keyed virtual cameras) — same scene used to verify the bevy side in decentraland/bevy-explorer#1158. SDK side: decentraland/js-sdk-toolchain#1560.

🤖 Generated with Claude Code


QA TEST STEPS

Use the build from this PR to enter the ZONE/SEPOLIA world sdk7testscenes.dcl.eth at position 34,20 and confirm that by getting close to the cubes you can switch them LIVE in any way

Specially confirm that you can toggle the L4 cube by standing next to it, and changing from 3rd person cam to drone cam, so that the camera distance toggles the cube LIVE state.

(the test scene can also be ran locally: https://github.com/decentraland/sdk7-test-scenes/tree/main/scenes/34%2C20-pointer-events-distances)

Screen.Recording.2026-09-02.at.4.54.20.PM.mp4

…stance

Follow decentraland/protocol#470: max_distance (and its deprecated alias
max_player_distance, larger wins) is the player-distance threshold, and
the new max_camera_distance is the camera-distance one. Combination:
only player, only camera, both (OR), neither (player <= 10).

PrepareDefaultValues no longer writes MaxDistance/MaxPlayerDistance onto
the live message: the generated setters flip the Has* presence bits, so
every entry looked like it had both fields and only the OR branch ever
ran (#9320). The fallback lives in IsQualifiedByDistance instead.

Scene-entity raycast results now carry the ray length as the camera
distance in every camera mode; the global-entity path is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@robtfm
robtfm requested review from a team as code owners August 28, 2026 16:37
@github-actions
github-actions Bot requested a review from anicalbano August 28, 2026 16:37
@decentraland-bot decentraland-bot added the ext-contribution Identifies a contribution which was not initiated by a Unity Developer label Aug 28, 2026
@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

🚦 CI Status

Build

Windows and Mac built successfully in Unity Cloud.

Name Links & timing
Build 2906f70 · Logs · built 2026-09-04T01:05:29Z
Windows GitHub job · Unity Cloud #5 · Unity log · ⏱ 25m 44s build + 7m 5s queue · Download .zip · .zip via S3
Mac GitHub job · Unity Cloud #5 · Unity log · ⏱ 28m 42s build + 2m 4s queue · Download .zip · .zip via S3

Lint

Warnings count reduced: 12170 => 12166

Warnings/errors in files changed by this PR (7)
Assets/DCL/Web3/Authenticators/Implementations/ThirdWeb/ThirdWebLoginService.cs:180  CSharpWarnings::CS8604  Possible null reference argument for parameter 'obj' in 'System.Action<in T>.Invoke'
Assets/DCL/Web3/Authenticators/Implementations/ThirdWeb/ThirdWebLoginService.cs:191  CSharpWarnings::CS8604  Possible null reference argument for parameter 'value' in 'DCL.Prefs.DCLPlayerPrefs.SetString'
Assets/DCL/Web3/Authenticators/Implementations/ThirdWeb/ThirdWebLoginService.cs:44  CSharpWarnings::CS8625  Cannot convert null literal to non-nullable reference type
Assets/DCL/Interaction/Systems/PlayerOriginatedProximitySystem.cs:11  RedundantUsingDirective  Using directive is not required by the code and can be safely removed
Assets/DCL/Interaction/Systems/PlayerOriginatedProximitySystem.cs:42  UnusedMember.Local  Constant 'PROXIMITY_COLLIDERS_DEFAULT_SIZE' is never used
Assets/DCL/Interaction/Systems/PlayerOriginatedProximitySystem.cs:37  UnusedMember.Local  Constant 'PROXIMITY_COLLIDERS_MAX_SIZE' is never used
Assets/DCL/Web3/Authenticators/Implementations/ThirdWeb/ThirdWebLoginService.cs:44  VariableCanBeNotNullable  'email' can be declared as non-nullable

Lint run · full InspectCode report · took 22m 57s

Tests

All Unity tests passed ✅

TESTS SUITE Result Passed Failed Skipped Tests time Job time
EditMode ✅ Passed 25713 0 13 4m 0s 14m 25s
PlayMode ✅ Passed 248 0 37 37s 11m 27s

Tests time sums the test cases; Job time is the job's wall clock including checkout, licensing and asset import.

Slowest tests
  • [editmode] 16.5s DCL.AuthenticationScreenFlow.Tests.ProfileFetchingAuthStateShould.CancelStalledFetchOnTimeout
  • [editmode] 13.0s DCL.Tests.Editor.ValidationTests.CheckForDebugUsage
  • [editmode] 11.5s DCL.Tests.Editor.ValidationTests.CheckUnityObjectsForMissingReferences
  • [editmode] 10.0s DCL.Notifications.Tests.NotificationsRequestControllerShould.ReuseSingleListInstanceAcrossPollIterations
  • [editmode] 5.2s DCL.Tests.Editor.ValidationTests.SettingsAreValid
  • [editmode] 5.0s DCL.Friends.Tests.FriendsConnectivityStatusTrackerShould.RaiseOnlineEventWhenSameStatusIsRebroadcastAfterReset
  • [editmode] 5.0s CrdtEcsBridge.WorldSynchronizer.Tests.CrdtWorldSynchronizerShould.ThrowIfSyncBufferIsAlreadyRented
  • [editmode] 4.3s SceneRunner.Tests.SceneFacadeShould.ContinueUpdateLoopOnBackgroundThread(30,4000)
  • [editmode] 4.1s SceneRunner.Tests.SceneFacadeShould.ContinueUpdateLoopOnBackgroundThread(10,4000)
  • [editmode] 4.1s SceneRunner.Tests.SceneFacadeShould.ContinueUpdateLoopOnBackgroundThread(60,4000)
  • [playmode] 4.7s Global.Tests.PlayMode.CubeWaveSceneShould.EmitECSComponents
  • [playmode] 2.4s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.ContinuousTweensRunIndefinitelyWhenDurationIsZero
  • [playmode] 2.1s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TextureMoveSequenceUpdatesMaterial
  • [playmode] 1.9s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.MoveContinuousMovesAndCompletesAfterDuration
  • [playmode] 1.8s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceWithoutLoopCompletesOnce
  • [playmode] 1.8s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.TextureMoveContinuousOffsetCompletesAndUpdatesMaterial
  • [playmode] 1.8s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.RotateContinuousCompletesAfterDuration
  • [playmode] 1.4s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceWithMoveRotateScaleWithOmittedScale_ResolvesScaleFromCurrentTransform
  • [playmode] 1.3s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.RotateContinuousPositiveAndNegativeYDirectionsAreOpposite
  • [playmode] 1.2s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceWithMultipleTweens

Full report: run summary · results + editor logs: editmode · playmode

Performance

🏁 Bare-metal benchmark finished — run #33824440522.

Full report

PR #9902, run #33824440522

Overall: ✅ no significant changes

Builds: Windows change, Windows baseline, macOS change, macOS baseline

How to read this table
  • Each build is measured 3 times, interleaved with the other build (change, baseline, change, baseline, ...) in the same session, so both see the same world content and machine state. The values are the median, and (min–max) is the lowest and highest of those runs.
  • Δ is Change minus Baseline (a negative Δ means Change is faster).
  • 🟢 faster / 🔴 slower — a difference that passed every check: the runs are fully separated (every run of one build faster than every run of the other), and the median difference is at least 3% and at least 0.5 ms.
  • ⚪ within noise — the builds' runs overlap, or the difference is tiny; it cannot be told apart from random variation. Treat it as no change.
  • — informational — the 0.1% worst metrics average only the few worst frames of a run, so a single OS hiccup swings them by a lot; they are shown for context and never earn a verdict.
  • ⚠️ no verdict — the two builds' sessions were not comparable (very different sample counts, or too few usable runs), so no conclusion is drawn from them.
  • Exceptions per run — the average number of exceptions in a run's log, not counting teardown ones logged while the app quits. Flagged only on a difference of at least 2 per run and 1.5× the other build; exception kinds the baseline never threw are called out under the table. The Exception breakdown groups all of them by the explorer's report category and exception type (as totals across the runs).
  • A run that logged unusually many exceptions (at least 10 and 5× the median of its build's runs — e.g. a service was down during it) is excluded from all numbers and called out under the table.
  • The Overall line at the top only reacts to a metric that moved on two or more machines, or by 10% or more on one — a single modest 🟢/🔴 cell can still be a statistical fluke.

Apple M1

Metric Baseline Change Δ Result
Samples 3602 (×3) 3754 (×3)
CPU average 24.9 ms (23.9–41.2) 23.8 ms (23.3–24.2) -1.0 ms ⚪ within noise
CPU 1% worst 219.8 ms (217.7–954.0) 217.8 ms (216.7–220.5) -2.1 ms ⚪ within noise
CPU 0.1% worst 228.6 ms (222.7–7647.6) 223.9 ms (221.0–233.3) -4.6 ms — informational
GPU average 43.1 ms (38.7–45.3) 43.6 ms (41.8–44.2) 0.5 ms ⚪ within noise
GPU 1% worst 53.9 ms (51.5–56.0) 52.4 ms (52.2–52.9) -1.6 ms ⚪ within noise
GPU 0.1% worst 56.9 ms (55.1–58.1) 56.1 ms (54.4–56.4) -0.9 ms — informational
Exceptions per run 0.67 0 -0.67 ⚪ no significant change
Exception breakdown
Exception Baseline (3 runs) Change (3 runs)
[CRDT_ECS_BRIDGE] TimeoutException 1 0
[UNKNOWN] TimeoutException 1 0

Intel Core i5

Metric Baseline Change Δ Result
Samples 4203 (×3) 4091 (×3)
CPU average 21.4 ms (19.6–21.8) 21.7 ms (16.7–22.0) 0.4 ms ⚪ within noise
CPU 1% worst 416.0 ms (331.4–460.7) 438.3 ms (272.4–459.4) 22.3 ms ⚪ within noise
CPU 0.1% worst 442.0 ms (397.6–491.7) 463.1 ms (310.0–575.1) 21.1 ms — informational
GPU average 13.3 ms (12.4–14.2) 14.1 ms (9.8–14.2) 0.8 ms ⚪ within noise
GPU 1% worst 280.0 ms (184.1–339.4) 298.7 ms (138.4–326.1) 18.7 ms ⚪ within noise
GPU 0.1% worst 440.1 ms (394.4–474.5) 456.5 ms (305.9–549.9) 16.4 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

@github-actions

Copy link
Copy Markdown
Contributor

Slack notification sent to #explorer-ext-contributions for external review.
To re-send, delete this comment and re-add the ext-contribution label.

@decentraland-bot decentraland-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Review: fix: PointerEvents max_distance is player distance; add max_camera_distance


STEP 1 — Context & Scope

Files in diff:

  • InteractionInputUtils.cs — core distance-qualification rewrite + PrepareDefaultValues cleanup
  • InteractionInputUtilsShould.cs — new unit tests for the 4-way distance rules
  • PlayerOriginatedRaycastSystem.cs — scene-entity SetupHit now passes hitInfo.distance (ray length)
  • PointerEvents.gen.cs — regenerated protobuf with MaxCameraDistance (field 8)

Surrounding context read (not in diff):

  • PlayerOriginatedProximitySystem.cs — proximity overlap + GetMaxDistanceAndHighestPriority (line 217)
  • ProcessPointerEventsSystem.cs — main consumer calling PrepareDefaultValues + both IsQualifiedByDistance overloads (lines 306-310)
  • HoverFeedbackUtils.cs — calls IsQualifiedByDistance for hover-leave events (line 30)
  • PlayerOriginRaycastResultForSceneEntities.cs — struct with float? DistanceToPlayer and float GetDistance()
  • ProximityResultForSceneEntities.cs — class with non-nullable float DistanceToPlayer
  • PlayerInteractionEntity.csPlayerPosition nullable when CharacterController absent

Docs: CLAUDE.md, docs/README.md, review-instructions prompt.


STEP 2 — Root-Cause Check

Problem: The protocol (decentraland/protocol#470) redefines max_distance as player distance (matching what the explorer has effectively measured since 2024), deprecates max_player_distance as an alias, and adds a new max_camera_distance for the camera-origin check. The old code also had a bug (#9320): PrepareDefaultValues wrote MaxDistance = 10 / MaxPlayerDistance = 0, flipping Has* presence bits, so every entry appeared to have both fields and only the OR branch of IsQualifiedByDistance ever ran.

Does the diff fix the cause? Yes for the cursor/raycast path — the rewrite correctly resolves player and camera thresholds from field presence and moves the default out of PrepareDefaultValues into the (null, null) fallback. However, the proximity interaction path (PlayerOriginatedProximitySystem + proximity overload of IsQualifiedByDistance) still reads only MaxPlayerDistance, which is now the deprecated field. This is an incomplete application of the semantic change — see P1 below.

STEP 2 verdict: PARTIAL — cursor path fixed, proximity path not updated.


STEP 3 — Design & Integration

No new long-lived units are introduced. The change is a semantic rewrite within existing static helpers and an existing system. Design is sound for the cursor path.

Teardown/consumption trace: No new subscriptions, events, or resources are opened. The protobuf field MaxCameraDistance is purely a data read. ✅


STEP 4 — Member Audit

  • DEFAULT_MAX_DISTANCE (new public const, line 13): Used by the (null, null) fallback in IsQualifiedByDistance (1 consumer). Appropriate — documents the protocol default and avoids a magic number.

STEP 5 — Line-Level Findings

P1 — Proximity system not updated for new max_distance semantics

Locations (not in diff):

  • PlayerOriginatedProximitySystem.cs line 233 — GetMaxDistanceAndHighestPriority()
  • InteractionInputUtils.cs lines 62-67 — proximity overload of IsQualifiedByDistance

Problem: This PR redefines max_distance as the canonical player-distance field and deprecates max_player_distance as an alias. The cursor overload correctly resolves both fields (taking the max when both present). The proximity code path has two gaps:

  1. GetMaxDistanceAndHighestPriority (line 233) reads info.MaxPlayerDistance directly (deprecated field only, no Has check). When a scene uses only max_distance: 5 for proximity events, MaxPlayerDistance returns 0 (proto default), sqrMaxPlayerDistance = 0, and every entity is filtered out → proximity silently broken.

  2. Proximity IsQualifiedByDistance overload (line 66) only checks HasMaxPlayerDistance. Three broken cases:

    • Scene sets only max_distance: HasMaxPlayerDistance is false → returns true unconditionally (no distance limit applied)
    • Scene sets both: only deprecated value used, "larger wins" reconciliation skipped
    • Scene sets neither: returns true unconditionally — contradicts the cursor overload's DEFAULT_MAX_DISTANCE = 10f fallback (unlimited range for proximity while cursor has 10-unit cap)

Once the SDK migrates scenes from deprecated max_player_distance to canonical max_distance, proximity interactions will silently break.

Fix for GetMaxDistanceAndHighestPriority (line 233):

// Replace:
float maxDistance = info.MaxPlayerDistance;
// With:
float maxDistance = (info.HasMaxDistance, info.HasMaxPlayerDistance) switch
{
    (true, true)   => Mathf.Max(info.MaxDistance, info.MaxPlayerDistance),
    (true, false)  => info.MaxDistance,
    (false, true)  => info.MaxPlayerDistance,
    (false, false) => PROXIMITY_DEFAULT_MAX_DISTANCE,
};

Fix for proximity IsQualifiedByDistance (lines 62-67):

public static bool IsQualifiedByDistance(
    in ProximityResultForSceneEntities proximityResultForSceneEntities,
    PBPointerEvents.Types.Info info
)
{
    float? maxPlayerDistance = (info.HasMaxDistance, info.HasMaxPlayerDistance) switch
    {
        (true, true)   => Mathf.Max(info.MaxDistance, info.MaxPlayerDistance),
        (true, false)  => info.MaxDistance,
        (false, true)  => info.MaxPlayerDistance,
        _              => null,
    };
    float effectiveMax = maxPlayerDistance ?? DEFAULT_MAX_DISTANCE;
    return proximityResultForSceneEntities.DistanceToPlayer <= effectiveMax;
}

Consider extracting the alias-resolution switch into a shared static float? ResolveMaxPlayerDistance(PBPointerEvents.Types.Info info) helper to avoid duplicating it across three call sites.

P2 — Missing reverse-alias test case

(See inline suggestion on test file)

P2 — Branch/title convention mismatch (ADR-6)

Branch: feat/max-camera-distance, PR title: fix:. The branch prefix should match the commit type. Minor — not blocking.


Security Review

No security issues found.

  • NaN distance values: <= comparisons return false per IEEE 754 (rejects interaction — safe)
  • Infinity: bounded by MAX_RAYCAST_DISTANCE = 100f raycast cap
  • Negatives: distances are non-negative, so <= negative is false
  • No hardcoded secrets, no sensitive data in logs

STEP 6 — Complexity

COMPLEX — modifies pointer event distance semantics, interaction qualification logic, and raycast system input handling.

STEP 7 — QA Assessment

QA required — changes affect runtime interaction behavior (distance checks for pointer events governing hover, click, and proximity).

STEP 8 — Non-blocking warnings

None. Main.unity not modified.


REVIEW_RESULT: FAIL ❌
COMPLEXITY: COMPLEX
COMPLEXITY_REASON: Modifies pointer-event distance semantics and interaction qualification across raycast and proximity systems
QA_REQUIRED: YES


Reviewed by Jarvis 🤖 · Requested by unknown (<@unknown>) via Slack

Assert.IsTrue(InteractionInputUtils.IsQualifiedByDistance(result, new PBPointerEvents.Types.Info { MaxPlayerDistance = 6 }));
Assert.IsFalse(InteractionInputUtils.IsQualifiedByDistance(result, new PBPointerEvents.Types.Info { MaxPlayerDistance = 4 }));
Assert.IsTrue(InteractionInputUtils.IsQualifiedByDistance(result, new PBPointerEvents.Types.Info { MaxDistance = 4, MaxPlayerDistance = 6 }));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Missing reverse-alias test case. The test verifies MaxDistance=4, MaxPlayerDistance=6 (alias wins), but not the reverse direction where the canonical field wins. Add a case to confirm Mathf.Max works both ways.

Suggested change
Assert.IsTrue(InteractionInputUtils.IsQualifiedByDistance(result, new PBPointerEvents.Types.Info { MaxDistance = 4, MaxPlayerDistance = 6 }));
Assert.IsTrue(InteractionInputUtils.IsQualifiedByDistance(result, new PBPointerEvents.Types.Info { MaxDistance = 6, MaxPlayerDistance = 4 }));

Review follow-up: the proximity broad-phase and its IsQualifiedByDistance
overload still read only the deprecated max_player_distance. Resolve the
threshold through a shared ResolveMaxPlayerDistance (max_distance, alias,
larger wins; null when neither) so cursor and proximity agree; proximity
falls back to its 3 m default in the broad-phase and to the 10 m default
in the qualifier. Adds the reverse-alias and proximity test cases.

Also clears four RedundantArgumentDefaultValue warnings elsewhere to
satisfy the lint ratchet (no warnings in the files this PR touches).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@robtfm robtfm changed the title fix: PointerEvents max_distance is player distance; add max_camera_distance feat: PointerEvents max_distance is player distance; add max_camera_distance Aug 28, 2026
@robtfm

robtfm commented Aug 28, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the review:

  • P1 proximity pathGetMaxDistanceAndHighestPriority and the proximity IsQualifiedByDistance overload now resolve the threshold via a shared InteractionInputUtils.ResolveMaxPlayerDistance (max_distance, deprecated alias, larger wins; null when neither). Broad-phase falls back to PROXIMITY_DEFAULT_MAX_DISTANCE (3 m), the qualifier to DEFAULT_MAX_DISTANCE (10 m; moot in practice since the overlap sphere already caps candidates at 3 m). Camera distance plays no part in proximity.
  • P2 reverse-alias test — added (MaxDistance = 6, MaxPlayerDistance = 4 → true; 3/4 → false), plus a QualifyProximityByDistance test.
  • P2 branch/title — retitled to feat: to match the branch.
  • Lint ratchet — cleared four RedundantArgumentDefaultValue warnings (ThirdWebLoginService.cs:29, DefaultTexturesContainer.cs:75-76) since the files in this PR introduce none.

@decentraland-bot

This comment has been minimized.

@pravusjif pravusjif self-assigned this Aug 31, 2026
@pravusjif
pravusjif marked this pull request as draft August 31, 2026 17:08
@pravusjif pravusjif added the no-warning-ratchet Prevent CI linting checks label Aug 31, 2026
@pravusjif
pravusjif marked this pull request as ready for review September 2, 2026 15:11
@github-actions
github-actions Bot requested a review from DafGreco September 2, 2026 15:11
@pravusjif pravusjif changed the title feat: PointerEvents max_distance is player distance; add max_camera_distance feat: PointerEvents max_camera_distance Sep 2, 2026
@pravusjif
pravusjif requested review from dalkia and popuz and removed request for lorux0 and mikhail-dcl September 2, 2026 15:12
@pravusjif pravusjif changed the title feat: PointerEvents max_camera_distance feat: pointerEvents component maxCameraDistance Sep 2, 2026
@pravusjif pravusjif added the sdk label Sep 2, 2026

@anicalbano anicalbano left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QA


✔️ Reviewed in both macOS and Windows systems
✔️ No regressions were found

03.09.2026_08.52.40_REC.mp4

@pravusjif
pravusjif removed the request for review from DafGreco September 4, 2026 00:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ext-contribution Identifies a contribution which was not initiated by a Unity Developer no-warning-ratchet Prevent CI linting checks sdk

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PointerEvents maxDistance and maxPlayerDistance not behaving as expected

4 participants