FGameplayTagCountContainer::Reset() 호출 후 GetExplicitTagCount() 값이 0이 아닌 문제

안녕하세요. FGameplayTagCountContainer::Reset() 호출 후 태그 카운트가 의도와 다르게 구해지는 부분이 있어 문의드립니다.

<br/>

UE_DEFINE_GAMEPLAY_TAG_STATIC(TAG_My_Test, "My.Test");

namespace
{
	void TestTagCount()
	{
		FGameplayTag Tag = TAG_My_Test;
		FGameplayTagCountContainer Container;

		Container.UpdateTagCount(Tag, 1, EGameplayTagReplicationState::None);
		UE_LOG(LogTemp, Log, TEXT("Tag Count: %d"), Container.GetExplicitTagCount(Tag)); // prints 1

		// reset container and update tag once more
		Container.Reset();
		Container.UpdateTagCount(Tag, 1, EGameplayTagReplicationState::None);

		UE_LOG(LogTemp, Log, TEXT("Tag Count: %d"), Container.GetExplicitTagCount(Tag)); // expected to print 1 but prints 2
	}
}

위와 같은 코드를 추가하고 TestTagCount() 를 호출했을 때 두 번째 GetExplicitTagCount() 에서 1이 아닌 2가 구해지고 있는데요,

<br/>

void FGameplayTagCountContainer::Reset(bool bResetCallbacks)
{
        GameplayTagCountMap.Reset();

        if (bResetCallbacks)
        {
               GameplayTagEventMap.Reset();
               OnAnyTagChangeDelegate.Clear();
        }
}

inline int32 GetExplicitTagCount(const FGameplayTag& Tag) const
{
        const int32 Idx  = Items.Find(Tag);
        if (Idx != INDEX_NONE)
        {
               return Items[Idx].Count;
        }

        return 0;
}

Reset() 에서 Items 은 초기화하지 않아 Reset() 을 해도 Items 의 카운트는 쌓이고 있어서

Items 를 이용하는 GetExplicitTagCount() 등의 로직에서는 의도하지 않은 카운트가 구해지는 것으로 보입니다.

<br/>

Reset() 이 Items 나 ExplicitTags 는 초기화 하지 않는 것이 의도된 동작이 맞을지,

그렇다면 FGameplayTagCountContainer 를 초기화하려면 어떤 방법을 쓰는게 설계 의도에 맞을지 안내해주시면 감사하겠습니다.

[Attachment Removed]

안녕하세요.

질문해주신 내용을 토대로 확인 후 답변드리겠습니다.

감사합니다.

[Attachment Removed]

안녕하세요.

전달해 주신 내용을 바탕으로 재현 조건을 구성하고 테스트를 진행하였으며, 동일한 현상을 확인할 수 있었습니다.

해당 문제는 UE 5.7에서 태그 카운트 저장 구조가

기존 ExplicitTagCountMap에서 Items로 변경하면서 생긴 태그 상태 초기화 누락 문제로 판단되어 버그 리포트를 내부에 제출하였고, 이에 대한 버그 트래커가 등록되었습니다.

아래 링크에서 해당 이슈를 확인하실 수 있습니다.

https://issues.unrealengine.com/issue/UE-389901

제보해주셔서 감사합니다.

[Attachment Removed]

안녕하세요.

해당 현상이 버그였군요. 확인 감사합니다.​

Reset() 호출 대신 FGameplayTagCountContainer 를 재할당하여 초기화 하는 등의 우회 방법을 사용해보도록 하겠습니다.

​

감사합니다!

[Attachment Removed]