Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
문제 해결
물리 엔진으로 작업할 때 예상치 못한 결과가 발생할 수 있습니다.
이러한 문제 중 상당수는 구성을 통해 해결될 수 있지만 일부는 엔진 버그로 인해 발생합니다. 물리 엔진과 관련된 알려진 문제는 `GitHub <https://github.com/godotengine/godot/issues?q=is%3Aopen+is%3Aissue+label%3Atopic%3Aphysics>`__의 공개 물리학 관련 문제를 참조하세요. `폐쇄된 문제 <https://github.com/godotengine/godot/issues?q=+is%3Aclosed+is%3Aissue+label%3Atopic%3Aphysics>`__을 살펴보는 것도 물리 엔진 동작과 관련된 질문에 답하는 데 도움이 될 수 있습니다.
물체가 빠른 속도로 서로를 통과하고 있습니다.
This is known as tunneling. Enabling Continuous CD (Continuous Collision Detection) in the RigidBody properties can sometimes resolve this issue. If this does not help, there are other solutions you can try:
정적 충돌 모양을 더 두껍게 만듭니다. 예를 들어 플레이어가 어떤 방식으로든 아래로 접근할 수 없는 얇은 바닥이 있는 경우 충돌체를 바닥의 시각적 표현보다 더 두껍게 만들 수 있습니다.
이동 속도에 따라 빠르게 움직이는 물체의 충돌 모양을 수정합니다. 물체가 더 빠르게 움직일수록 충돌 모양이 물체 외부로 확장되어 얇은 벽과 더 안정적으로 충돌할 수 있습니다.
고급 프로젝트 설정에서 Physics Ticks per Second<class_ProjectSettings_property_physics/common/physics_ticks_per_second>`를 늘립니다. 여기에는 다른 이점(예: 더욱 안정적인 시뮬레이션 및 입력 지연 감소)이 있지만 CPU 사용률이 증가하므로 모바일/웹 플랫폼에서는 실행 가능하지 않을 수 있습니다. 대부분의 디스플레이에서 원활한 표시를 위해서는 ``60` 기본값의 승수(예:
120,180또는240)를 사용하는 것이 좋습니다.
쌓인 물체는 불안정하고 흔들립니다.
단순한 문제처럼 보이지만, 적층된 객체를 사용한 안정적인 RigidBody 시뮬레이션은 물리 엔진에서 구현하기 어렵습니다. 이는 서로 반대되는 세력이 통합되어 발생합니다. 물체가 많이 쌓일수록 서로 대항하는 힘이 더 강해집니다. 이로 인해 결국 시뮬레이션이 흔들리게 되어 객체가 움직이지 않고는 서로 겹쳐질 수 없게 됩니다.
물리 시뮬레이션 속도를 높이면 이 문제를 완화하는 데 도움이 될 수 있습니다. 그렇게 하려면 고급 프로젝트 설정에서 Physics Ticks per Second<class_ProjectSettings_property_physics/common/physics_ticks_per_second>`를 늘리십시오. CPU 사용률이 증가하며 모바일/웹 플랫폼에서는 실행 가능하지 않을 수 있습니다. 대부분의 디스플레이에서 원활한 표시를 위해서는 ``60` 기본값의 승수(예: 120, 180 또는 240)를 사용하는 것이 좋습니다.
3D에서는 물리 엔진을 기본 GodotPhysics에서 Jolt로 전환하면 안정성이 향상될 수도 있습니다. 자세한 내용은 :ref:`doc_using_jolt_physics`를 참조하세요.
크기가 조정된 물리 몸체 또는 충돌 모양이 올바르게 충돌하지 않습니다.
Godot는 현재 물리 몸체나 충돌 모양의 크기 조정을 지원하지 않습니다. 해결 방법으로 크기를 변경하는 대신 충돌 모양의 범위를 변경하십시오. 시각적 표현의 크기도 변경하려면 기본 시각적 표현(Sprite2D, MeshInstance3D, ...)의 크기를 변경하고 충돌 모양의 범위를 별도로 변경하세요. 이 경우 충돌 모양이 시각적 표현의 하위가 아닌지 확인하세요.
Since resources are shared by default, you'll have to make the collision shape resource unique if you don't want the change to be applied to all nodes using the same collision shape resource in the scene. This can be done in two ways:
In the editor, by clicking in the CollisionShape resource dropdown in the inspector, then changing its size.
In a script, by calling
duplicate()in a script on the collision shape resource before changing its size.
얇은 물체가 바닥에 놓여 있을 때 흔들립니다.
적 씬은 다음 노드들을 사용할 것입니다:
바닥의 충돌 모양이 너무 얇습니다.
RigidBody의 충돌 모양이 너무 얇습니다.
첫 번째 경우에는 바닥의 충돌 모양을 더 두껍게 만들어 이 문제를 완화할 수 있습니다. 예를 들어 플레이어가 어떤 방식으로든 아래로 접근할 수 없는 얇은 바닥이 있는 경우 충돌체를 바닥의 시각적 표현보다 더 두껍게 만들 수 있습니다.
두 번째 경우에는 일반적으로 물리 시뮬레이션 속도를 높여서만 문제를 해결할 수 있습니다(모양을 더 두껍게 만들면 RigidBody의 시각적 표현과 충돌 사이의 연결이 끊어지기 때문입니다).
두 경우 모두 물리 시뮬레이션 속도를 높이면 이 문제를 완화하는 데 도움이 될 수 있습니다. 그렇게 하려면 고급 프로젝트 설정에서 Physics Ticks per Second<class_ProjectSettings_property_physics/common/physics_ticks_per_second>`를 늘리십시오. 이는 CPU 사용률을 증가시키며 모바일/웹 플랫폼에서는 실행 가능하지 않을 수 있습니다. 대부분의 디스플레이에서 원활한 표시를 위해서는 ``60` 기본값의 승수(예: 120, 180 또는 240)를 사용하는 것이 좋습니다.
콜리전 모양 조정
물리 엔진을 기본 GodotPhysics에서 Jolt로 전환하면 실린더 충돌 모양이 더욱 안정적으로 만들어집니다. 자세한 내용은 :ref:`doc_using_jolt_physics`를 참조하세요.
Godot 4에서 Bullet에서 GodotPhysics로 전환하는 동안 실린더 충돌 모양을 처음부터 다시 구현해야 했습니다. 그러나 실린더 충돌 모양은 지원하기 가장 어려운 모양 중 하나이므로 다른 많은 물리 엔진에서는 이에 대한 지원을 제공하지 않습니다. 현재 실린더 충돌 모양에는 몇 가지 알려진 버그가 있습니다.
GodotPhysics를 고수하고 있다면 지금은 캐릭터에 상자 또는 캡슐 충돌 모양을 사용하는 것이 좋습니다. 상자는 일반적으로 최고의 신뢰성을 제공하지만 캐릭터가 대각선으로 더 많은 공간을 차지하게 된다는 단점이 있습니다. 캡슐 충돌 모양에는 이러한 단점이 없지만 모양이 정밀한 플랫폼을 더욱 어렵게 만들 수 있습니다.
VehicleBody 시뮬레이션은 특히 고속에서 불안정합니다.
물리 몸체가 고속으로 움직일 때, 각 물리 단계 사이에서 큰 거리를 이동합니다. 예를 들어 3D에서 1단위 = 1미터 규칙을 사용하는 경우 360km/h로 이동하는 차량은 초당 100단위를 이동합니다. 기본 물리 시뮬레이션 속도가 60Hz인 경우 차량은 물리 틱마다 ~1.67 단위만큼 이동합니다. 이는 터널링으로 인해 차량이 작은 물체를 완전히 무시할 수 있지만 일반적으로 그렇게 빠른 속도에서는 시뮬레이션에 사용할 데이터가 거의 없음을 의미합니다.
빠르게 움직이는 차량은 증가된 물리 시뮬레이션 속도로 인해 많은 이점을 얻을 수 있습니다. 그렇게 하려면 고급 프로젝트 설정에서 Physics Ticks per Second<class_ProjectSettings_property_physics/common/physics_ticks_per_second>`를 늘리십시오. 이는 CPU 사용률을 증가시키며 모바일/웹 플랫폼에서는 실행 가능하지 않을 수 있습니다. 대부분의 디스플레이에서 원활한 표시를 위해서는 ``60` 기본값의 승수(예: 120, 180 또는 240)를 사용하는 것이 좋습니다.
물체가 타일을 가로질러 이동할 때 충돌로 인해 범프가 발생합니다.
이는 해당 가장자리가 다른 모양에 의해 덮여 있더라도 모양의 가장자리에 객체가 부딪혀 발생하는 물리 엔진의 알려진 문제입니다. 이는 2D와 3D 모두에서 발생할 수 있습니다.
이 문제를 해결하는 가장 좋은 방법은 "복합" 충돌기를 만드는 것입니다. 이는 개별 타일에 충돌이 발생하는 대신 타일 그룹의 충돌을 나타내는 단일 충돌 모양을 생성한다는 의미입니다. 일반적으로 복합 충돌기를 섬별로 분할해야 합니다(즉, 접촉 타일의 각 그룹이 자체 충돌기를 가짐을 의미).
복합 충돌기를 사용하면 특정 경우에 물리 시뮬레이션 성능을 향상시킬 수도 있습니다. 그러나 복합 충돌 형태는 훨씬 더 복잡하기 때문에 이것이 모든 경우에 있어서 순 성능 승리가 아닐 수도 있습니다.
팁
Godot 4.5 이상에서는 TileMapLayer 노드를 사용할 때 복합 충돌기 생성이 자동으로 수행됩니다. 청크 크기(기본적으로 각 축의 16 타일)는 TileMapLayer 인스펙터의 Physics Quadrant Size 속성을 사용하여 설정할 수 있습니다. 값이 클수록 TileMap이 변경될 때 업데이트 속도가 느려지는 대신 보다 안정적인 충돌을 제공합니다.
개체가 다른 개체에 닿으면 프레임 속도가 떨어집니다.
이는 너무 복잡한 충돌 모양을 사용하는 객체 중 하나 때문일 가능성이 높습니다. 볼록 충돌 모양은 성능상의 이유로 가능한 한 적은 수의 모양을 사용해야 합니다. Godot의 자동 생성에 의존할 때, 단일 볼록 모양 충돌 리소스에 대해 수백 개는 아니더라도 수십 개의 모양이 생성될 가능성이 있습니다.
어떤 경우에는 볼록 충돌기를 몇 가지 기본 충돌 모양(상자, 구 또는 캡슐)으로 대체하면 더 나은 성능을 제공할 수 있습니다.
이 문제는 매우 상세한 트리메시(오목) 충돌을 사용하는 StaticBodies에서도 발생할 수 있습니다. 이 경우 레벨 지오메트리의 단순화된 표현을 충돌기로 사용합니다. 이는 물리 시뮬레이션 성능을 크게 향상시킬 뿐만 아니라 충돌로 간주되는 작은 고정 장치와 틈을 제거하여 안정성도 향상시킬 수 있습니다.
3D에서는 물리 엔진을 기본 GodotPhysics에서 Jolt로 전환하면 성능이 향상될 수도 있습니다. 자세한 내용은 :ref:`doc_using_jolt_physics`를 참조하세요.
프레임 속도가 특정 양의 물리 시뮬레이션을 넘어서 갑자기 매우 낮은 값으로 떨어집니다.
이는 물리 엔진이 예상되는 시뮬레이션 속도를 따라잡을 수 없기 때문에 발생합니다. 이 경우 프레임 속도가 떨어지기 시작하지만 엔진은 렌더링된 프레임당 특정 물리 단계 수만 시뮬레이션하도록 허용됩니다. 이는 매우 낮은 프레임 속도(일반적으로 1-2FPS)에 도달할 때까지 프레임 속도가 계속 떨어지는 상황으로 눈덩이처럼 불어나며 *물리적 죽음의 나선*이라고 불립니다.
이를 방지하려면 동시에 과도한 수의 물리 시뮬레이션이 발생할 수 있는(또는 지나치게 복잡한 충돌 모양이 있는) 프로젝트의 상황을 확인해야 합니다. 이러한 상황을 피할 수 없는 경우 프레임당 최대 물리 단계 프로젝트 설정을 늘리거나 **초당 물리 틱**을 줄여 이 문제를 완화할 수 있습니다.
물리 시뮬레이션은 세계 원점에서 멀리 떨어져 있으면 신뢰할 수 없습니다.
이는 부동 소수점 정밀도 오류로 인해 발생하며, 물리 시뮬레이션이 세계 원점에서 더 멀리 떨어져 발생할수록 더욱 두드러집니다. 이 문제는 렌더링에도 영향을 미쳐 세계 원점에서 멀리 떨어져 있을 때 카메라가 흔들리는 결과를 낳습니다. 자세한 내용은 :ref:`doc_large_world_coordinates`를 참조하세요.