본문으로 건너뛰기

타임록 기능 구현 설계

목적​

무생물 물리 오브젝트 하나의 움직임을 10초 동안 정지하고, 정지 중 받은 타격 힘을 축적해 지속 시간이 끝날 때 원래 움직임에 더한다. 타임록 능력은 챌린지의 목표 판정과 독립적으로 동작한다.

구현 범위​

  • 물리 시뮬레이션 오브젝트 하나를 10초 정지
  • 정지 대상 판정과 시각 피드백
  • 정지 대상에 실제로 적중한 캐릭터 공격의 방향·충격량 축적
  • 지속 시간 만료 시 정지 전 움직임 복원과 축적 힘 한 번 적용
  • 종료 뒤 재사용 대기시간
  • 조준 취소, 재시작, 클리어 시 상태 복구

적 대상 정지, 다중 대상 정지, 플레이어 정지, 챌린지 목표 판정은 이번 범위에 포함하지 않는다.

초기 조정값​

값초기값설명
정지 지속 시간10초정지 시작부터 자동 종료까지의 시간
재사용 대기시간10초정지 만료와 대상의 움직임 재개 시점부터 다음 대상에 사용할 수 있을 때까지
동시 정지 대상1개새 대상을 정지하기 전에 기존 대상의 시간이 끝나야 한다
최대 축적 힘StasisMaxImpulse대상별 물리 질량과 분리된 능력 조정값
타격당 축적량StasisImpulsePerHit실제 적중한 히트 판정 1회당 공격 방향으로 더하는 충격량
근접 타격 거리StasisMeleeRange (220 cm)공격 입력 1회당 전방 적중 검사 거리
근접 타격 반경StasisMeleeRadius (45 cm)전방 구체 Sweep의 반경

수치는 데이터 자산 또는 능력 설정값으로 조정 가능하게 두며, 챌린지별 목표 판정 값과 섞지 않는다.

권장 구조​

UStasisAbility (UPlayerAbilityComponent가 생성·선택)
├─ 대상 탐색과 정지 요청
├─ 현재 정지 대상 관리
├─ 지속 시간·재사용 대기시간 관리
└─ 축적 힘 표시 갱신

UStasisTargetComponent
├─ 정지 가능 여부
├─ 정지 전 물리 상태 저장·복원
├─ 축적 힘
└─ 정지·종료 시 피드백 이벤트

타임록은 대상별 상태 보존이 중요하므로 UStasisTargetComponent를 사용한다. 대상 컴포넌트는 정지 전 선형·각속도와 물리 상태를 저장하고, UStasisAbility는 선택·타이머·종료 처리를 담당한다. 대상 판정과 조준 반응은 공용 UAbilityReactionComponent의 StasisTarget 반응 타입을 기준으로 한다. UPlayerAbilityComponent는 현재 선택된 능력과 별개로 타임록의 활성 타이머를 갱신한다.

상태 흐름​

사용 가능 → 조준 → 정지 중 → 시간 만료·힘 적용 → 재사용 대기 → 사용 가능
  • 조준 시 유효 대상만 강조한다.
  • 정지 시작 시 대상의 선형·각속도와 물리 상태를 저장하고 물리 움직임을 멈춘다.
  • 정지 중에는 실제 적중한 캐릭터 공격의 히트 판정 1회당 1타의 충격량만 축적한다. 일반 외력은 대상에 즉시 적용하지 않으며, 대상은 파괴되지 않는다.
  • 플레이어가 다른 능력을 선택하거나 사용해도 대상의 정지와 10초 타이머를 유지한다.
  • 지속 시간 만료 시 공통 종료 경로를 사용한다.
  • 종료 시 원래 움직임에 축적 힘을 한 번 더하고, 대상이 다시 움직이기 시작하면 재사용 대기시간으로 전환한다.

대상 판정과 물리 처리​

  1. 카메라 중앙에서 최대 거리까지 Trace한다.
  2. 적중 액터의 UAbilityReactionComponent 반응 타입이 StasisTarget인지 확인한다.
  3. 적중 프리미티브 컴포넌트가 물리 시뮬레이션 중이고 캐릭터·적이 아닌지 확인한다.
  4. 이미 정지 중이거나 다른 능력이 점유한 대상은 제외한다.

정지 중에는 대상의 물리 시뮬레이션을 일시 중지해 위치와 움직임을 고정한다. 만료 시 저장한 물리 상태와 선형·각속도를 복원한 뒤 축적 힘을 적용한다. 타격이 없으면 원래 움직임 그대로 재개한다.

힘 축적과 종료​

  • 캐릭터 공격이 정지 대상에 실제로 적중했을 때 히트 판정 1회당 1타로 처리한다. 타격 충격량은 UStasisTargetComponent의 축적 API를 통해 즉시 적용하지 않고 타격 방향의 벡터에 더한다.
  • 축적량은 StasisMaxImpulse로 제한한다.
  • 축적 방향과 강도는 대상 위 월드 피드백으로 보여준다. 타격 방향이 여러 번 바뀌면 합산 벡터를 표시한다.
  • 종료 시 정지 전 물리 상태와 선형·각속도를 복원한 뒤 축적 벡터를 한 번의 AddImpulse로 적용한다. 축적 벡터가 0이면 충격량을 추가하지 않는다.

정지 중 물체가 다른 물리 오브젝트와 충돌하는 경우의 처리는 별도 검증이 필요하다. 초기 챌린지은 대상 주위에 충분한 여유를 두어 복잡한 충돌을 피한다.

입력 연결​

동작입력처리
타임록 선택IA_AbilityWheel / Tab 홀드 후 놓기타임록 능력 선택
대상 조준화면 중앙유효 대상 강조
정지 시작IA_Interact / E대상 정지와 타이머 시작
정지 중 공격IA_Attack / 좌클릭대상에 실제 적중한 히트 판정 1회당 충격량 축적
지속 시간 만료별도 입력 없음원래 움직임 복원과 축적 힘 적용 후 정지 종료·쿨타임 시작
레벨 재시작메뉴의 재시작 항목대상 상태 복원 후 재시작

안전성과 피드백​

  • 정지 가능 대상에는 후보 외곽선과 색상을 표시한다.
  • 정지 중 대상에는 고정된 마커, 남은 시간, 축적 방향·강도를 표시한다.
  • 정지 시간이 끝나기 전 경고 피드백을 준다.
  • 재시작·클리어·사망 시에는 축적 힘을 적용하지 않고 물리 상태만 복원한다.
  • 정지 중 대상은 피해로 파괴되지 않는다. 맵 정리 등으로 대상 액터가 제거되면 능력은 즉시 대상 참조와 타이머를 정리한다.

구현 순서와 완료 기준​

  1. UStasisTargetComponent로 정지 전 물리 상태 저장과 복원을 구현한다.
  2. UStasisAbility의 대상 탐색과 정지 시작을 구현한다.
  3. 타이머와 공통 종료 경로를 연결한다.
  4. 타격 충격량 축적 API와 최대값 제한을 구현한다.
  5. 종료 충격과 방향·강도 피드백을 추가한다.
  6. 재사용 대기시간, 조준 취소, 능력 변경, 재시작 복구를 검증한다.

다음 조건을 실제 플레이로 확인하면 완료다.

  • 무생물 물리 오브젝트만 정지한다.
  • 대상이 10초 동안 안정적으로 멈추고, 다른 능력을 사용해도 만료 시 원래 움직임을 재개한다.
  • 타격이 없으면 원래 움직임 그대로 재개하고, 타격이 있으면 축적 방향과 강도를 플레이어가 읽고 만료 때 한 번의 힘이 추가된다.
  • 재시작 뒤 정지 상태와 축적 값이 남지 않는다.
  • 챌린지 목표 판정은 타임록 구현에 포함되지 않고 별도 시스템에서 정상 처리된다.

관련 문서​