Unreal 개발 본 캠프 54일차

HappyCircle·2026년 2월 13일

Unreal 개발

목록 보기
71/163

📘 TIL – 코딩 테스트 문제 멀리뛰기, 몬스터 공격 로직 적용 및 안정화


🧠 오늘의 이슈

“구조를 먼저 정리하면 구현은 단순해진다.”

  • 코딩테스트: 점화식을 이해하고 반복 구조를 단순화
  • 게임 개발: 공격을 “AI 행동”이 아니라 “타이밍 시스템”으로 정리

🧠 1️⃣ 코딩테스트 정리


1.1 멀리뛰기 – DP 점화식 구조 이해

📌 문제 핵심

  • 한 번에 1칸 또는 2칸 이동 가능
  • n칸에 도달하는 방법의 수를 구하라
  • 결과는 1234567로 나눈 나머지

❌ 잘못 접근하기 쉬운 방식

  • 재귀로 모든 경우 탐색
  • 동일한 계산 반복
  • 시간 초과 발생

✅ 구조적 접근 (DP)

핵심 관점:

n칸에 도달하는 방법은
(n-1)칸에서 1칸 이동 + (n-2)칸에서 2칸 이동

즉,

[
dp[n] = dp[n-1] + dp[n-2]
]

피보나치 구조와 동일하다.


점화식 정리

  • dp[1] = 1
  • dp[2] = 2
  • dp[n] = dp[n-1] + dp[n-2]

정석 코드

long long solution(int n)
{
    const int MOD = 1234567;

    if (n <= 2) return n;

    vector<long long> dp(n + 1);
    dp[1] = 1;
    dp[2] = 2;

    for (int i = 3; i <= n; i++)
    {
        dp[i] = (dp[i-1] + dp[i-2]) % MOD;
    }

    return dp[n];
}

🧠 인사이트

멀리뛰기는 경우의 수 문제가 아니라
“점화식 구조 이해 문제”다.

  • 재귀 ❌
  • 반복 DP ✔
  • 중복 계산 제거 ✔

1.2 원형 수열 부분합 – Prefix Sum 구조

📌 핵심

  • 원형 구조의 연속 부분합
  • 모든 경우의 수 중 중복 제거

✅ 접근

  1. 배열을 2배 확장 (Linearize)
  2. Prefix Sum 계산
  3. ps[r] - ps[l] 방식으로 부분합을 O(1)에 계산
  4. set으로 중복 제거

구조 코드 예시

vector<int> arr2(2*n);
for (int i = 0; i < n; i++)
{
    arr2[i] = arr[i];
    arr2[i + n] = arr[i];
}

vector<int> ps(2*n + 1, 0);
for (int i = 0; i < 2*n; i++)
{
    ps[i+1] = ps[i] + arr2[i];
}

🧠 인사이트

원형을 직접 다루지 말고
선형으로 변환하라.


🎮 2️⃣ 몬스터 공격 로직 적용 및 안정화

※ 이 시점에서는 공격 VFX는 고려하지 않음.
오직 공격 판정과 구조 안정화에 집중.


2.1 공격 시스템 목표 재정의

기존 사고:

"AI가 적을 때린다."

수정된 구조:

"AI는 공격을 요청하고, 실제 판정은 애니메이션 타이밍에서 발생한다."


2.2 전체 공격 흐름

  1. BT (Behavior Tree): 공격 판단

  2. CombatComponent::RequestBasicAttack(Target): 공격 요청

  3. Montage_Play: 공격 애니메이션 재생

  4. AnimNotify (타격 프레임): 실제 판정 발생

  5. 결과 처리

    • 근접: ApplyPendingBasicDamage()
    • 원거리: FirePendingRangedProjectile()

2.3 RequestBasicAttack의 역할

bool RequestBasicAttack(AActor* Target);

수행 작업

  • PendingTarget 저장
  • 몽타주 재생
  • 공격 상태 플래그 설정

제외 작업

  • 데미지 직접 적용 ❌
  • 투사체 직접 생성 ❌

🧠 설계 의미

AI는 의도를 표현하고
애니메이션이 결과를 만든다.


2.4 AnimNotify 기반 데미지 적용

근접 공격

  • PendingTarget 유효성 검사
  • 거리 체크
  • 데미지 적용

원거리 공격

  • PendingTarget 기준으로 Projectile 생성
  • 데미지는 Projectile에서 처리

2.5 중복 데미지 방지

문제

  • Notify가 한 프레임 내 여러 번 호출될 가능성

해결

if (bQueuedApplyDamageThisTick) return;
bQueuedApplyDamageThisTick = true;

2.6 Projectile 설계 (VFX 미고려)

이 시점의 Projectile은:

  • 이동
  • 충돌
  • 데미지 적용

이라는 순수 물리 로직에 집중.

Collision 전략

  • BlockAll 사용 ❌
  • 필요한 채널만 명확히 Block ✔

🎯 3️⃣ 오늘의 공통 사고 정리

항목코딩테스트게임 개발
핵심 구조점화식 (DP)AnimNotify 기반 판정
최적화중복 계산 제거책임 분리
안정성반복 DP중복 데미지 방지
관점수열 구조 이해애니메이션 타이밍 이해

profile
개발합시다!

0개의 댓글