전체 코드
WeaponComponent
public https://github.com/LCU97/Cat/blob/main/Source/HumanAndCat/Public/Components/WeaponComponent.h
private https://github.com/LCU97/Cat/blob/main/Source/HumanAndCat/Private/Components/WeaponComponent.cpp
경험과 결과
주요 클래스 및 함수 설명
1. 경험과 결과
장착하는 Weapon 마다 사용할 수 있는 State 와 Ability 에 차이를 두고 싶었다. 처음에는 Weapon 마다 State 와 Ability 를 가지고 있는 DataAsset 을 변수로 가지고 있게 할 생각이었다. 근데 이렇게 되니 Weapon 자체가 State 나 Ability 랑 종속성이 생기는 것 같았다. 최소한 Weapon 자체가 State 나 Ability 와 관련한 변수나 함수는 없게 만들고 싶었다.
WeaponComponent : 그래서 생각한게 WeaponComponent 였다 이 컴포넌트를 붙이면 장착한 무기의 GameplayTag 를 확인하여 WeaponComponent 가 들고 있는 DataAsset 들 중에 장착 무기의 DataAsset 을 가져와서 State 와 Ability 를 초기화 하게 만들었다.
사실 Weapon 이 State 와 종속성이 해결된 느낌이라기보다는 그냥 Component 하나 만들어서 중간다리 역할 추가한게 전부지만 그래도 Weapon 자체가 State 와는 관련이 없도록 만들었다는데 의미를 두었다.
2. 주요 클래스 및 함수 설명
Weapon Class :
특징 1)
Weapon 클래스는 캐릭터의 Mesh 에 부착할 Socket 이름을 가지고 있게 만들었다.
그 외에는 공격과 관련한 변수들이다.
WeaponComponent :
특징 1 )
Equip & UnEquip 함수 : Weapon 이 가지는 SocketName 로 Skeletal Mesh 의 특정 Socket 을 찾아 Attach
특징 2)
RegisterStateAndAbility : 장착한 무기에 맞는 DataAsset 을 가져와서 State & Ability 를 초기화
UnRegisterStateAndAbility : 장착한 무기를 파괴하고 BasicWeapon 을 다시 장착
// 함수가 스크린샷 안에 전부 들어오지 않아서 부득이하게 코드블럭으로 대체
void UWeaponComponent::RegisterStateAndAbility(ABaseWeapon* CheckingWeaponType)
{
if(!CheckingWeaponType) return;
if(WeaponTypes.IsEmpty()) return;
for(auto WeaponType : WeaponTypes)
{
// TMap 의 Tag 와 현재 무기를 비교해서 현재 무기에 따른 DA 를 가져와 State Ability 를 초기화합니다.
if(WeaponType.Key == CheckingWeaponType->WeaponTag)
{
CheckingWeaponType->SetWeaponManager(this);
if(IsValid(CurrentWeapon))
{
CurrentWeaponTag = FGameplayTag();
CurrentWeaponType = nullptr;
CurrentWeaponName = EWeaponName::None;
CurrentWeapon->Destroy();
CurrentWeaponLength = 0.f;
}
// 바뀔 현재 무기 타입을 재설정합니다.
CurrentWeapon = CheckingWeaponType;
CurrentWeaponTag = CheckingWeaponType->WeaponTag;
CurrentWeaponType = WeaponType.Value;
CurrentWeaponName = CurrentWeaponType->WeaponName;
CurrentWeaponLength = CheckingWeaponType->TraceLength;
// 상태 업데이트 및 Idle 상태로 시작
UpdateStates();
UpdateAbilities();
AActor* ActorOwner = GetOwner();
if(ActorOwner)
{
ACharacter* CharacterOwner = Cast<ACharacter>(ActorOwner);
if(CharacterOwner)
{
UAnimInstance* OwnerAnim = CharacterOwner->GetMesh()->GetAnimInstance();
if(OwnerAnim)
{
UHumanAnimInstance* HumanAnimInstance = Cast<UHumanAnimInstance>(OwnerAnim);
if(HumanAnimInstance)
{
HumanAnimInstance->OnNewWeaponNameChanged.Broadcast(CurrentWeaponName);
}
}
}
}
// 현재 무기가 손에 들고 있는지 기본 모드인지에 따라 Equip, UnEquip 을 실행합니다.
if(bEquip)
{
Equip();
}
else
{
UnEquip();
}
return;
}
}
}
특징 3)
UpdateStates : 실제 StateObject 들을 초기화
UpdateAbilities : 실제 AbilityObject 들을 초기화
'프로젝트 > H.W.H' 카테고리의 다른 글
SkillActor & Weapon (0) | 2024.10.17 |
---|---|
Targeting & Camera (2) | 2024.10.16 |
InputSystem 을 활용한 다양한 행동 처리 (0) | 2024.10.16 |
FSM - 상태 패턴과 (State & Ability) (0) | 2024.10.15 |