추첨대기횟수(PoolQueue)가 초기화되는 현상UNSAugmentSelectionComponent (PlayerController에 붙음)
├── PoolQueue : 대기 중인 추첨 풀 태그 목록 (서버 전용)
├── PendingCount : PoolQueue.Num() 복제값 (클라이언트 UI 뱃지용)
└── OnPendingCountChanged : UI 갱신 델리게이트
Reset(), Server_Choose, SetPendingCount, CopyRunStateFrom, 생성자에 순차적으로 로그 추가
| 로그 | 결과 |
|---|---|
[AugmentSelection::Reset] | 미호출 |
[Server_Choose] | 미호출 |
[SetPendingCount] 0으로 변경됨 | 미호출 |
[AugmentSelectionComponent::Constructor] | 스테이지 전환 직후 호출됨 |
EnqueueOffer와 PostSeamlessTravel에 this포인터 로그 추가[EnqueueOffer] this=000002C9E94F4F80 PoolQueue=4 ← 스테이지1
[Constructor] this=000002C9E94F3D80 ← 전환 직후 새 컴포넌트 생성
[PostSeamlessTravel] comp=000002C9E94F3D80 PendingCount=0 ← 새 컴포넌트라서 0
엔진소스를 뜯어서 GameModeBase와 GameMode를 보았다.
AGameMode::HandleSeamlessTravelPlayer의 경우
if (PC && PC->GetClass() != PCClassToSpawn)
{
// 클래스가 다를 때만 새 PC spawn
PC->SeamlessTravelTo(NewPC);
}
else
{
// 클래스가 같으면 PC 객체 그대로 유지 ← 데이터 보존
}
클래스가 다를때만 새 PC를 스폰하고 같으면 유지하는 코드가 존재한다.
AGameModeBase::HandleSeamlessTravelPlayer의 경우
// 무조건 새 PC spawn — 클래스 비교 없음
APlayerController* NewPC = SpawnPlayerControllerCommon(...);
PC->SeamlessTravelTo(NewPC); // ← 이전 PC에서 수동 이관해야 함
PC비교가없고 NewPC로 덮어씌움 결국 수동으로 데이터를 이관해주어야 한다
NeoSanctum의 경우 게임모드가 AGameModeBase를 상속받기 때문에 두가지 해결방안을 냈다.
AugmentSelectionComponent는 기존에 PlayerController에 장착되어있다. 결국에는 조작과 관련된 기능들이 있어서 PC에 ActorComponent로 달게 되었었고, SeamlessTravel시 해당문제는 단지 PC는 무조건 끝까지 살아있는 구조로 알고있었어서 이렇게 짠것도 있다. 이쪽 방안이 조금 더 깔끔한 구조라고 생각이 된다.
기존 PC에 달아놓는 방식에서 SeamlessTravelTo함수를 오버라이드하여 PC에서 복제하는 함수를 하나 만들고 새로운 PC가 생겼을때 데이터를 복제해주는 식으로도 짤 수 있다. 이쪽의 장점은 구현이 간단하고, 현재 다른 기능들은 정상작동하는데 굳이 PC에서 PlayerState로 옮겨야 하는 생각이 있었다. 그래서 결론적으로 이쪽으로 구현하게 되었다.
위에서 작성한것처럼 우선 잘 작동하는데 굳이 건드렸다가 다른 버그가 터질수도 있다고 생각하여 PC에 두는 구조를 계속 이어가기로 하였다.
기존구조에서는 npc에서 위젯을 띄워주는 역할을하고 있었는데 프로젝트 구조상 PC에서 UI를 모두 관리하고 있는 구조였다. 그래서 잠재적인 버그 (PC쪽 UI와 겹쳐서 버그발생)을 미연에 방지하기 위해서 PC쪽으로 옮기기로 하였다.
NPO의 OnInteract함수에서 CreateWidget -> Widget->OpenForInteractor()로 NPC가 위젯 타입을 직접 알고 생성
NPC의 GetInteractionWidgetClass -> Type별 WidgetClass 반환, PlayerController에서 OpenInteractionWidget(NPC) -> CreateWidget -> OpenForInteractor
PC는 UNSNPCInteractionWidgetBase 타입만 알고, 실제로 UNSPetUpgradeWidget인지 UNSPartEquipWidget인지는 모름
위젯 클래스는 NPC에서 받아오고 열고닫는건 베이스 타입의 가상함수로 처리
덕분에 PC는 ActiveInteractionWidget하나로 어떤 NPC위젯이든 관리할 수 있다.
으로 정리를 했는데....
우선 언리얼 공식문서를 보면 Traveling Actor 목록에서 PC객체 자체가 들어있다고 한다. 근데 이게 AGameModeBase를 상속받냐 AGameMode를 상속받냐에 따라 다른데
왜 다른가 하면 둘의 HandleSeamlessTravelPlayer()의 구조가 조금 다르다.
위젯이 뷰포트에 추가되는 순간 호출
생성자와의 차이점은
인런재화는 아웃런에 안들어감
인런에서 먹은 파츠 강화
증강 리롤
파츠 구매
공용 스킬
드론