WeaponSystem in Lyra

Jangmanbo·2025년 7월 28일
post-thumbnail

CoreRedirect

UENUM, USTRCUT, UCLASS 등을 리맵핑
이름 변경할 때 주로 사용했다..
DefaultEngine.ini에 작성하면 된다
강의에서는 LyraAnimInstance 대신 HakAnimInstance 사용하려고 씀

참고: 언리얼 엔진의 코어 리디렉트 | 언리얼 엔진 5.6 문서 | Epic Developer Community

WeaponSystem

LyraEquipmentInstance

  • 장착 아이템들이 상속받을 클래스

LyraWeaponInstance

  • LyraEquipmentInstance을 상속

LyraRangedWeaponInstance

  • LyraWeaponInstance을 상속
  • 사거리가 있는 무기

FLyraAnimLayerselectionSet, FLyraAnimLayerselectionEntry

앞서 Cosmetic에서 봤던 FLyraAnimBodyStyleSelectionSet, FLyraAnimBodyStyleSelectionEntry과 유사

B_Weapon

  • root가 스켈레탈메시인 액터

B_WeaponInstance_Base

  • LyraRangedWeaponInstance 상속

B_Pistol

  • B_Weapon 상속받아서 메시 적용한거

B_WeaponInstance_Pistol

  • B_WeaponInstance_Base 상속

  • B_WeaponInstance_Pistol를 장착하면 ABP_PistolAnimLayers_Feminine이 장착될 것

어떻게 장착되는지는 인벤토리에서 설명~


Inventory

LyraInventoryItemFragment

  • 아이템의 특성 (소비, 장착, ..)
  • Item을 상속받는 UsableItem, WeaponItem 등의 자식클래스를 만들다보면 끝도 없어서 라이라에서는 ItemDefinition에 Fragment를 부착해서 여러 특성을 부여하는 시스템을 만들었다

LyraInventoryItemDefinition

Instanced.. 추후 설명

LyraInventoryItemInstance

  • ItemDefinition만 들고 있다
  • LyraInventoryItemDefinition의 Fragment를 ItemInstance를 통해 가져올 수 있다

LyraInventoryManagerComponent

정리하면 LyraInventoryManagerComponent은 ULyraInventoryItemInstance리스트를 들고 있다

LyraEquipmentDefinition

  • 장착 아이템 액터, 액터 스폰정보 등을 갖고 있다
  • LyraEquipmentActorToSpawn 리스트인 이유는 한벌옷(갑옷, 장갑 등등 모두 착용) 같은 경우 때문

LyraEquipmentInstance

  • 장착 아이템을 관리하는 클래스
  • 일반적으로 생각하는 인스턴스와 약간 다르다

LyraEquipmentManagerComponent

LyraQuickBarComponent

퀵바가 뭔가 했는데 퀵슬롯이네


GameFeatureData인 ShooterCore에서 코스메틱시스템에서와 마찬가지로 AddComponent 액션으로
1. LyraPlayerController에 LyraInventoryManagerComponent 부착
2. LyraCharacter에 LyraEquipmentManagerComponent 부착

ExperienceActionSet 만들어서 또 AddComponent로 컨트롤러에 B_QuickBarComponent 부착
퀵바는 Experience에 따라 안붙이고 싶기도 하고 그런가보다

B_QuickBarComponent

LyraQuickBarComponent 상속


아이템 장착

UASyncAction_ExperienceReady

Experience가 로드됐는지를 확인하는 클래스
BlueprintAsyncActionBase를 상속

  • BlueprintAsyncActionBase: 비동기로 액션 수행하는 클래스

UASyncAction_ExperienceReady::Active

GameState가 있는지 확인, 있으면 step2 아니면 GameState가 로드됐을 때 step 1로
step1에서 step2 호출한다.

step 2: Experience가 로드되었는지 확인, 되었으면 step4. 아니면 로드됐을 때 step3으로
step3에서 step4 호출
주석이 많은데.. 정리하자면 아이템을 장착하면 메시의 AnimLayer를 변경하니까, 메시가 없는 상태에서는 아이템을 장착할 수 없게 해야 한다
Experience가 로드되는 시점은 메시가 없는 상태이기 때문에 최소 한 틱 뒤로 미뤄줘야 한다는 듯

step4: 바인드했던 함수 호출하고 destroy

UASyncAction_ExperienceReady을 사용하려면.. BP에서 WaitForExpeiennceReady를 호출해서 World에 이 액션을 등록해야 한다

이렇게 UASyncAction_ExperienceReady를 등록했기 때문에 Possess의 다음 틱에 AddInitialInvnetory가 호출된다

AddInitialInvnetory

InventoryManagerComponent에서는 InventoryList에 ItemDefinition을 추가하기만 한다
InventoryList에서는 ItemDefinition으로 ItemInstnace를 생성한다

InitialInventoryItems: 미리 만들어둔 ItemDefinition 리스트
여기서는 ID_Pistol을 추가해둠

ID_Pistol
EquippableItem을 Fragment로 해서 WID_Pistol을 연결한다

WID_Pistol
LyraEquipmentDefinition

InventoryManagerComponent에서는 InventoryList에 ItemDefinition을 추가하기만 한다
(>InventoryList에서 ItemDefinition으로 ItemInstnace를 생성한다)

QuickbarComponent에 InventoryList에서 생성한 ItemInstance를 추가한다

ULyraQuickbarComponent::SetActiveSlotIndex: 기존에 장착하고 있던 걸 해제하고, 새롭게 활성화할 인덱스의 아이템을 장착. 이때 해제/장착은 EquipmentManagerComponent를 통해 한다

LyraEquipmentManagerComponent에서 아이템 장착/해제
EquipmentInstnace를 EquipmentList에 추가/삭제하면서 EquiopmentInstnace에서 OnEquipped/OnUnequipped를 호출하고 있다


장착 해제


장착

여기까지하면 캐릭터에 아이템 장착까지는 완료


애니메이션 적용

B_WeaponInstance_Base

  • DetermineCosmeticTags: 현재 메시에 설정되어있는 태그들 리턴
    LyraEquipmentInstnace
  • PickBestAnimLayer: 장착, 해제 2가지 AnimLayerSelectionSet이 있다. 장착/해제에 따라 각 AnimLayerSelectionSet>AnimLayerRule>RequiredTags가 모두 DetermineCosmeticTags에 있는 AnimLayerRule 리턴
    => B_WeaponInstance_Base에서는 DefaultLayer인 ABP_PistolAnimLayers_Feminine을 리턴
    LinkAnimClassLayer: AnimLayer 교체

B_Hero_ShooterMannequin에서 AnimClass를 설정해주면 Pistol에 애니메이션이 적용된다

캐릭터에도 애니메이션을 적용하려면 B_Manny에도 AnimClass를 설정한다

여기서 ABP_Mannequin_CopyPose는 부모의 메시를 그대로 가져와서 적용한다
즉 Pistol과 B_Manny 모두 B_Hero_ShooterMannequin의 스켈레탈 메시인 SKM_Manny_Invisible을 따라 애니메이션이 적용된다는 것이다

0개의 댓글