🎮Unreal4/C++

[UE4] 공격 기능 - DoAction (UFXSystemAsset, Abstract, Blueprintable/NotBlueprintable)

공대 컴린이 2023. 4. 13. 18:26
728x90

이전 학습에 무기의 장착/해제 기능을 구현하였고, 이번에는 공격 기능을 구현해보았다.

💻 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, OwnerDoActionData를 받아서 초기화한다.

 

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에 만들어진 DoActionDatasDoAction 변수를 추가하여 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 노티파이는 아직 만들지 않음!)

 

이렇게 만들어진 공격 기능을 실행시킨 결과는 아래와 같다.

728x90