해결된 질문
작성
·
35
0
자꾸 UHakEquipmentInstance* FHakEquipmentList::AddEntry(TSubclassOf<UHakEquipmentDefinition> EquipmentDefinition)에서
UHakAbilitySystemComponent* ASC = GetAbilitySystemComponent();
check(ASC);
{
for (const TObjectPtr<UHakAbilitySet> AbilitySet : EquipmentCDO->AbilitySetsToGrant)
{
AbilitySet->GiveToAbilitySystem(ASC, &NewEntry.GrantedHandles, Result);
}
}
이쪽, GiveToAbilitySystem에서 ASC가 nullptr이라면서 터지길래 열받아서 ASC를 아래처럼 플레이어스테이트에서 직접 가져왔더니 문제가 해결되었습니다.
// 1. OwnerComponent의 소유자 (보통 Character일 것)
ACharacter* OwnerCharacter = Cast<ACharacter>(OwnerComponent->GetOwner());
// 2. Character의 PlayerState 가져오기
AHakPlayerState* HakPlayerState = Cast<AHakPlayerState>(OwnerCharacter->GetPlayerState());
// 3. PlayerState에서 ASC 가져오기
UHakAbilitySystemComponent* ASC = HakPlayerState->GetHakAbilitySystemComponent(); // 혹은 직접 변수 접근
문제는 아래 함수인 것 같은데.
UHakAbilitySystemComponent* FHakEquipmentList::GetAbilitySystemComponent() const
{
check(OwnerComponent);
AActor* OwningActor = OwnerComponent->GetOwner();
// GetAbilitySystemComponentFromActor를 잠시 확인해보자:
// - EquipmentManagerComponent는 AHakCharacter를 Owner로 가지고 있다
// - 해당 함수는 IAbilitySystemInterface를 통해 AbilitySystemComponent를 반환한다
// - 우리는 HakCharacter에 IAbilitySystemInterface를 상속받을 필요가 있다
return Cast<UHakAbilitySystemComponent>(UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(OwningActor));
}
이 코드가 제대로 작동 안 하고 null을 주는 것 같은데 왜 그런걸까요?
HakCharacter에서 제대로 IAbilitySystemInterface 구현했고, 강의 코드 제대로 따라갔다고 생각하는데...
답변 1
0
이런 경우는 간단해서 3가지로 나눠서 디버깅 해보면 됩니다.
1. OwingActor 변수에 nullptr 여부
2. Cast 여부
3. GetAbilitySystemComponentFromActor 여부
감사합니다 해보겠습니다