나만의 작은 도서관

[TIL][C++] 250909 MMO 서버 개발 97일차: [언리얼] 레벨을 전환하면 BP의 인스턴스 데이터는 사라진다. 본문

Today I Learn

[TIL][C++] 250909 MMO 서버 개발 97일차: [언리얼] 레벨을 전환하면 BP의 인스턴스 데이터는 사라진다.

pledge24 2025. 9. 9. 20:55
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

[언리얼] 레벨을 전환하면 BP의 인스턴스 데이터는 사라진다.

  • 현재 레벨에서 스폰된 모든 액터는 기본적으로 현재 레벨에 종속되기 때문에 레벨이 언로드 될 때 모든 액터는 파괴된다.

 

액터의 생명주기 정리

  • 액터는 UWorld 내부에서 특정 ULevel에 소속된다.
  • 레벨 언로드 시 해당 레벨에 속한 모든 액터는 Destroy() 되어 메모리가 해제된다.
  • 따라서 레벨 전환(현재 레벨 언로드 → 다음 레벨 로드)이 일어나면 현재 레벨의 액터들은 “예외 없이” 파괴된다. 즉, “레벨 언로드 = 레벨 소속 액터 전부 소멸”이 기본 원칙이다.

 

액터 인스턴스를 레벨 이동 시에 보존할 수는 없을까?

  • 예외적으로 보존할 수 있는 경우가 있긴하다. KeepActors와 같은 특수한 전환 방식(Seamless Travel 등)을 사용하면 지정한 액터를 다음 맵으로 넘겨 사용할 수 있다.
  • 하지만 기본적으로 이전 레벨에 있는 액터 인스턴스는 저장할 수 없다. 액터는 반드시 월드에 소속되어야 하며, 월드가 파괴되면(이전 레벨이 언로드 되면) 그 액터를 살릴 수 있는 방법은 없다.

 

이 사실이 지금 문제가 되는 이유

  • 지금까지 C++에서 할 수 있는건 블루프린트에서 할 수 있고, 블루프린트에서 할 수 있는 건 C++에서도 할 수 있다는 생각을 중심으로 C++에서 건드리기 귀찮은 애들은 전부 블루프린트로 넘겨서 작업했다. 그래서 로직에 관련된 부분도 블루프린트에 많이 구현되어 있었는데, “레벨 전환 시 블루프린트에 저장된 정보가 사라진다”는 사실 때문에 블루프린트에 정의한 변수의 정보가 날아가는 문제가 생겼다.
  • 로직을 돌리기위해 잠깐 쓰는 변수는 블루프린트에서 정의해도 문제가 발생하지 않지만 레벨 전환 시에도 유지되어야 하는 변수의 경우 블루프린트에서 정의하면 안 되었던 것이다.

 

슬롯의 쿨타임을 어떻게 관리할 것인가?

  • 결국 슬롯의 쿨타임 데이터를 관리하는 것이 블루프린트에서 했기 때문에 위 문제에 대해 고민하게 된 것이다. 레벨을 이동해도 스킬이나 아이템의 쿨타임을 그대로 남아있어야 했다. 그래서 결론적으로는 “최소한 쿨타임 변수는 C++ 멤버 변수”로 존재해야 했지.