본문 바로가기

프로젝트/H.W.H

Weapon & WeaponComponent

 

 

전체 코드

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