C#으로 구현된 Celeste & TowerFall 물리 엔진, 핵심 원리 공개!

by DD
4개월 전
조회수 7

AABB(Axis-Aligned Bounding Box) 기반의 간단한 충돌 감지 시스템을 사용하며, 액터(Actor)와 솔리드(Solid) 클래스로 구성됨

`MoveX()` 및 `MoveY()` 함수를 통해 액터의 이동을 처리하며, 충돌 시 콜백(Collision Callback)을 활용하여 유연성을 확보함

이동하는 솔리드(Solid)의 경우, `Move()` 함수를 통해 액터를 밀거나(Push) 이동시키며, `IsRiding()` 및 `Squish()` 함수를 통해 상호 작용을 정의함

이동하는 솔리드(Solid)와 액터(Actor) 간의 충돌 처리에서 밀어내기(Push)와 운반(Carry)의 우선순위를 정하고, `Squish()` 함수를 통해 압착(Squish) 상황을 처리함

AABB 기반 충돌 감지 시스템

Celeste와 TowerFall의 물리 엔진은 AABB(Axis-Aligned Bounding Box)를 사용하여 충돌을 감지한다. 이는 각 객체의 위치, 너비, 높이를 정수 값으로 표현하여 계산의 효율성을 높인다. 특히, `MoveX()` 및 `MoveY()` 함수를 통해 픽셀 단위로 이동하며, 충돌 시 콜백(Collision Callback)을 호출하여 다양한 상호 작용을 구현한다. 이러한 접근 방식은 단순하면서도 효과적인 충돌 감지 시스템을 구축하는 데 기여한다.

액터(Actor) 이동 처리 및 콜백 활용

액터(Actor)는 자체적인 속도나 가속도, 중력 개념 없이 `MoveX()`와 `MoveY()` 함수를 통해 이동한다. 이 함수들은 이동 거리와 충돌 시 실행될 콜백을 인자로 받는다. 충돌 콜백(Collision Callback)을 통해 액터는 다양한 충돌 반응을 보일 수 있으며, 이는 게임 내에서 다채로운 상호 작용을 가능하게 한다. 이러한 설계는 코드의 유연성을 높이고, 각 액터의 특성에 맞는 동작을 구현하는 데 기여한다.

이동하는 솔리드(Solid)의 구현과 트레이드오프

이동하는 솔리드(Solid)는 `Move()` 함수를 통해 이동하며, 액터와의 상호 작용을 처리한다. 솔리드가 이동할 때, 액터는 밀어내기(Push) 또는 운반(Carry)될 수 있다. 밀어내기(Push)는 충돌을 방지하기 위해 액터를 솔리드의 가장자리에 밀착시키며, 운반(Carry)은 솔리드의 움직임에 따라 액터를 함께 이동시킨다. 이러한 방식은 복잡한 물리 연산을 단순화하지만, 충돌 처리 로직(Collision Handling Logic)의 정확성이 중요해진다.

밀어내기(Push)와 운반(Carry)의 우선순위

이동하는 솔리드(Solid)와 액터(Actor) 간의 상호 작용에서 밀어내기(Push)가 운반(Carry)보다 우선시된다. 솔리드가 액터를 밀어낼 경우, 액터는 솔리드의 가장자리에 맞춰 이동하며, `Squish()` 함수를 통해 압착(Squish) 상황을 처리한다. 압착(Squish) 상황은 액터가 두 솔리드 사이에 끼이는 경우 발생하며, 기본적으로 액터를 파괴하는 방식으로 처리된다. 이러한 우선순위 설정은 충돌 처리의 일관성을 유지하고, 게임 내 물리 법칙을 구현하는 데 기여한다.

Celeste & TowerFall Physics