Unreal Engine, Item Fragment Template 코드 분석

이전 시간에 코드를 성공적으로 작성하였다면 다음과 같은 파일들이 있을 것이다.

Lyra 코드 구조와 유사하다.

Project
└─Source
  └─LyraGame
    ├─Data
    │  ├─D1ItemData.cpp (+)
    │  └─D1ItemData.h (+)
    ├─System
    │  ├─D1GameplayTagStack.cpp (+)
    │  └─D1GameplayTagStack.h (+)
    └─Item
      ├─Fragments (+)
      │  ├─D1ItemFragment_Equipable.cpp (+)
      │  ├─D1ItemFragment_Equipable.h (+)
      │  ├─D1ItemFragment_Equipable_Armor.cpp (+)
      │  ├─D1ItemFragment_Equipable_Armor.h (+)
      │  ├─D1ItemFragment_Equipable_Attachment.cpp (+)
      │  ├─D1ItemFragment_Equipable_Attachment.h (+)
      │  ├─D1ItemFragment_Equipable_Utility.cpp (+)
      │  ├─D1ItemFragment_Equipable_Utility.h (+)
      │  ├─D1ItemFragment_Equipable_Weapon.cpp (+)
      │  └─D1ItemFragment_Equipable_Weapon.h (+)
      ├─Managers
      ├─D1ItemInstance.cpp (+)
      ├─D1ItemInstance.h (+)
      ├─D1ItemTemplate.cpp (+)
      └─D1ItemTemplate.h (+)

D1ItemInstance

class UD1ItemInstance : public UObject, public ILyraAbilitySourceInterface
인스턴스는 메모리상에 미리 생성하는 코드이다. 언리얼 엔진에서 관리할 수 있도록 public UObject 으로부터 상속받아 사용한 모습을 볼 수 있다.
UObject 클래스를 사용해 객체를 만들면 언리얼 엔진에서 가비지 컬렉션으로 자동으로 메모리를 관리하도록 해준다.


UObject 클래스를 사용하지 않고 다른 메모리 관리 방법에는 New Delete ,Shared Pointer, T-Shared Pointer 등이 있다.

인벤토리에 넣거나 아이템 장착 코드 작성 후에 알아보도록 한다.


D1ItemTemplate

언리얼 편집기에서 데이터를 생성할 때 해당 항목들을 선택할 수 있고, 잘못된 데이터를 넣지 못하도록 예외코드도 함께 포함되어있다. (예: SlotCount 1보다 낮게 입력할 수 없음)

블루프린트 ItemTemplate 데이터 구조

  • Slot Count: 아이템의 인벤토리 x, y크기
  • Max Stack Count: 아이템 갯수
  • Display Name: 아이템 표기 이름
  • Description: 아이템의 설명
  • Icon Texture: 아이템 에셋 인벤토리 아이콘
  • Pickupable Mesh: 아이템 에셋 바닥 메쉬
  • Fragments: 아이템 구분 (예: 방어구, 무기, 소모품)
    • 코드에서는 3개만 가져오도록 하고 있음

Fragments 객체 알아보기

class UD1ItemFragment : public UObject
해당 Fragments 클래스는 UD1ItemFragment 이름으로 사용하고 있다.
UD1ItemFragment 클래스는 OnIsInstanceCreated 가상함수 하나를 사용하고 있다.

이제 D1ItemFragment_Equipable 코드에서 UD1ItemFragment 상속 받아 아이템 부위 코드를 작성한 모습을 볼 수 있다.


D1ItemFragment_Equipable

UCLASS(Abstract, Const)
class UD1ItemFragment_Equipable : public UD1ItemFragment

UD1ItemFragment_Equipable 클래스는 Abstract 힌트를 사용하는 모습을 볼 수 있다. 이 클래스는 Base 용도로 사용하며 단독으로 혼자 월드에 생성할 수 없지만, 자기 자식인 Armor, Weapon, Utility 클래스로는 월드에 생성할 수 있다.

그리고 멤버변수를 알아보도록 한다.
해당 멤버 변수로 Armor, Weapon, Utility 공통으로 사용하도록 하고있다.

  • 멤버변수 EqipmentType: 해당 클래스를 상속하는 *.Armor, *.Weapon, *.Utility 클래스로 선택하도록 한다.
  • 멤버변수 BaseAbilitySet : 스킬을 사용할 수 있도록 한다.
  • 멤버변수 EqipableClassFlags: 비트 마스크로 사용 가능한 직업을 선택한다.
public:
	EEquipmentType EquipmentType = EEquipmentType::Count;
	
	UPROPERTY(EditDefaultsOnly, meta=(Bitmask, BitmaskEnum="ECharacterClassType"))
	uint32 EquipableClassFlags = ((1 << (uint32)ECharacterClassType::Count) - 1);
	
	UPROPERTY(EditDefaultsOnly)
	TObjectPtr<const ULyraAbilitySet> BaseAbilitySet;

Todo

다음으로 인스턴스나 데이터를 입력하는 작업을 진행할 것이다.
이러한 Fragment 방식은 언리얼 엔진에서 권장하는 Lyra 샘플에서 제공하는 방식이고, 데이터를 입력하는 부분은 블루프린트 편집기에서 수작업으로 해주어야 한다. 아이템 고유 수치 같은 밸런스도 여기서 추가할 수 있다.