이전 학습에 무기의 장착/해제 기능을 구현하였고, 이번에는 공격 기능을 구현해보았다.
💻 WeaponStructures - FDoActionData (Sturct)
먼저, DoAction에 필요한 데이터의 속성을 WeaponStructure 컴포넌트에 추가주었다.
FDoActionData 는 몽타주와 실행속도, 공격하면서 움직일 수 있는지, 카메라를 고정시킬것인지, 공격 시 나타날 이펙트가 있는지, 이펙트의 위치/크기 정보 등을 가지고 있다.
UFXSystemAsset 클래스는 자식으로 UNiagaraSystem과 UParticleSystem을 가지고 있어, 두 클래스의 구분없이 이펙트를 저장할 수 있다.
DoAction 함수에는 Owner 캐릭터의 State 컴포넌트와 Movement 컴포넌트를 가져와, DoAction 몽타주를 실행시키고, bool 변수에 따른 설정을 적용하였다.
👊🏻 DoAction
만들어진 DoActionData를 활용하여 공격을 구현하기 위한 클래스로 UObject를 상속받는 CDoAction 클래스를 생성하였다.
DoAction 클래스는 블루프린트화 되지않고 자식클래스를 만들어 사용하기 때문에 UCLASS() 의 속성으로 Abstract, NotBlueprintable을 줬다.
BeginPlay에는 공격 동작을 수행할 Attachment와, 장착해제를 수행할 Equipment, Owner와 DoActionData를 받아서 초기화한다.
DoAction 함수와 Begin_DoAction, End_DoAction 함수는 무기마다 다를 수 있기 때문에 재정의 할 수 있도록 virtual로 선언하였다.
DoAction에서는 캐릭터의 상태를 Action Mode로 변경하고, End_DoAction에서는 다시 Idle Mode로 변경하였다.
실제 무기별로 공격할 기능들은 DoAction을 상속받아 따로 구현해주어야 무기별 다양한 공격들을 객체지향적으로 만들 수 있다.
👊🏻 DoAction_Combo
먼저, 콤보공격이 가능한 DoAction_Combo 클래스를 제작하였다.
DoAction_Combo는 부모클래스인 DoAction과 달리, 블루프린트화하여 사용할 수 있으므로 UCLASS에 Blueprintable 속성을 주었다.
몇번째 콤보인지를 구분할 Index와, 콤보 입력이 들어올 수 있는 상태인지를 검사하는 bEnable 변수와, 현재 콤보입력이 들어왔는지를 확인하는 bExist 변수,
외부에서 노티파이를 통해 콤보 입력범위를 정할 수 있도록 EnableCombo(), DisableCombo() 함수를 정의하였다.
이후, 부모로부터 상속받아 DoAction, Begin_DoAction, End_DoAction 함수를 재정의하였다.
DoAction 함수에서는 첫 공격을 시작으로 뒤로 콤보가 이어질 수 있는가를 확인한다.
(블루프린트에서 구현했던 콤보공격의 로직과 동일하다)
간단히 설명하여, 콤보구간이라면 (bEanble = true), bEnable을 false로 변경하고, 콤보가 존재한다고 표시(bExist = true)한다.
최초 공격에서는 캐릭터가 IdleMode인지를 한번 체크해줘야하고, DataActionDatas의 인덱스번째를 실행하여 몽타주 및 설정값들을 실행시킨다.
Begin_DoAction은 bExist가 True라면 뒤에 존재하는 콤보공격들을 계속 실행할 수 있도록 Index를 증가시킨 후 호출한다.
End_DoAction에서는 콤보공격이 끝났으므로 Index를 0으로 초기화한다.
💻 WeaponAsset
WeaponAsset에 만들어진 DoActionDatas와 DoAction 변수를 추가하여 Weapon의 데이터에 추가하였고,
Begin Play 함수에서 DoAction 개체를 생성해주었다.
💻 WeaponComponent
WeaponComponent에도 마찬가지로 DataAssets의 DoAction 객체에 접근할 수 있는 GetDoAction 함수를 추가하였다.
DoAction 클래스에 대한 생성과, 클래스 간 데이터를 주고받는 구조가 완성되었기 때문에 이제 실제 DoAction 데이터를 추가해주었다.
👊🏻 DataAsset - DA_OneHand
무기인 Attachment를 Sword로 설정하였기 때문에 Sword 를 사용하여 공격하는 Do Action Data 세 개를 DataAsset_OneHand 클래스에 추가하였다.
차례로 DoActionData의 속성값들인 Montage, PlayRate, CanMove, FixedCamera, Effect ,,, 들을 초기화하여 데이터를 정의하였다.
💻 AnimNotify / AnimNotifyState
이후에는 공격 몽타주에 배치될 Begin_Action 노티파이와 End_Action 노티파이를 추가해주었다.
![]() |
![]() |
Begin_Action, End_Action 노티파이로 DoAction 클래스의 BeginDoAction/EndDoAction 함수를 호출해주어야 콤보공격의 전환과 마무리가 정상적으로 구현될 수 있다.
마지막으로 Combo 공격의 입력을 받는 구간을 설정하기 위해 AnimNotifyState를 생성하였다.
NotifyBegin이 시작되면 DoAction_Combo 클래스의 EnableCombo 함수를 호출하여 콤보를 입력받을 수 있도록하고, NotifyEnd가 시작되면 DisableCombo로 콤보입력을 종료하였다.
만들어진 노티파이들을 공격 몽타주에 배치하였다. (Collision 노티파이는 아직 만들지 않음!)
이렇게 만들어진 공격 기능을 실행시킨 결과는 아래와 같다.