Phaser 3 물리 엔진이란?
Phaser 3는 웹 게임 개발을 위한 가장 인기 있는 자바스크립트 프레임워크로, 두 가지 강력한 물리 엔진을 기본으로 제공합니다. 바로 Arcade Physics와 Matter.js입니다. 이 중 Arcade는 간단하고 빠른 2D 게임에 최적화되어 있으며, 대부분의 인디 개발자들이 선택하는 엔진입니다.
2D 게임에서 리얼한 움직임과 상호작용을 표현하려면 물리 엔진의 이해가 필수입니다. 캐릭터가 떨어지고, 벽에 부딪히고, 아이템을 집는 모든 동작이 물리 엔진을 통해 구현되기 때문입니다.
Phaser 3 Arcade 물리 엔진의 핵심 개념
1. 물리 바디(Physics Body) 생성
Phaser 3에서 게임 객체에 물리를 적용하려면 반드시 물리 바디를 추가해야 합니다. 이는 게임 월드에서 충돌 감지와 움직임을 담당하는 가상의 형태입니다.
const player = this.physics.add.sprite(100, 100, 'player');
player.setBounce(0.2); // 튕김 효과
player.setCollideWorldBounds(true); // 화면 경계와 충돌
2. 중력(Gravity) 설정
중력은 모든 물리 객체에 영향을 주는 글로벌 힘입니다. 기본값은 약 300 픽셀/초²이며, 필요에 따라 조정할 수 있습니다.
this.physics.world.gravity.y = 300;
// 특정 객체만 중력 무시
player.setGravityY(-0.5); // 음수 값으로 역중력 표현
3. 충돌 감지(Collision Detection)
Phaser 3의 충돌 시스템은 매우 효율적으로 설계되었습니다. 매 프레임마다 모든 물리 바디를 검사하며, 겹치는 영역이 발생하면 콜백 함수를 실행합니다.
this.physics.add.collider(player, platforms);
this.physics.add.overlap(player, coins, collectCoin, null, this);
collider는 실제 충돌로 객체를 밀어내고, overlap은 겹침을 감지하기만 합니다.
2026년 Phaser 3 물리 엔진 실전 활용법
속도 및 가속도 제어
게임의 반응성을 결정하는 가장 중요한 요소는 속도(velocity) 설정입니다. Phaser 3에서는 다음과 같이 직관적으로 제어합니다.
player.setVelocity(0, 0); // 정지
player.setVelocityX(150); // 오른쪽으로 이동
player.setAccelerationX(500); // 가속도 적용
점프 메커닉 구현
플랫포머 게임의 핵심인 점프 기능을 구현하려면 지면 감지가 필수입니다.
const isGrounded = player.body.touching.down;
if (isGrounded && Phaser.Input.Keyboard.JustDown(spaceKey)) {
player.setVelocityY(-300); // 음수 값으로 위로 이동
}
마찰력(Friction) 및 탄성(Bounce) 설정
게임의 느낌을 결정하는 세부 파라미터들입니다.
player.setFriction(0.1, 0.1);
player.setBounce(0.2); // 0~1 범위, 클수록 튕김
player.setDrag(0.95); // 공기 저항
| 물리 속성 | 범위 | 설명 | 권장값 |
|---|---|---|---|
| gravity | 0~500+ | 중력 강도 | 300 |
| bounce | 0~1 | 탄성 (1=완전 탄성) | 0.2~0.5 |
| friction | 0~1 | 마찰력 | 0.1~0.5 |
| drag | 0~1 | 공기 저항 | 0.9~0.99 |
| velocity | -∞~∞ | 현재 속도 (픽셀/프레임) | 게임별 다름 |
실전 프로젝트: 간단한 플랫포머 게임
class GameScene extends Phaser.Scene {
create() {
// 배경 및 플랫폼 생성
this.platforms = this.physics.add.staticGroup();
this.platforms.create(400, 568, 'ground');
this.platforms.create(600, 400, 'ground');
this.platforms.create(50, 250, 'ground');
// 플레이어 생성
this.player = this.physics.add.sprite(100, 450, 'player');
this.player.setBounce(0.2);
this.player.setCollideWorldBounds(true);
// 코인 생성 및 충돌 설정
this.coins = this.physics.add.group();
this.coins.create(600, 350, 'coin');
this.coins.create(400, 300, 'coin');
// 충돌 감지
this.physics.add.collider(this.player, this.platforms);
this.physics.add.overlap(this.player, this.coins, this.collectCoin, null, this);
// 입력 설정
this.cursors = this.input.keyboard.createCursorKeys();
}
update() {
if (this.cursors.left.isDown) {
this.player.setVelocityX(-160);
} else if (this.cursors.right.isDown) {
this.player.setVelocityX(160);
} else {
this.player.setVelocityX(0);
}
// 점프
if (this.cursors.space.isDown && this.player.body.touching.down) {
this.player.setVelocityY(-330);
}
}
collectCoin(player, coin) {
coin.disableBody(true, true);
// 점수 추가 로직
}
}
Arcade vs Matter.js: 언제 어느 것을 쓸까?
Arcade Physics를 선택하세요:
- 간단한 2D 게임, 플랫포머, 슈팅 게임
- 모바일 기기에서 실행해야 할 때
- 빠른 프로토타이핑이 필요할 때
Matter.js를 선택하세요:
- 복잡한 물리 시뮬레이션이 필요할 때
- 다각형 모양의 정확한 충돌 감지가 필요할 때
- 차량, 로봇 같은 복잡한 메커닉
2026년 성능 최적화 팁
더 자세한 내용은 웹게임 성능 최적화 완벽 가이드 2026: 프레임율 60fps 달성 기법을 참고하세요.
1. 물리 계산 범위 제한
this.physics.world.setBounds(0, 0, 800, 600);
// 또는 특정 그룹만 경계 설정
this.enemies.setCollideWorldBounds(true);
2. Sleeping 활성화
움직이지 않는 객체를 자동으로 물리 계산에서 제외합니다.
player.body.setActive(false); // 수동으로 비활성화
3. 충돌 그룹 활용
불필요한 충돌 검사를 줄여 성능을 개선합니다.
const PLAYER = 1;
const ENEMY = 2;
const ITEM = 3;
player.setCollisionCategory(PLAYER);
player.setCollidesWith([ENEMY, ITEM]);
2026년 Phaser 3 커뮤니티 현황
Phaser 3는 GitHub에서 약 37,000개의 스타를 받았으며, 매월 활발한 업데이트를 진행 중입니다. 공식 문서는 한국어 번역본도 부분적으로 제공되고 있습니다.
더 자세한 수익화 전략은 2026년 웹 게임 수익화 전략 완벽 가이드: 5가지 실전 모델을 참고하세요.
자주 하는 실수와 해결법
1. 물리 바디 없이 움직임 설정 시도
- 반드시
physics.add.sprite()또는.enableBody()사용
2. 프레임 단위 위치 변경
setPosition()대신setVelocity()또는setAcceleration()사용
3. 중력이 모든 객체에 적용되는 줄 알기
- 필요시
setGravityY(-1)로 특정 객체만 중력 무시 가능
4. 매 프레임마다 수동 충돌 검사
physics.add.collider()또는overlap()사용으로 자동화
참고 자료
자주 묻는 질문
Phaser 3의 Arcade 물리 엔진은 모바일에서도 잘 작동하나요?
네, Arcade는 모바일 최적화가 잘 되어 있습니다. Matter.js보다 계산 부하가 적어서 저사양 기기에서도 60fps를 유지할 가능성이 높습니다. 다만 충돌 객체 수가 100개를 초과하면 성능 테스트를 권장합니다.
점프 중에 공중에서 방향 변경이 안 돼요. 어떻게 해결하나요?
플레이어의 setVelocityX()를 update()에서 매 프레임 호출해야 합니다. isGrounded 조건 없이 입력 처리를 하되, 점프는 지면에서만 하도록 제한하세요. 이를 통해 공중에서도 자유롭게 방향을 바꿀 수 있습니다.
충돌 판정이 부정확한 것 같습니다. 원형과 사각형 충돌이 섞여 있으면 어떻게 하나요?
Arcade는 기본적으로 AABB(축 정렬 경계 상자) 충돌을 사용합니다. 더 정확한 원형 충돌은 setCircle() 메서드로 조정할 수 있으며, 복잡한 모양은 Matter.js 사용을 권장합니다.
댓글