크레센도 Phaser + TypeScript TIL 2
하민이 때리자 보스가 맵 밖으로 날아가 돌아오지 않았다
보스를 치면 잡몹처럼 밀린다. 그런데 여러 번 치니 보스가 맵 경계 밖으로 나가 돌아오지 않았다. 잡몹은 경계에서 멈추는데 보스만 그랬다.
보스는 하민이 통과하지 못하는 단단한 몸으로 만들려고 Arcade 물리(Phaser의 기본 물리 엔진)에서 immovable(충돌로 밀리지 않는 몸)로 설정해 뒀다. immovable은 다른 몸과 부딪혀도 밀리지 않는다는 뜻이지 움직이지 않는다는 뜻이 아니다. 속도를 주면 움직인다. 넉백은 속도로 주니 보스도 밀린다. 문제는 맵 경계에서 멈추는 처리가 immovable 몸에는 작동하지 않는다는 것이다. 그래서 밀린 채로 경계를 넘어갔다.
원하는 동작은 “맞으면 밀리되 맵 밖으로는 안 나간다”였다. 밀림을 없애는 게 아니라 경계에서 멈추게 하는 쪽으로 정했고, 보스만 매 프레임 위치를 경계 안으로 되돌리는 처리를 따로 넣었다.
무언가 날아가서 안 돌아오는 버그는 대개 경계 처리가 빠진 것이다. 점프·넉백·밀림처럼 “어디론가 가는” 동작에는 어디서 멈추는지가 같이 있어야 한다.
보스는 통과 못 하고 잡몹은 통과한다
하민이 보스와 겹치는 것도 어색했다. 보스는 몸으로 막고, 잡몹은 지금처럼 겹쳐 지나갈 수 있어야 한다.
Phaser 충돌은 두 종류다. overlap은 겹침만 감지하고 통과시킨다(타격 판정에 쓴다). collider는 서로 밀어내 통과하지 못하게 한다. 보스에게만 하민과의 collider를 걸고 잡몹에는 걸지 않았다. 여기에 위의 immovable이 합쳐져야 “하민이 밀어도 보스는 안 밀리고, 하민이 보스를 뚫고 가지도 못하는” 몸이 된다. 둘은 별개 설정이다.
UE5는 오브젝트가 선언하고, Phaser는 바깥에서 짝을 짓는다
보스에만 collider를 건다는 설명을 듣고 UE5와 뭐가 다르냐고 물었다. UE5로 만들 때는 충돌을 오브젝트마다 채널로 설정했지 둘씩 짝지어 준 기억이 없어서다. 그래서 둘을 나란히 놓고 비교했다.
UE5에서 충돌은 오브젝트가 스스로 선언한다. “나는 Pawn 채널에 Overlap으로 반응한다”고 각자 설정하면, 새 오브젝트를 넣어도 채널만 맞으면 알아서 반응한다.
Phaser는 반대다. “하민과 보스는 부딪히면 막힌다”처럼 바깥에서 둘을 짝지어 등록한다. 새 오브젝트가 생기면 그 관계를 하나씩 추가해야 한다.
| 구분 | 누가 선언하나 | 새 오브젝트 추가 시 |
|---|---|---|
| UE5 | 오브젝트 자신(채널 설정) | 채널만 맞으면 자동 반응 |
| Phaser | 외부에서 쌍으로 연결 | 관계를 직접 추가 |
개념은 같다. UE5의 Block이 Phaser의 collider, Overlap이 overlap, Ignore는 아무것도 안 거는 것이다. 표현 방식만 다르다. 엔진을 옮길 때는 개념이 같은지부터 확인하고, 그 다음에 “누가 선언하는가”를 본다. 그 차이가 새 오브젝트를 추가할 때의 작업량을 결정한다.
아레나 가까이 가기만 해도 장판이 깔렸다
보스 아레나에 들어가면 잠금 컷신(왼쪽이 잠기고 카메라가 보스로 이동)이 돌고 보스전이 시작된다. 그런데 컷신 전, 아레나 근처까지만 가도 바닥 장판이 깔렸다. 보스 패턴이 “하민과의 거리”로 켜지고 있어서, 아레나 밖이라도 거리만 가까우면 발동했다.
거리는 “아레나에 들어왔는가”를 보장하지 못한다. 패턴을 켜는 기준을 거리에서 사건(아레나 진입 컷신이 끝난 순간)으로 바꿨다.
“언제 켜는가”는 수치가 아니라 게임 사건으로 정한다. 거리·시간 같은 수치는 사건의 근사치일 뿐이라 경계에서 어긋난다. 보스전 시작이라는 사건이 있으면 그걸 그대로 기준으로 쓴다.
공격하면서 걸으니 적을 지나쳐 버렸다
공격 버튼을 누른 채 이동하니 스케이트를 타듯 미끄러지면서 공격 범위를 지나쳐 유효타가 안 들어갔다. 플레이하다 발견했다.
공격 모션이 재생되는 동안은 수평 이동을 막았다. 제자리에서 휘두르는 느낌이 되고, 공격 방향도 누른 순간에 고정된다. 격투 게임에서 말하는 확정 공격(commit — 한 번 시작한 공격은 끝까지 간다)이다.
이동을 막는 건 조작감을 무겁게 만드는 결정이라 망설였다. 하지만 “타격이 들어간다”가 “움직일 수 있다”보다 먼저다. 얼마나 오래 막을지는 뒤에 따로 다듬었다.
도망가는 잡몹이 보스를 가로질러 달렸다
보스전이 시작되면 남은 잡몹은 아레나 밖으로 도망가게 했다. 그런데 일부가 오른쪽, 즉 보스 쪽으로 달려가 보스를 가로질렀다.
하민이 왼쪽에서 오니 부딪힌 잡몹은 오른쪽으로 튕기고, 도망 방향을 “하민 반대쪽”으로 잡으니 그대로 보스 쪽이 됐다. 보스와 아레나는 항상 오른쪽에 있으므로 도망은 항상 왼쪽으로 고정했다.
“반대쪽으로”는 그럴듯하지만 맵 구조를 모르는 규칙이다. 맵이 한 방향으로 진행하는 게임이면 도망 방향도 맵 기준으로 정한다.