이 글은 Today I Learn 시리즈의 43번째 기록입니다. (총 213개)

하민이 때리자 보스가 맵 밖으로 날아가 돌아오지 않았다

보스를 치면 잡몹처럼 밀린다. 그런데 여러 번 치니 보스가 맵 경계 밖으로 나가 돌아오지 않았다. 잡몹은 경계에서 멈추는데 보스만 그랬다.

보스는 하민이 통과하지 못하는 단단한 몸으로 만들려고 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 — 한 번 시작한 공격은 끝까지 간다)이다.

이동을 막는 건 조작감을 무겁게 만드는 결정이라 망설였다. 하지만 “타격이 들어간다”가 “움직일 수 있다”보다 먼저다. 얼마나 오래 막을지는 뒤에 따로 다듬었다.


도망가는 잡몹이 보스를 가로질러 달렸다

보스전이 시작되면 남은 잡몹은 아레나 밖으로 도망가게 했다. 그런데 일부가 오른쪽, 즉 보스 쪽으로 달려가 보스를 가로질렀다.

하민이 왼쪽에서 오니 부딪힌 잡몹은 오른쪽으로 튕기고, 도망 방향을 “하민 반대쪽”으로 잡으니 그대로 보스 쪽이 됐다. 보스와 아레나는 항상 오른쪽에 있으므로 도망은 항상 왼쪽으로 고정했다.

“반대쪽으로”는 그럴듯하지만 맵 구조를 모르는 규칙이다. 맵이 한 방향으로 진행하는 게임이면 도망 방향도 맵 기준으로 정한다.


Series: Today I Learn

1 C++ 자료형(Data Type) 2 MD5 vs pHash 3 C++에서 함수의 선언과 정의 4 Tkinter padx, pady 5 메모리와 포인터 변수 6 Call by Value, Call by Reference, Call by Pointer 비교 7 const 8 Gemfile — Jekyll 프로젝트의 의존성 파일 9 kramdown-parser-gfm — Jekyll의 GFM 파서 10 파서(Parser) 11 AHU vs OHU 12 I might try it vs I'll try it 뉘앙스 차이 13 SESSION_EXPIRE_AT_BROWSER_CLOSE=True 14 configuration key 15 Git stash vs discard 16 subprocess.Popen으로 Windows 탐색기에 명령어를 전달 17 Post 잔디 분석하기 18 Google Sheets Sync 최적화 19 DSL (Domain Specific Language)과 GPL (General Purpose Language) 20 마크다운 표 그리는 방법 21 쿼리 파라미터(Query Parameter). 기존 QR코드 재활용 22 Django 보안 취약점 점검 및 수정 23 OOP Object-Oriented Programming 객체 지향 프로그래밍 24 Fernet 대칭 암호화 25 Jekyll 코드블록 안의 Liquid 태그 26 습관만들기 Pawbit TIL 1 27 insertOnConflictUpdate vs DoUpdate(target) 28 세션 필터 29 아코디언(Accordiaon) UI를 펼친상태로 만들기 30 input의 step 31 습관만들기 Pawbit TIL 2 32 습관만들기 Pawbit TIL 3 33 Word Cloud 34 Google Sheets를 데이터 버스로(with AppSheet) 35 Django 모델 텍스트 필드 자동 수집 패턴 36 localStorage로 섹션 토글 상태 유지 37 순차 ID 생성(`select_for_update()` + `max()` 조합) 38 역참조 검색과 distinct() 39 xlsx 다운로드와 로딩 오버레이 충돌 40 Android 파일 공유 MIME 타입 41 AssetManifest — Flutter 빌드 타임 asset 목록 런타임 조회 42 크레센도 Phaser + TypeScript TIL 1 43 크레센도 Phaser + TypeScript TIL 2 읽는 중 44 크레센도 Phaser + TypeScript TIL 3 45 크레센도 Phaser + TypeScript TIL 4 46 크레센도 Phaser + TypeScript TIL 5 47 여둘까 Office Layout TIL 1 48 습관만들기 Pawbit TIL 4 49 여둘까 Office Layout TIL 2 50 여둘까 Office Layout TIL 3 51 크레센도 Phaser + TypeScript TIL 6 52 UTF-8 BOM과 PowerShell 파일 쓰기 53 소리꽃 KeyBloom TIL 1 54 습관만들기 Pawbit TIL 5 55 여둘까 Office Layout TIL 4 56 소리꽃 KeyBloom TIL 2 57 소리꽃 KeyBloom TIL 3 58 메트로놈 Simple Metronome TIL 1 59 소리꽃 KeyBloom TIL 4 60 메트로놈 Simple Metronome TIL 2 61 소리꽃 KeyBloom TIL 5 62 습관만들기 Pawbit TIL 6 63 크레센도 Phaser + TypeScript TIL 7 64 메트로놈 Simple Metronome TIL 3 65 소설 타임라인 관리 도구 Lumior TIL 1 66 습관만들기 Pawbit TIL 7 67 정적 블로그 SEO 정비와 Pagefind 검색 도입 68 크레센도 Phaser + TypeScript TIL 8 69 메트로놈 Simple Metronome TIL 4 70 습관만들기 Pawbit TIL 8 71 안드로이드 AudioTrack 연속 재생, 실측 피커 정렬, 카메라 토치 플래시 72 메트로놈 Simple Metronome TIL 5 73 모래게임 Sandrop TIL 1 74 습관만들기 Pawbit TIL 9 75 메트로놈 Simple Metronome TIL 6 76 모래게임 Sandrop TIL 2 77 모래게임 Sandrop TIL 3 78 습관만들기 Pawbit TIL 10 79 습관만들기 Pawbit TIL 11 80 메트로놈 Simple Metronome TIL 7 81 모래게임 Sandrop TIL 5 82 모래게임 Sandrop TIL 4 83 습관만들기 Pawbit TIL 12 84 모래게임 Sandrop TIL 6 85 소리꽃 KeyBloom TIL 6 86 모래게임 Sandrop TIL 7 87 모래게임 Sandrop TIL 8 88 소리꽃 KeyBloom TIL 7 89 모래게임 Sandrop TIL 9 90 소리꽃 KeyBloom TIL 8 91 모래게임 Sandrop TIL 10 92 소리꽃 KeyBloom TIL 9 93 콘티온 ContiOn TIL 1 94 소리꽃 KeyBloom TIL 10 95 콘티온 ContiOn TIL 2 96 습관만들기 Pawbit TIL 13 97 콘티온 ContiOn TIL 3 98 모래게임 Sandrop TIL 11 99 소리꽃 KeyBloom TIL 11 100 여둘까 Office Layout TIL 5 101 모래게임 Sandrop TIL 12 102 모래게임 Sandrop TIL 13 103 콘티온 ContiOn TIL 4 104 모래게임 Sandrop TIL 14 105 소리꽃 KeyBloom TIL 12 106 습관만들기 Pawbit TIL 14 107 모래게임 Sandrop TIL 15 108 모래게임 Sandrop TIL 16 109 소리꽃 KeyBloom TIL 13 110 온실 GreenHouse TIL 1 111 콘티온 ContiOn TIL 5 112 모래게임 Sandrop TIL 17 113 소리꽃 KeyBloom TIL 14 114 온실 GreenHouse TIL 2 115 콘티온 ContiOn TIL 6 116 모래게임 Sandrop TIL 18 117 콘티온 ContiOn TIL 7 118 모래게임 Sandrop TIL 19 119 소리꽃 KeyBloom TIL 15 120 모래게임 Sandrop TIL 20 121 모래게임 Sandrop TIL 21 122 소리꽃 KeyBloom TIL 16 123 소리꽃 KeyBloom TIL 17 124 소리꽃 KeyBloom TIL 18 125 여둘까 Office Layout TIL 6 126 소리꽃 KeyBloom TIL 19 127 소리꽃 KeyBloom TIL 20 128 콘티온 ContiOn TIL 8 129 콘티온 ContiOn TIL 9 130 로그스톤 상표 셀프 출원 TIL 1 131 소리꽃 KeyBloom TIL 21 132 로그스톤 샵 LogStone Shop TIL 1 133 소리꽃 KeyBloom TIL 22 134 로그스톤 샵 LogStone Shop TIL 2 135 소리꽃 KeyBloom TIL 23 136 모래게임 Sandrop TIL 22 137 모래게임 Sandrop TIL 23 138 소리꽃 KeyBloom TIL 24 139 로그스톤 샵 LogStone Shop TIL 3 140 모래게임 Sandrop TIL 24 141 소리꽃 KeyBloom TIL 25 142 모래게임 Sandrop TIL 25 143 MiniMacro TIL 1 144 모래게임 Sandrop TIL 26 145 콘티온 ContiOn TIL 10 146 Astro가 무엇인지, 왜 옮기는지 147 모래게임 Sandrop TIL 27 148 소리꽃 KeyBloom TIL 26 149 MiniMacro TIL 2 150 로그스톤 샵 LogStone Shop TIL 4 151 메트로놈 Simple Metronome TIL 8 152 모래게임 Sandrop TIL 28 153 여둘까 Office Layout TIL 7 154 메트로놈 Simple Metronome TIL 9 155 블로그 Astro 이관 TIL 156 여둘까 Office Layout TIL 8 157 로그스톤 샵 LogStone Shop TIL 5 158 모래게임 Sandrop TIL 29 159 오픈데이 Openday TIL 1 160 로그스톤 샵 LogStone Shop TIL 6 161 모래게임 Sandrop TIL 30 162 오픈데이 Openday TIL 2 163 모래게임 Sandrop TIL 31 164 Unreal Engine MCP TIL 1 165 모래게임 Sandrop TIL 32 166 소리꽃 KeyBloom TIL 27 167 콘티온 ContiOn TIL 11 168 오픈데이 Openday TIL 3 169 로그스톤 샵 LogStone Shop TIL 7 170 모래게임 Sandrop TIL 33 171 소리꽃 KeyBloom TIL 28 172 오픈데이 Openday TIL 4 173 여둘까 Office Layout TIL 9 174 오픈데이 Openday TIL 5 175 ScorePlayer TIL 1 176 모래게임 Sandrop TIL 34 177 BuildingHub TIL 1 178 ScorePlayer TIL 2 179 여둘까 Office Layout TIL 10 180 BuildingHub TIL 2 181 ScorePlayer TIL 3 182 Unreal Engine MCP TIL 2 183 궁 미로 PalaceMaze TIL 1 184 메트로놈 Simple Metronome TIL 10 185 메트로놈 Simple Metronome TIL 11 186 오픈데이 Openday TIL 6 187 BuildingHub TIL 3 188 Obsidian vault에서 코드만 빼기 — directory junction 189 ScorePlayer TIL 4 190 여둘까 Office Layout TIL 11 191 오픈데이 Openday TIL 7 192 URL은 바뀔 수 있는 것에 묶지 않는다 193 도구는 기능이 아니라 내 일에 맞는지로 고른다 194 돌이키기 힘든 변경은 작게 먼저 확인한다 195 궁 미로 PalaceMaze TIL 2 196 궁 미로 PalaceMaze TIL 3 197 소리꽃 KeyBloom TIL 29 198 오픈데이 Openday TIL 8 199 BuildingHub TIL 4 200 ScorePlayer TIL 5 201 로그스톤 샵 LogStone Shop TIL 8 202 여둘까 Office Layout TIL 12 203 오픈데이 Openday TIL 9 204 BuildingHub TIL 5 205 MiniMacro TIL 3 206 소리꽃 KeyBloom TIL 30 207 오픈데이 Openday TIL 10 208 여둘까 Office Layout TIL 13 209 소리꽃 KeyBloom TIL 31 210 궁 미로 PalaceMaze TIL 4 211 로그스톤 샵 LogStone Shop TIL 9 212 로그스톤 샵 LogStone Shop TIL 10 213 소리꽃 KeyBloom TIL 32