10.13 - TIL

김혁·2025년 10월 13일

TIL

목록 보기
33/84

오늘의 코드카타

오늘의 공부

Seamless Travel

  • 일반적인 Non-Seamless Travel
    • 클라이언트가 현재 서버와의 연결을 잠시 끊었다가 새로운 맵이 로드된 후 같은 서버에 다시 연결
    • 이 과정에서 연결 끊김, 재연결 시간 지연, 최대 인원 초과로 인한 재접속 불가 등의 문제 발생 가능
  • Seamless Travel
    • 플레이어의 연결이 유지된 상태로 맵을 이동
    • 재연결 관련 문제를 방지할 수 있음
  • 사용법
    • 프로젝트 설정에서 Transition Map을 지정
      • 이 전환 맵은 최종 맵 로딩 중에 잠시 표시되는 작은 레벨
      • 로딩 오버헤드를 줄여줌
    • AGameModeBase::bUseSeamlessTravel을 true로 설정
  • 기본적으로 유지되는 액터
    • GameMode 액터 (서버 전용)
    • PlayerController 액터 (서버와 클라이언트)
    • 하지만, 이동하는 레벨의 GameMode, PlayerController가 다를 경우에는 새로운 액터로 대체가 됨
    • PlayerState는 액터 인스턴스 자체가 지속되는 방식이 아니고, CopyProperties() 함수를 통해 복사할 변수를 지정해서 필요한 변수의 경우 데이터를 복사할 수 있다.

프로젝트에서의 Seamless Travel

  • 프로젝트에서 Seamless Travel 사용한 이유
    • 시퀀스 재생을 위해 레벨을 전환하고자 했는데, Non-Seamless Travel은 PlayerControllerPlayerState가 재생성되서 레벨 전환 시에 플레이어마다 승자/패자 여부를 확인할 수가 없었음
    • GameInstanceAPlayerState::PlayerId와 함께 승패 여부를 저장해서 시퀀스 레벨에서 활용하고자 했고, 레벨 전환이 일어나도 PlayerState의 데이터가 유지되길 원해서 Seamless Travel을 사용하고자 함
  • 문제 발생
    • Seamless Travel을 통해 시퀀스 레벨로 전환
    • 시퀀스 레벨의 AGameMode::BeginPlay()에서 기존의 PlayerController를 통해 시퀀스를 재생
    • 시퀀스 재생이 정상적으로 동작하지 않음
  • 문제 원인 추측
    • Seamless Travel을 진행할 시에 정상적으로 PlayerController가 유지되지 않음
      • 공식문서에는 액터 인스턴스가 유지가 된다고 나와있음
      • AGameMode::BeginPlay() 부분이 아니라 몇 초 후에 재생 시에는 정상적으로 동작됨
    • PlayerController의 객체 인스턴스는 이전 레벨과 동일하나 새로운 월드에 등록하는 과정에서 기존의 시퀀스 재생 로직이 무시가 됨
      • Seamless Travel은 비동기적으로 진행되기 때문에, PlayerController 인스턴스는 유지가 되나, 월드에 등록되는 시점이 AGameMode::BeginPlay()보다 느림
  • 해결 방법
    • AGameMode::BeginPlay()에서 딜레이를 주어 현재는 3초 후에 시퀀스 재생이 되도록 했음
    • 월드로 이동 후에 즉시 시퀀스를 재생하지 않기 때문에 월드의 모습이 보이는데, 이는 GameInstance를 통해 화면에 BlackScreen UI를 띄워 로딩 중으로 보이게 처리함
    • 향후에는 AGameMode::PostSeamlessTravel() 함수가 서버에서 Seamless Travel이 완전히 끝났음을 보장해주기 때문에 해당 함수에서 시퀀스를 재생해주는 것이 가장 안정적인 방법으로 보임

정리 노트

오늘의 CS

UPROPERTY()

정의 및 목적

  • 정의 : 언리얼 엔진의 리플렉션 시스템에 이 변수를 등록하도록 지시
  • 목적 : C++에서만 사용되는 변수가 아니라, 언리얼 엔진의 특수 관리 대상이 되도록 함

주요 기능

  • 가비지 컬렉션 추적
    • GC가 해당 객체를 강하게 참조하고 있다고 인식
    • Dangling Pointer가 발생하는 것을 막고, 레벨 전환 시 UObject가 안전하게 소멸되거나 nullptr로 리셋되도록 보장
  • 에디터 노출 및 설정
    • EditAnywhere, VisibleAnywhere 등의 지정자를 사용하여 변수를 언리얼 에디터의 디테일 패널에 노출시켜, 에디터에서 값을 수정할 수 있게 함
  • 블루프린트 통합
    • BlueprintReadWrite, BlueprintReadOnly 등의 지정자를 통해 블루프린트에서 접근 가능
  • 네트워크
    • Replicated, ReplicatedUsing 등의 지정자를 통해 멀티플레이 환경에서 해당 변수의 값을 서버에서 클라이언트로 자동 복제하도록 설정

UFUNCTION()

정의 및 목적

  • 정의 : 언리얼 엔진의 리플렉션 시스템에 이 함수를 등록하도록 지시
  • 목적 : C++ 로직을 엔진의 다른 시스템에서 실행하거나 바인딩할 수 있도록 함

주요 기능

  • 블루프린트 통합
    • BlueprintCallable 지정자를 사용하여 함수를 블루프린트 그래프에서 노드로 호출할 수 있게 함
    • BlueprintImplementableEventBlueprintNativeEvent를 사용하여 C++에서 선언하고 블루프린트에서 로직을 구현할 수 있음
  • 네트워크 (RPC)
    • Server, Client, NetMulticast 등의 지정자를 사용하여 함수를 네트워크 간에 호출할 수 있음
  • 델리게이트 및 타이머 바인딩
    • 엔진의 다양한 델리게이트의 AddDynamic에 바인딩되거나, 타이머 핸들에 콜백 함수로 등록될 수 있게 함
profile
게임 개발자를 향해..

0개의 댓글