🎮Unreal4/C++

[UE4] 무기 장착 후 공격 시스템 구조 (Attachment-Equipment-DoAction, CWeaponStructures), 데이터 애셋 (Data Asset), NotBlueprintable

공대 컴린이 2023. 4. 11. 21:25
728x90

🏹 무기 장착 후 공격 시스템 구조

무기 모양과, 장착 방법, 액션 세가지로 분류하여 전투를 구현할 수 있다.

 

나는 Attachment 라는 객체를 무기 모양으로 설정하였다.

Attachment에는 칼이 들어갈수도, 해머가 들어갈수도, 활이 될수도 있다.

 

장착 방법Equipment 라는 객체로 만들어서 기본적으론 몽타주를 실행시켰다.

Equipment는 몽타주를 실행시킬 때 나타나는 Begin 이나 End 노티파이에 따른 어떠한 액션도 결정하도록 구상하였다.

 

액션은 어떠한 액션을 취할것인지를 나타낸다.

액션은 뭔가를 소유하며 작동하는데, 액션에 의해 Hit 되는 HitData 같은것이 있을 수 있다. (있을수도 없을수도 있다)

 

이 세가지는 각각을 독립적으로 구현하여, 서로간의 조합을 통해 다양한 기능과 반응을 구현할 수 있도록  하였다.

🗡️ Attachment : AActor

먼저, Attachment 클래스를 생성하였다.

 

무기를 결정하는 Attachment에는 무기를 어딘가에 붙일 Root가 존재해야 하므로, SceneComponent 객체를 생성하였다.

Root는 자식에서 접근해야 하므로 접근지정자를 protected로 하고, 블루프린트에서 어딘가에 붙이도록 설정해야 하므로 BlueprintReadOnly, 컴포넌트이므로 VisibleAnywhere로 설정하였다.

💻 Equipment : UObject

Equipment는 단순 기능만을 실행하는 클래스이기 때문에, UObject를 상속받았다.

(우선 구조만 잡는 과정이기 때문에 별다른 함수를 작성하진 않았다.)

 

이후, Equipment의 Equip 데이터를 관리하는 CWeaponStructures 클래스를 생성하였다.

📦 WeaponStructure ( EquipmentData )

WeaponStuctures 클래스에는 EquipmentData 구조체를 선언하여, Equip에 사용되는 몽타주와 PlayRate, bCanMove, bUseControlRotation 변수를 선언하였다.

🗃️ 데이터 애셋 (Data Asset)

이렇게 데이터의 구조를 만들어놨으니, 실제 데이터를 담을 클래스가 필요하다.

 

이때 데이터 애셋(Data Asset)을 사용해보았다.

데이터 애셋은 데이터가 들어있는 단순 애셋에 대한 클래스로, 데이터 애셋 클래스를 상속하면 콘텐츠 브라우저에 그 데이터들을 나열한다.

 

데이터 애셋을 생성할 때 선택한 부모클래스로부터 상속된 목록들이 나오게 된다.

따라서 이러한 목록으로 위에서 만든 WeaponStructures의 EquipmentData가 나오도록 Data Asset 클래스(CWeaponAsset)를 생성하였다.

📦 WeaponAsset : Data Asset

Data Asset을 상속받는 CWeaponAsset 클래스를 생성하였고, 안에 들어가는 변수들은 모두 블루프린트에서 나타나야하므로 UPROPERTY(EditAnywhere)로 직렬화하였다.

 

변수로는 Attachment의 클래스들과, Equipment 클래스들, EquipmentData를 선언하였다.

 

이렇게 만든 WeaponAsset을 상속받는 Data Asset 클래스를 만들고, 열어보면 아래와 같이 상속받아 직렬화된 변수 목록이 잘 나타나는것을 확인할 수 있었다.

 

💡 Cpp 클래스 기반 블루프린트 클래스 생성 막기

UCLASS() 매크로의 NotBlueprintable 를 사용하면 된다. 이때, 부모클래스를 NotBlueprintable 로 설정하였다면, 해당 부모를 상속받는 자식클래스에는 Blueprintable을 사용해야 자식들로 블루프린트 클래스를 만들 수 있다.

 

반대로 블루프린트 생성이 가능한 클래스로 사용하려면 Blueprintable 키워드를 사용하면 된다.

이때, 기본값은 다른 식으로 상속되지 않는 한 NotBlueprintable로 지정된다.

 

❓그렇다면 지금까지 다른 클래스들을 생성해오면서 Blueprintable을 선언하지 않아도 블루프린트 기반 클래스가 생성됐던 이유는 무엇일까?

그 이유는 AActor 클래스나 다른 클래스의 UCLASS에 Blueprintable 키워드가 적용되어있기 때문이다.  Blueprintable 은 상속된다!

728x90