본문으로 건너뛰기

능력 모드 알림 구조

목적​

마그넷 캐치, 아이스메이크, 타임록 등 능력 모드의 전환 알림을 플레이어의 실행 상태와 월드 액터의 반응에서 분리한다. 입력 키와 CurrentAbility 보관 방식은 입력 시스템, 플레이어·능력 상태 구조를 따른다.

플레이어는 모드 전환만 요청한다. 각 월드 액터는 자신이 반응할 수 있는 모드를 등록하고, 알림을 받으면 자기 비주얼과 게임플레이 동작을 처리한다.

플레이어의 능력 / UAbilityEffectComponent
↓ 모드 전환 요청
UAbilityModeSubsystem
↓ 등록 리스너에 알림
AbilityReactionComponent가 붙은 월드 액터
↓
자기 비주얼·물리·게임플레이 반응 처리

구성 요소​

UAbilityModeSubsystem​

UGameInstanceSubsystem 기반 전역 관리자다. 게임 인스턴스마다 하나이며 레벨 전환 중에도 유지된다.

  • 활성 EAbilityVisualMode 집합을 보관한다.
  • IAbilityModeListener 등록과 해제를 관리한다.
  • 모드 전환 시 해당 모드를 지원한다고 등록한 리스너에만 OnAbilityModeChanged를 보낸다.
  • 모드 진입 순간의 수평 시선 방향을 ModeScanDirection으로 보관한다. 스캔 사선은 모드가 꺼질 때까지 이 방향에 고정된다.
  • 개별 액터의 머티리얼, 물리, AI를 직접 구현하지 않는다.

IAbilityModeListener​

모드 변경 알림을 받을 UObject/Actor Component 인터페이스다. 월드에 배치하는 독립 액터가 아니다.

TArray<EAbilityVisualMode> GetSupportedAbilityModes();
void OnAbilityModeChanged(EAbilityVisualMode Mode, bool bEnabled);

AbilityReactionComponent​

월드 액터에는 이 컴포넌트 하나를 붙인다. 컴포넌트가 리스너 구현, 서브시스템 등록·해제, 공통 비주얼을 맡는다.

현재 EAbilityReactionType과 지원 모드는 다음과 같다.

반응 타입지원 모드공통 시각 반응
Normal마그넷 캐치·아이스메이크·타임록별도 타겟 반응 없음
MagnesisTarget마그넷 캐치타겟 표면 강조 + 후보 스텐실
StasisTarget타임록타겟 표면 강조 + 후보 스텐실
CryonicTarget아이스메이크대상 표면 강조 + 후보 스텐실

MagnesisTarget은 “마그넷 캐치로 실제 조준·잡기가 가능한 물체”라는 뜻이다. 마그넷 캐치의 기능 판정은 이 타입과 물리 시뮬레이션 여부를 함께 확인한다. 아이스메이크가 인식하는 수면은 Water가 아니라 CryonicTarget 반응 타입으로 지정한다.

리모트 폭탄은 EAbilityVisualMode::None으로 변환되므로 능력 모드 알림, 월드 스캔, 후보 강조에 참여하지 않는다. 폭발 반경 효과는 폭탄 자체의 폭발 VFX다.

등록하지 않은 반응 대상은 제작 누락이다. 등록하지 않은 월드 배경이나 하늘은 능력 연출에 참여하지 않는다.

스텐실 계약​

스텐실 번호는 능력 종류가 아니라 현재 표시 상태를 전달한다.

값의미
0일반 월드 / 효과 대상 아님
1현재 모드에 반응하는 후보
2플레이어가 현재 조준한 후보
3플레이어

AbilityReactionComponent는 활성 모드의 후보에 1을 쓴다. 마그넷 캐치의 조준 Trace는 현재 후보만 2로 올리고, 이전 후보는 1로 되돌린다. 모드 종료 시 컴포넌트가 해당 표시를 해제한다.

시각 연출 책임​

공용 화면 스캔​

M_PP_AbilityModeWorldScan은 공용 Post Process 부모 머티리얼이다. 화면 전체의 낮은 강도 색보정과 스텐실 상태별 후보/조준 강조만 담당한다.

  • 하늘은 Scene Depth로 제외한다.
  • 플레이어는 스텐실 3으로 제외한다.
  • 능력별 색상·블렌드 값은 DA_AbilityProfiles에서 관리한다.
  • 세 모드는 공용 부모 머티리얼을 사용한다. 런타임 동적 인스턴스에 DA_AbilityProfiles의 현재 모드 색상·블렌드 값을 설정한다.

액터별 표현​

Post Process는 개별 메시의 로컬 좌표를 알 수 없다. 따라서 물체별 사선과 입체감은 액터 쪽에서 처리한다.

  • M_AbilityModeTargetSurface: 모드 대상의 표면 가장자리를 약하게 강조한다.
  • 두 머티리얼의 색상은 DA_AbilityProfiles의 현재 모드 프로필로 동적으로 설정한다.

현재 AbilityReactionComponent 코드에서 Normal 타입의 윗면 사선 오버레이는 적용하지 않는다. 대상 표면 오버레이는 반응 타입이 활성 모드의 타겟 반응과 일치할 때 생성·표시된다. 스텐실 강조 경로는 코드상 SetRenderCustomDepth(false)로 비활성화되므로, 후보·조준 PP 강조가 실제 표시된다고 단정하지 않는다. 이전 마그넷 캐치 계열 식별자와 Water 반응 타입은 현재 구조에서 사용하지 않는다.

마그넷 캐치의 상태 경계​

일반
→ 능력 사용: MagnesisTargeting + 마그넷 캐치 월드 스캔
→ 상호작용 적중: MagnesisHolding + 월드 스캔 종료 + 잡기/빔만 유지
→ 취소·놓기: 일반

MagnesisHolding은 능력 모드가 아니다. 잡은 물체를 카메라 방향으로 움직이는 물리 조작 상태다. 그래서 월드 스캔과 모든 후보 사선은 대상 선택에 성공한 순간 종료한다.

아이스메이크의 상태 경계​

일반
→ 능력 사용: CryonisTargeting + 아이스메이크 월드 스캔
→ 수면 조준: 생성 위치 미리보기 + 생성 가능 여부 표시
→ 생성 성공: 얼음 기둥 생성 + 조준 유지 + 2초 생성 쿨다운
→ 생성 실패: 새 기둥 없이 조준 유지
→ 취소: 일반

아이스메이크는 유효한 수면을 조준하는 동안 생성 위치와 생성 가능 여부를 표시한다. 얼음 기둥을 만든 뒤에도 조준을 유지하며, 2초 생성 쿨다운 동안 새 기둥은 만들 수 없다. 생성에 실패해도 조준은 유지한다. 입력을 취소하면 미리보기와 후보 표시를 해제하고 일반 상태로 돌아간다.

타임록의 상태 경계​

일반
→ 능력 사용: StasisTargeting + 타임록 월드 스캔
→ 대상 확정: StasisActive + 대상 정지
→ 정지 중 타격: StasisActive + 축적 힘 표시
→ 다른 능력 선택·사용: 대상 정지와 타이머 유지
→ 시간 만료: 정지 전 움직임 복원 + 축적 힘 적용 + 재사용 대기 시작
→ 조준 중 취소·능력 변경: 일반
→ 대상 제거·재시작: 대상 정리 + 일반

타임록은 정지 가능한 대상을 조준하는 동안 후보를 표시한다. 대상을 확정하면 정지 상태와 남은 시간, 축적된 힘을 표시한다. 지속 시간이 만료되면 정지 전 움직임을 재개하고 축적된 힘을 적용한 뒤 대상 표시를 정리한다. 타임록 외의 능력을 선택했더라도 대상의 정지와 타이머는 독립적으로 유지된다. 정지 확정 후에는 수동 해제하지 않으며, IA_Cancel과 능력 변경은 조준 중에만 타임록 조준을 취소한다.