본문 바로가기

Unreal

[Unreal] Lyra 프로젝트 분석 - 08. Weapon System

EquipmentInstance

장착한 무기에 따라 애니메이션의 변경을 적용

 

AnimLayerSelectionSet

AnimBodyStyleSelectionSet과 마찬가지로 태그에 맞춰 AnimBodyStyleSelectionEntry를 가져옴

AnimBodyStyleSelectionEntry는  AnimInstance와 Tag로 이루어져 있다. 

그래서 태그에 맞는 애니메이션을 선택한다.

 

EquipmentInstance->WeaponInstance->RangedWeaponInstance(상속관계)

WeaponInstance에서 AnimLayerSelectionSet 타입의 EquippedAnimSet과 UnEquippedAnimSet을 가지고

무장과 비무장 간 애니메이션을 선택한다. 

 

 

InventoryItemFragment

아이템에게 붙이는 컴포넌트 같은 것이다. 아이템의 특정 fragment를 붙여 속성을 추가하는 것이라고 볼 수 있다.

클래스 지정자로 DefaultToInstanced, EditInlineNew를 붙여줘야 한다. ItemFragment는 지금까지와 달리 인스턴스가 구현되어있지 않고 두 지정자를 쓰면 에디터 상에서 추가하는 것만으로 인스턴스가 만들어지기 때문이다. 

 

ItemDefinition

DisplayName과 Fragment들을 배열로 가진다.

 

InventoryItemInstance

메타데이터인 ItemDefinition을 들고 있다. 

 

InventoryManagerComponent - PlayerController의 Component로 붙임

>InventoryList>InventoryEntry>InventoryItemInstance 순으로 포함관계이다.

 

EquipmentDefinition

EquipmentInstance를 가지는데 다른 Instance클래스들과 달리 인스턴스가 아니라 관리하는 방식을 의미한다.

EquipmentActorToSpawn은 스폰할 액터의 메타 데이터, 소켓 , 트랜스폼을 가진다. (무기 위치 조정)

 

EquipmentInstance

어떤 InventoryItemInstance에 의해 활성되었는지 Instigator와 Spawn된 Actor Instance들을 들고 있다.

 

EquipmentManagerComponent

>EquipmentList>AppliedEquipmentEntry>EquipmentDefinition>EquipmentInstance

 

QuickBarComponent

게임에서 장착한 무기를 나타내는 슬롯과 같은 역할

Inventory와 Equipment의 중간다리 역할 

InventoryItemInstance는 보유한 아이템들 EquipmentoryItemInstance는 장착한 아이템 캐싱

 

 

 

Async_ExperienceReady

Item을 장착할 때 애니메이션 레이어가 결정되기 때문에 그 전에 Mesh를 장착해야 한다.

아이템 장착은 Possess때 하는데 그 때 Mesh가 장착되기 전이므로 Wait For Experience Ready 함수를

이용해 Mesh 장착을 기다린다. Async_ExperienceReady[심화 강의] 참조

 

 

 

장착 로직

플레이어 블루프린트에서 Add Initial Inventory함수에서 InventoryManager의 Add Item Definition을 한다. 이 때 InventoryList에 AddEntry하는데 ItemDefinition을 ItemInstance로 저장한다. (Instance가 Fragment 를 가져올 수 있어서)

그리고 QuickBarComponent의 AddItemToSlot 하는데 슬롯에 InventoryItemInstance를 저장한다. 장착을 완료하기 위해

슬롯을 활성화해야 한다. SetActiveSlotIndex에서 UnequipItemInSlot하고 NewIndex로 ActiveSlotIndex를 설정한 후 

다시 EquipItemInSlot로 장착 및 업데이트를 진행한다. 

 

EquipItemInSlot

슬롯의 InventoryItemInstance에서 FindFragmentByClass로 Fragment_EquippableItem->EquipmentDefinition을 가져온다. 가져온 Definition을 Manager에서 장착하면 Inventory처럼 EquipmentList의 AddEntry하는데 EquipmentInstance를

AppliedEquipmentEntry에 저장한다. 마지막으로 인 EquipmentInstance에서 액터를 스폰한다.

 

 

 

애니메이션 적용

EquipmentInstance에서 장착되었을 때 On Equipped 블루프린트 함수를 실행한다. 애니메이션 적용 로직은 블루프린트에서 진행한다. EquipmentInstance(WeaponInstance)에서 PickBestLayer로 태그에 맞는 AnimInstance를 선택하고 

Link Anim Class Layer로 애니메이션을 변경한다.