DX9-B02 | DX9 Cat Quest — Monster가 Player를 따라오고 공격하게 만들기
이 글에서 확인할 내용
DX9 Cat Quest에서 Monster는 화면에 배치된 적으로 끝나지 않았습니다.
Player 위치를 확인하고, 현재 거리와 방향에 따라 움직이거나 추적하고, 일정 조건이 되면 공격 Object를 생성하면서 실제로 Player에게 위협을 주는 Runtime Object였습니다.
당시에는 지금처럼 AI Controller나 Behavior Tree 같은 구조를 사용하지 않았고, C++ 코드 안에서 Player 위치와 거리를 직접 확인해 행동을 결정했습니다.
이 글에서는 Player 위치 확인 → 거리 / 방향 판단 → 이동 / 추적 → 공격 조건 확인 → 공격 Object 생성 흐름을 중심으로 정리합니다.
Monster가 Player를 기준으로 행동하게 했다
Monster의 기본 흐름은 비교적 단순했습니다.
Text
Monster Update
↓
Player Transform 확인
↓
현재 위치와 Player 위치 비교
↓
거리 / 방향 판단
↓
이동 / 추적 / 공격 판단
↓
Transform 이동
↓
Collider 갱신
↓
공격 Object 생성중요했던 것은 Monster가 자기 위치만 갱신하는 Object가 아니라는 점이었습니다.
Player가 어디에 있는지를 계속 확인하고, 그 결과에 따라 움직임이나 공격 여부가 달라졌습니다.
처음 만들 당시에는 “적이 따라온다”, “적이 공격한다” 정도로 생각했습니다.
하지만 지금 다시 보면 Monster가 Player와의 관계를 기준으로 상태를 바꾸고, 그 결과를 이동과 공격으로 보여주는 흐름이었습니다.
Monster마다 맡은 역할이 달랐다
DX9 Cat Quest에는 여러 Monster가 있었고, 모두 같은 역할을 하는 것은 아니었습니다.
대표적으로 아래 네 가지를 기준으로 볼 수 있습니다.
Text
CBat
→ 기본 전투 / 피격 결과 확인
CFireFox
→ Player 추적 / Fire 계열 공격 위협
CThunderRam
→ Player 접근 감지 / Thunder 계열 공격 생성
CDragon
→ 문지기 보스 성격 / 더 큰 공격 위협이 구분은 지금 다시 코드를 정리하면서 더 명확하게 보였습니다.
당시에는 모두 “Monster”라고 묶어서 생각했지만, 실제로는 어떤 Object는 피격 결과를 확인하기 좋았고, 어떤 Object는 추적이나 공격 Object 생성 쪽 역할이 더 컸습니다.
그래서 지금은 Monster를 구현했다는 한 문장보다 각 Monster가 어떤 방식으로 Player에게 위협을 만들었는지를 나눠서 설명하고 있습니다.
CBat — 기본 전투와 Damage 결과를 확인하기 좋은 Monster
CBat은 Player 기본 공격의 피격 대상이 되어 전투 결과를 확인하기 좋은 Monster였습니다.
Text
Player LMB
↓
AttackAIO
↓
Layer_Monster
↓
CBat Collider 확인
↓
CStatus::Damaged
↓
CWorldNumber 표시Player의 Slash Effect가 보이는 것과 별개로 실제 Collider 판정을 통해 Damage가 적용되고, 그 결과가 WorldNumber로 표시되는 흐름을 확인할 수 있었습니다.
그래서 CBat은 복잡한 AI를 설명하기보다 Player 공격이 실제 Monster의 Damage 결과까지 이어지는 기본 전투 대상으로 보는 편이 정확합니다.
FireFox — Player를 따라오고 Fire 계열 공격을 만들었다
CFireFox는 Player 위치를 기준으로 이동하거나 추적하고, 일정 조건에서 FireBall이나 Bullet 계열 공격 Object를 생성했습니다.
Text
CFireFox Update
↓
Player Transform 확인
↓
거리 / 방향 판단
↓
이동 또는 추적
↓
FireBall / Bullet 생성FireFox를 구현하면서 Monster가 단순히 정해진 방향으로 움직이는 것이 아니라, Player의 현재 위치를 기준으로 반응하는 흐름을 직접 다뤘습니다.
Text
내 위치
Player 위치
거리
방향
공격 가능 여부이 값들을 기준으로 행동이 달라지면서 Monster가 화면에 놓인 장식이 아니라, 실제로 Player를 압박하는 적으로 동작하게 됐습니다.
ThunderRam — 가까워졌을 때 공격 Object를 생성했다
CThunderRam은 Player가 일정 거리 안으로 들어왔을 때 공격 Object를 생성하는 흐름이었습니다.
Text
Player 접근
↓
거리 조건 확인
↓
ThunderBall / Bullet1 생성FireFox와 목적은 비슷했지만 반응 조건과 생성하는 공격 Object는 달랐습니다.
이렇게 Monster마다 다른 조건과 공격을 붙이면서, 같은 적 Object라도 행동 방식이 달라지면 Gameplay에서 다른 위협으로 느껴질 수 있다는 점을 경험했습니다.
다만 ThunderRam은 다른 Monster와 동일한 HP / Death 흐름을 가진 대상으로 설명하면 정확하지 않습니다.
그래서 이 글에서도 접근 감지와 공격 Object 생성 역할에 초점을 맞춰 정리합니다.
Dragon — 일반 Monster보다 더 큰 위협을 만들었다
Dragon은 일반 Monster보다 더 큰 공격 연출과 위협을 주기 위한 문지기 보스 성격으로 구현했습니다.
Player 위치를 기준으로 공격 조건을 판단하고 여러 공격 Object를 생성했습니다.
Text
Player 위치 확인
↓
공격 조건 판단
↓
FireBall / Bullet / Fire / Fire_Panel
↓
여러 방향의 공격 위협당시에는 공격 Phase, Cooldown, Hit 판정, HP 흐름을 지금처럼 세밀하게 나누지 못했습니다.
그래도 Dragon을 통해 단순히 추적하는 Monster보다 한 단계 더 큰 규모의 공격 패턴을 만들어봤고, 여러 공격 Object를 조합해 Player에게 더 강한 압박을 주는 경험을 했습니다.
그래서 Dragon을 완성도 높은 Boss Framework로 설명하기보다, 일반 Monster보다 큰 위협을 주기 위해 여러 공격 Object를 사용한 문지기 보스 성격의 Monster로 보고 있습니다.
모든 Monster가 같은 구조는 아니었다
코드를 다시 확인하면서 가장 중요하게 정리한 부분 중 하나입니다.
모든 Monster를
Text
Spawn
↓
Chase
↓
Attack
↓
Hit
↓
HP 감소
↓
Death흐름으로 동일하게 설명하면 실제 구현 범위와 맞지 않습니다.
어떤 Monster는 Damage와 Status 흐름을 확인하기 좋은 대상이었고, 어떤 Monster는 Player를 추적하거나 공격 Object를 생성하는 역할에 더 가까웠습니다.
그래서 지금은 다음처럼 구분합니다.
Text
피격 / Damage 결과를 보여주는 Monster
!=
추적 / 공격 위협을 만드는 Monster초기 프로젝트일수록 실제 구현 범위를 넘어서 과하게 설명하기보다, 어디까지 직접 동작했고 어떤 역할을 맡았는지 구분하는 것이 더 중요하다고 생각합니다.
지금 다시 보면
DX9 Cat Quest에서는 별도의 AI Framework 없이 직접 Player 위치와 거리를 비교했습니다.
구조 자체는 단순했지만, 이때부터 Enemy를 볼 때 자연스럽게 이런 질문을 하게 됐습니다.
Text
Player를 어떻게 찾는가?
언제 추적하는가?
언제 공격하는가?
공격은 어떤 Object로 만들어지는가?
Damage 결과는 어디에 반영되는가?이 질문은 이후 DX11과 Unreal 프로젝트에서도 그대로 이어졌습니다.
Unreal에서는 Perception, Target Actor, Behavior Tree, State Machine, Gameplay Ability처럼 더 큰 구조를 사용하게 됐지만, 결국 Enemy가 Player를 인식하고 행동을 결정한 뒤 공격 결과를 만드는 기본 질문은 비슷했습니다.
DX9 Cat Quest에서는 그 흐름을 더 단순한 C++ 코드로 먼저 경험했습니다.
Runtime
아래 영상에서는 Monster가 Player 주변에서 움직이고, Fire / Thunder 계열 공격 Object가 생성되며, Dragon이 일반 Monster보다 더 큰 공격 위협을 만드는 장면을 확인할 수 있습니다.
DirectX9 C++ Cat Quest — YouTube
DX9 Cat Quest에서는 단순한 위치 비교와 조건문, Object 생성 흐름으로 구현했지만, Player를 기준으로 Enemy가 반응하고 전투 위협을 만드는 기본 구조를 처음 직접 경험한 프로젝트였습니다.