내일배움캠프-언리얼

TIL - 100

이시보 2026. 7. 7. 21:13

Manager_Interactor "Accessed None: OwnerController" 크래시

원인

  • OwnerController비복제 + 컴포넌트 BeginPlay에서만 캐싱됨.
  • 서버→클라 RPC Client_Update_PointOfInterests가 그 BeginPlay보다 먼저 도착하면 None을 읽어 크래시 → 초기화 순서 레이스(코옵/조인·레벨 시작 시).
  • 플러그인 버그 아님. 컴포넌트 위치·설정은 정상.

수정 (플러그인 미변경)

프로젝트 PC ARetrievePlayerControllerPostInitializeComponents(BeginPlay/RPC보다 먼저 실행)에서 리플렉션으로 OwnerController를 미리 세팅해 레이스 창 제거.

RetrievePlayerController.h

virtual void PostInitializeComponents() override;

RetrievePlayerController.cpp (익명 namespace 헬퍼 + 오버라이드)

void PrimeInteractorOwnerController(APlayerController* PC)
{
    if (!PC) return;
    TInlineComponentArray<UActorComponent*> Components(PC);
    for (UActorComponent* Comp : Components)
    {
        if (!Comp || !Comp->GetClass()->GetName().Contains(TEXT("Manager_Interactor"))) continue;
        if (FObjectProperty* OwnerProp =
            FindFProperty<FObjectProperty>(Comp->GetClass(), TEXT("OwnerController")))
        {
            OwnerProp->SetObjectPropertyValue_InContainer(Comp, PC);
        }
        break;
    }
}

void ARetrievePlayerController::PostInitializeComponents()
{
    Super::PostInitializeComponents();
    PrimeInteractorOwnerController(this); // OwnerController 선캐싱
}

'내일배움캠프-언리얼' 카테고리의 다른 글

TIL - 101  (0) 2026.07.08
TIL - 99  (0) 2026.07.06
TIL - 98  (0) 2026.07.02
TIL - 97  (0) 2026.07.01
TIL - 96  (0) 2026.06.30