본문으로 건너뛰기

플레이어·능력 상태 구조

목적​

선택한 능력과 플레이어 실행 상태의 소유자, 입력 전달 경로를 설명한다. 입력 액션과 키 매핑은 입력 시스템을 따른다. 월드 액터에 능력 모드를 알리는 구조는 능력 모드 알림 구조를 참고한다.

상태와 소유자​

EAbilityType과 EPlayerState는 Durian/Source/Durian/Public/Enums/PlayerEnums.h에 정의한다. AKzPlayerCharacter는 CurrentAbilityType(초기값 Magnesis)과 CurrentState(초기값 Normal)를 보관한다. 조준, 보유, 공격 등의 실행 상태는 선택한 능력 종류와 별개다.

소유자책임
AKzPlayerController입력 액션을 EAbilityInput으로 변환하고 상호작용·공격 등 공용 입력의 우선순위를 결정
AKzPlayerCharacter플레이어 실행 상태와 선택 능력 종류 보관, 공격·이동 상태 처리, UPlayerAbilityComponent 보유
UPlayerAbilityComponentUMagnesisAbility, UCryonisAbility, UStasisAbility, URemoteBombAbility 생성·보관, 현재 UAbility 선택과 입력 전달
각 UAbility입력 및 CurrentState에 따라 조준·대상 조작·취소 실행

CurrentAbility는 캐릭터의 FAbility 포인터가 아니라 UPlayerAbilityComponent의 TObjectPtr<UAbility>다. 둥근형과 정육면체형 리모트 폭탄은 하나의 URemoteBombAbility를 공유하고 CurrentAbilityType으로 형태를 구분한다.

입력 전달​

Input Action
→ AKzPlayerController
→ UPlayerAbilityComponent::HandleInput(EAbilityInput, AxisValue)
→ CurrentAbility->HandleInput(...)
→ 필요한 경우 AKzPlayerCharacter::SetPlayerState(...)

Use, Interact, Cancel, CryonisTargetAtFeet, RemoteBombThrow, MagnesisDistance, Interrupt는 EAbilityInput에 정의된다. 능력 휠 선택 시 UPlayerAbilityComponent::SetAbility()가 이전 능력의 OnDeselected()를 호출하고, 선택 능력을 바꾼 뒤 OnAbilityChanged를 방송한다. 컴포넌트는 현재 능력을 Tick하며 타임록의 활성 타이머는 선택 능력과 독립적으로 갱신한다.

현재 IA_Cancel의 Controller 바인딩은 달리기 시작·종료에 연결돼 있다. 각 능력의 Cancel 처리 코드는 있지만 이 입력 액션에서 EAbilityInput::Cancel로 직접 전달되지는 않는다.

상호작용과 공격​

AKzPlayerController::OnInteract()는 능력 입력의 우선권을 확인한다. 능력이 조준·조작 중이거나 선택된 리모트 폭탄을 들고 있으면 Interact를 능력에 먼저 전달한다. 그 외에는 상호작용 가능한 상자를 시도하고, 처리되지 않으면 현재 능력에 전달한다.

공격 입력은 AKzPlayerCharacter::HandleAttack()으로 전달한다. 일반 공격 전에는 현재 능력에 Interrupt를 보내 조작 중인 대상을 정리한다. 권총 조준 중에는 FirePistol()을 실행하며 근접 공격과 블루프린트 공격 이벤트를 실행하지 않는다. 피격 시에도 Interrupt를 전달한다.

리모트 폭탄과 권총 입력​

IA_BombThrow가 시작되면 리모트 폭탄을 들고 있는 경우 RemoteBombThrow를 전달한다. 그 외에는 권총 조준을 시도한다. 해당 입력을 놓거나 취소하면 권총 조준을 끝낸다. 능력 사용·상호작용·능력 휠·메뉴 입력도 권총 조준을 끝낸다. 권총 조준 여부는 별도 bPistolAiming으로 보관하며 EPlayerState에 권총 전용 항목을 추가하지 않는다.

마그넷 캐치 상태 예시​

CurrentAbilityType = Magnesis, CurrentState = Normal
→ Use: MagnesisTargeting, 카메라 중앙 Trace로 후보 탐색
→ Interact: 유효 대상이면 Physics Handle로 잡고 MagnesisHolding
→ Use 재입력·낙하·피격·능력 변경: 대상 해제 후 Normal
→ 공격: Interrupt로 해제한 뒤 공격 처리

후보 대상은 UMagnesisAbility의 약한 컴포넌트 참조로 관리하고, 잡은 대상은 Physics Handle에서 확인한다. 능력별 판정과 시각 효과는 각 기술 문서에서 다룬다.

관련 문서​