You are currently viewing “Godot RigidBody2D 완벽 가이드: 2D 물리 시뮬레이션의 모든 것”

“Godot RigidBody2D 완벽 가이드: 2D 물리 시뮬레이션의 모든 것”

2D 물리 시뮬레이션을 완벽하게 구현하는 RigidBody2D 안내서

이 글은 Godot 엔진의 RigidBody2D에 대한 포괄적인 개요를 제공합니다. RigidBody2D는 2D 물리 시뮬레이션에서 힘과 충돌, 회전을 기반으로 동작하는 객체로, 게임 개발자들이 현실적인 물리 기반 환경을 구현할 수 있도록 돕습니다.

글에서는 RigidBody2D의 주요 특징과 속성, 활용 가능한 메서드, 신호 처리 방법, 그리고 이를 활용한 간단한 예제까지 다루며, 물리 시뮬레이션을 효과적으로 제어할 수 있는 방법을 제시합니다. 특히, _integrate_forces()를 활용한 맞춤형 물리 통합과 충돌 감지 설정, 그리고 빠른 움직임의 객체 충돌 문제를 해결하는 팁 등 실용적인 내용을 담고 있습니다.

이 안내서를 통해 RigidBody2D를 활용한 2D 게임 개발의 기초부터 고급 테크닉까지 익히고, 현실감 넘치는 물리 기반 환경을 구현해 보세요!

RigidBody2D 사용하기
RigidBody2D란?
RigidBody2D는 2D 물리 시뮬레이션에 의해 움직이는 물리 객체입니다. PhysicsBody2D를 상속받으며, 물리 엔진이 계산한 힘, 충돌, 회전, 상호작용을 기반으로 동작합니다. RigidBody2D는 직접 제어할 수 없으며, 대신 중력이나 임펄스(Impulse) 같은 물리적 힘을 적용해야 합니다.


특징
RigidBody2D는 모양과 크기를 유지하며, 물리 시뮬레이션으로 움직입니다. 예를 들어, 쓰러질 수 있는 나무나 밀어서 이동시킬 수 있는 상자와 같은 객체를 구현할 때 유용합니다.

다음과 같은 속성을 통해 RigidBody2D의 동작을 조정할 수 있습니다:

  • lock_rotation: 객체가 회전하지 않도록 설정
  • freezefreeze_mode: 특정 상태로 동작 멈춤
  • 질량(mass): 물리 엔진이 객체를 다루는 방식을 결정

주의
2D Transform 또는 linear_velocity를 자주 변경하면 예기치 않은 동작이 발생할 수 있습니다. 이러한 경우 _integrate_forces() 메서드를 사용하여 물리 상태를 직접 제어하는 것이 좋습니다.


RigidBody2D 주요 속성

  • 질량 (mass): 객체의 무게를 나타냅니다. 기본값은 1.0입니다.
  • 선형 속도 (linear_velocity): 초당 픽셀 단위의 이동 속도입니다.
  • 중력 비율 (gravity_scale): 중력의 영향을 곱할 값입니다. 기본값은 1.0입니다.
  • 회전 잠금 (lock_rotation): 객체가 회전하지 않도록 설정합니다.
  • 접촉 모니터 (contact_monitor): 충돌 이벤트를 활성화하려면 true로 설정합니다.

RigidBody2D 주요 메서드

  1. 힘과 임펄스 적용
# 방향성 힘 적용
apply_central_force(Vector2(200, 0))

# 위치 기반 힘 적용
apply_force(Vector2(200, 0), Vector2(50, 50))

# 방향성 임펄스 적용
apply_central_impulse(Vector2(300, 0))

# 위치 기반 임펄스 적용
apply_impulse(Vector2(300, 0), Vector2(50, 50))
  1. _integrate_forces 사용
    물리 시뮬레이션 중 객체 상태를 안전하게 수정하려면 _integrate_forces()를 사용합니다.
extends RigidBody2D

func _integrate_forces(state: PhysicsDirectBodyState2D):
    # 속도 설정
    var desired_velocity = Vector2(100, 0)
    state.linear_velocity = desired_velocity

    # 중력 무시
    state.add_constant_force(Vector2(0, -state.total_gravity))

RigidBody2D를 활용한 간단한 예제

extends RigidBody2D

# 속도 조정 변수
var speed = 200

func _physics_process(delta):
    # 방향 키 입력 받아 힘 추가
    if Input.is_action_pressed("ui_right"):
        apply_central_force(Vector2(speed, 0))
    elif Input.is_action_pressed("ui_left"):
        apply_central_force(Vector2(-speed, 0))
    elif Input.is_action_pressed("ui_up"):
        apply_central_force(Vector2(0, -speed))
    elif Input.is_action_pressed("ui_down"):
        apply_central_force(Vector2(0, speed))

RigidBody2D 신호(Signals)

  • body_entered(body: Node)
    충돌 발생 시 호출됩니다. func _on_body_entered(body): print("충돌한 객체:", body.name)
  • body_exited(body: Node)
    충돌이 종료될 때 호출됩니다. func _on_body_exited(body): print("충돌 종료:", body.name)

RigidBody2D와 충돌 감지
contact_monitor를 true로 설정하고, max_contacts_reported를 적절히 설정해야 충돌 정보를 얻을 수 있습니다.

extends RigidBody2D

func _ready():
    contact_monitor = true
    max_contacts_reported = 10

func _on_body_entered(body):
    print("충돌한 객체:", body)

RigidBody2D 활용 팁

  • 빠른 객체 충돌 감지: continuous_cd 속성을 CCD_MODE_CAST_RAY 또는 CCD_MODE_CAST_SHAPE로 설정하여 충돌 누락 방지.
  • 움직임 제한: lock_rotation을 true로 설정하여 회전 방지.
  • 맞춤 물리 통합: _integrate_forces()로 직접 상태 수정.

이 방법들을 활용하여 강력한 2D 물리 기반 게임을 제작할 수 있습니다!

답글 남기기