diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml
index 289f2f0ce9e..76bc758edcd 100644
--- a/doc/classes/Camera2D.xml
+++ b/doc/classes/Camera2D.xml
@@ -153,6 +153,8 @@
If [code]true[/code], the camera smoothly stops when reaches its limits.
+ This has no effect if smoothing is disabled.
+ [b]Note:[/b] To immediately update the camera's position to be within limits without smoothing, even with this setting enabled, invoke [method reset_smoothing].
Top scroll limit in pixels. The camera stops moving when reaching this value.
diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp
index f070191a11f..bc03d77fe86 100644
--- a/scene/2d/camera_2d.cpp
+++ b/scene/2d/camera_2d.cpp
@@ -196,20 +196,23 @@ Transform2D Camera2D::get_camera_transform() {
}
Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom);
- if (screen_rect.position.x < limit[MARGIN_LEFT]) {
- screen_rect.position.x = limit[MARGIN_LEFT];
- }
- if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) {
- screen_rect.position.x = limit[MARGIN_RIGHT] - screen_rect.size.x;
- }
+ if (!limit_smoothing_enabled) {
+ if (screen_rect.position.x < limit[MARGIN_LEFT]) {
+ screen_rect.position.x = limit[MARGIN_LEFT];
+ }
- if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) {
- screen_rect.position.y = limit[MARGIN_BOTTOM] - screen_rect.size.y;
- }
+ if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) {
+ screen_rect.position.x = limit[MARGIN_RIGHT] - screen_rect.size.x;
+ }
- if (screen_rect.position.y < limit[MARGIN_TOP]) {
- screen_rect.position.y = limit[MARGIN_TOP];
+ if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) {
+ screen_rect.position.y = limit[MARGIN_BOTTOM] - screen_rect.size.y;
+ }
+
+ if (screen_rect.position.y < limit[MARGIN_TOP]) {
+ screen_rect.position.y = limit[MARGIN_TOP];
+ }
}
if (offset != Vector2()) {