CharacterBody2D/3D 사용하기
Godot CharacterBody2D/3D 가이드 소개
게임 개발에서 캐릭터의 움직임과 충돌 처리 방식은 게임의 플레이 감각을 결정짓는 중요한 요소입니다. Godot 엔진의 CharacterBody2D/3D는 높은 수준의 제어를 통해 이런 움직임을 세밀하게 구현할 수 있는 강력한 도구입니다.
이 가이드는 CharacterBody2D를 중심으로, 캐릭터 이동 및 충돌 처리의 기본 개념부터 실전 예제까지 폭넓게 다룹니다. move_and_collide()
와 move_and_slide()
라는 두 가지 주요 이동 메서드의 차이점과 사용 사례를 살펴보고, 다양한 게임 장르에 맞는 구현 방법을 제시합니다. 또한, 플랫폼 게임, 벽 충돌, 총알 반사 등 실질적인 예제를 통해 캐릭터의 움직임을 효과적으로 설계하는 방법을 배울 수 있습니다.
이 가이드를 통해 배울 수 있는 것들:
- CharacterBody2D의 개념과 동작 원리
move_and_collide()
와move_and_slide()
의 활용법- 충돌 데이터 활용 및 반응 구현
- 플랫폼 게임과 같은 실전 응용 사례
초보 개발자는 물론 숙련된 개발자도 이 가이드를 통해 Godot의 캐릭터 물리 시스템을 더욱 깊이 이해하고, 보다 직관적이면서도 효율적인 게임 개발을 진행할 수 있습니다.
여러분의 캐릭터가 단순한 오브젝트에서 생동감 있는 주인공으로 거듭나는 여정을 시작해 보세요!
개요
Godot는 충돌 감지 및 응답을 제공하는 여러 충돌 객체를 지원합니다. 이 중 어떤 것을 사용할지 결정하는 것은 혼란스러울 수 있습니다. 그러나 각각의 작동 방식과 장단점을 이해하면 문제를 줄이고 개발을 간소화할 수 있습니다. 이 튜토리얼에서는 CharacterBody2D 노드에 대해 알아보고, 이를 활용하는 방법을 예제로 살펴보겠습니다.
💡 참고:
이 문서는 주로 CharacterBody2D를 예로 들지만, 동일한 개념이 3D에서도 적용됩니다.
CharacterBody란 무엇인가?
CharacterBody2D는 코드로 제어되는 물체를 구현하는 데 사용됩니다. 이 물체는 이동 시 다른 물체와의 충돌을 감지하지만, 중력이나 마찰 같은 엔진 물리 속성의 영향을 받지 않습니다. 이는 사용자가 동작을 코드로 구현해야 함을 의미하지만, 반대로 더 정밀하게 움직임과 반응을 제어할 수 있다는 장점이 있습니다.
📌 전제 조건:
이 문서는 Godot의 다양한 물리적 바디에 대해 기본적인 이해가 있다고 가정합니다. 먼저 물리 소개를 읽어보는 것을 권장합니다.
📝 팁:
CharacterBody2D는 중력이나 기타 힘의 영향을 받을 수 있지만, 이러한 움직임은 반드시 코드로 계산해야 합니다. 물리 엔진이 CharacterBody2D를 직접 움직이지는 않습니다.
이동과 충돌
CharacterBody2D를 움직일 때는 position
속성을 직접 설정해서는 안 됩니다. 대신, move_and_collide()
또는 move_and_slide()
메서드를 사용해야 합니다. 이 메서드는 주어진 벡터를 따라 물체를 이동시키고 충돌을 감지합니다.
⚠️ 경고:
물리적 바디의 이동 처리는_physics_process()
콜백 안에서 수행해야 합니다.
이동 메서드 종류
move_and_collide()
이 메서드는 물체의 상대 이동을 나타내는 Vector2를 필수 매개변수로 받습니다. 일반적으로 이는 속도 벡터(velocity)에 프레임 시간(delta)을 곱한 값입니다.
만약 이동 경로에서 충돌이 감지되면 물체는 즉시 멈추고, 메서드는 KinematicCollision2D 객체를 반환합니다.
KinematicCollision2D 객체에는 충돌 데이터 및 충돌한 객체에 대한 정보가 포함됩니다. 이 데이터를 활용하여 충돌 후의 반응을 계산할 수 있습니다.
주요 사용 사례:move_and_collide()
는 물체를 이동시키고 충돌을 감지하지만 자동 반응이 필요하지 않을 때 유용합니다. 예를 들어, 벽에 부딪힌 총알이 튕겨야 하는 경우, 충돌을 감지한 후 속도의 각도를 직접 변경하면 됩니다.
move_and_slide()
이 메서드는 충돌 후 물체가 다른 물체를 따라 미끄러지게 만드는 응답을 단순화합니다. 주로 플랫폼 게임이나 탑다운 게임에서 유용합니다.
다음 속성들을 사용해 슬라이드 동작을 제어할 수 있습니다.
속성 | 기본값 | 설명 |
---|---|---|
velocity | Vector2(0, 0) | 물체의 초당 픽셀 단위 속도 벡터. 충돌 시 move_and_slide()가 자동으로 수정합니다. |
motion_mode | MOTION_MODE_GROUNDED | 바닥이나 벽 구분을 위한 동작 모드. |
up_direction | Vector2(0, -1) | 바닥으로 간주할 표면 방향. |
floor_stop_on_slope | true | 정지 시 경사면에서 미끄러짐 방지. |
wall_min_slide_angle | 15도 (0.261799 라디안) | 경사면 최소 각도. |
floor_max_angle | 45도 (0.785398 라디안) | 경사면 최대 각도. |
충돌 감지
move_and_collide()
충돌이 발생하면 KinematicCollision2D 객체를 반환하며, 이를 통해 충돌 데이터를 얻을 수 있습니다.var collision = move_and_collide(velocity * delta) if collision: print("충돌한 객체: ", collision.get_collider().name)
move_and_slide()
이 메서드는 한 프레임에서 여러 번의 충돌이 발생할 수 있습니다. 이 경우, 충돌 횟수와 데이터를 반복적으로 처리할 수 있습니다.move_and_slide() for i in get_slide_collision_count(): var collision = get_slide_collision(i) print("충돌한 객체: ", collision.get_collider().name)
사용 사례에 따른 메서드 선택
move_and_slide()
는 간단한 슬라이딩 반응이 필요할 때 편리합니다.move_and_collide()
는 보다 세밀한 충돌 반응이 필요한 경우 적합합니다.
예제: 플랫폼 게임
다음은 간단한 2D 플랫폼 게임 캐릭터 이동 코드를 보여줍니다.
extends CharacterBody2D
var speed = 300.0
var jump_speed = -400.0
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
func _physics_process(delta):
velocity.y += gravity * delta
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = jump_speed
var direction = Input.get_axis("ui_left", "ui_right")
velocity.x = direction * speed
move_and_slide()
이 코드는 캐릭터가 중력의 영향을 받아 떨어지고, 바닥에 있을 때만 점프할 수 있도록 구현되었습니다.
결론
CharacterBody2D는 높은 수준의 제어가 필요한 게임에서 강력한 도구입니다. move_and_collide()
와 move_and_slide()
는 각각의 특성에 따라 선택적으로 사용할 수 있으며, 게임 유형에 따라 적합한 메서드를 활용하는 것이 중요합니다.
자세한 정보는 공식 문서를 참고하세요.