1. 태그와 어트리뷰트 연결하기
위젯 컨트롤러에서 커스텀 파인드 함수로 태그에 맞는 정보를 가져오고 있다. 하지만 지금 방식은 문제가있다. 모든 어트리뷰트를 얻기 위해서는 상당히 많은 반복작업을 해야하고, 속성이 추가되면 같은 일을 또 반복해야 한다. 그렇기에 이를 고쳐보도록 하자.
게임플레이 태그와 어트리뷰트를 반환하는 델리게이트를 묶는 맵을 만들어서 이 맵을 가지고 쉽게 어트리뷰트를 얻을 수 있게 할 거싱다.
먼저 어트리뷰트 자체를 반환하는 델리게이트를 선언할 것이다. 정확히는 엑세서를 바인딩 하는 것이다.
AttributeSet 클래스로 들어가자. 델리게이트를 선언한다.
DECLARE_DELEGATE_RetVal(FGameplayAttribute, FAttributeSignature);
이 델리게이트를 게임플레이 태그와 매핑하는 맵을 만들 것이다.
TMap<FGameplayTag, FAttributeSignature> TagsToAttributes;
이제 이 키, 밸류 값을 할당해보자. 생성자에서 진행할 것이다.
UAuraAttributeSet::UAuraAttributeSet()
{
const FAuraGameplayTags& GameplayTags = FAuraGameplayTags::Get();
FAttributeSignature StrengthDelegate;
StrengthDelegate.BindStatic(GetStrengthAttribute);
TagsToAttributes.Add(GameplayTags.Attributes_Primary_Strength, StrengthDelegate);
}
비록 이렇게 하면 또 한번 추가하는 작업을 진행해야하지만 여기서 한번만 하면 이후에는 또 다른 작업이 필요가 없다.
바인딩이 다 끝나면 위젯 컨트롤러에서는 루프를 돌아 브로드캐스트를 하면된다.
void UAttributeWidgetController::BroadCastInitialValues()
{
UAuraAttributeSet* AS = CastChecked<UAuraAttributeSet>(AttributeSet);
check(AttributeInfo);
for (auto& Pair : AS->TagsToAttributes)
{
FAuraAttributeInfo Info = AttributeInfo->FindAttributeInfoForTag(Pair.Key);
Info.AttributeValue = Pair.Value.Execute().GetNumericValue(AS);
AttributeInfoDelegate.Broadcast(Info);
}
}
델리게이트를 실행시켜 어티리뷰트를 얻고 어트리뷰트 클래스에 존재하는 스태틱 멤버 함수를 통해 값을 받아온다. 스태틱 함수이기 때문에 어느 곳에서 정보를 가져올지에 대한 정보를 주기위해 객체를 넘겨야 한다.
2. 델리게이트 없이 연결하기
강의의 QnA를 보던 중 굳이 델리게이트를 사용하지 않아도 된다는 것을 보았다.
엑세서에서 Get 함수가 반환하는 값은 이미 FGameplayAttribute 타입이다. 그렇기 때문에 맵에 바로 함수를 실행시켜 값으 을 저장시키면 된다.
맵 타입을 바꾸고,
TMap<FGameplayTag, FGameplayAttribute> TagsToAttributes;
함수를 실행시키면 그 반환 값이 맵에 저장되게 된다.
TagsToAttributes.Add(GameplayTags.Attributes_Primary_Strength, GetStrengthAttribute());
TagsToAttributes.Add(GameplayTags.Attributes_Primary_Intelligence, GetIntelligenceAttribute());
그러면 이제 델리게이트를 사용하지 않기 때문에 위젯 컨트롤러에서도 실행 시킬 필요없이 바로 변수를 사용하면 된다.
Info.AttributeValue = Pair.Value.GetNumericValue(AS);
이보다 더 반복작업과 실수 가능성을 줄일 수 있는 방법도 존재한다. FAuraAttributeInfo 구조체에 게터를 설정하는 방법인데 이렇게 하면 에디터에서 변수를 바로 설정할 수 있어 반복 작업이 훨씬 줄어들게 된다.
어쨋든 그 방법 보다는 바로 Get 함수를 이용해서 하는 방법을 이용하도록 하자.
이 방법은 조금 반복작업을 강요한다. 어쨌든 한번하면 새로운 속성을 만들일은 없으니 이 작업을 마무리 하도록 하자.
이제 이 작업은 처음에 활성화 될때만 시행된다. 다음에는 값이 바뀌면 어떻게 해야할지를 알아보도록 하자.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 39. 어빌리티 부여하기 (0) | 2024.12.03 |
---|---|
[실습 2] 38. 어트리뷰트가 바뀌면 응답하기 (0) | 2024.12.02 |
[실습2] 36. 어트리뷰트 위젯 컨트롤러에서 브로드 캐스트 하기 (0) | 2024.12.02 |
[실습2] 35. 커스텀 블루프린트 라이브러리 만들기 (0) | 2024.12.02 |
[실습2] 34. 어트리뷰트 정보를 담은 데이터 에셋 만들기 (0) | 2024.12.02 |