https://dev.epicgames.com/documentation/ko-kr/unreal-engine/demonetdriver-and-streamers-in-unreal-engine?application_version=5.3

DemoNetDeriver

  • Streamer를 사용해 Replay 재생에 필요한 정보를 추출/기록
  • 시청 방식에 따라 Engine에 포함된 다양한 Streamer를 DemoNetDriver에 붙일 수 있음.

Streamer 변경

  • ReplayStreamerOverride 옵션에서 다른 Streamer Factory Module을 변경해 덮어쓸 수 있다.
    • InMemoryNetworkReplayStreaming
    • HttpNetworkReplayStreaming
  • 기본값인 LocalFileNetworkReplayStreaming은
    Default.ini의 NetworkReplayStreaming 섹션의 DefaultFactoryName 변수를 설정해 변경 가능
  • InitBase를 호출하고 적당한 URL 인수를 파라미터로 제공하는 것으로도 변경 가능
  • GameMode는 Replay를 보기 위해 ReplaySpectatorPlayerControllerClass에 지정된 Class를 사용한다.

시간 비용 분산

  • 콘솔 변수 demo.CheckpointSaveMaxMSPerFrame 값을 양수로 설정해
    리플레이 데이터 녹화에 필요한 시간 비용 분산할 수 있다.
  • Frame당 시간 제한 만료 전 Replay에 녹화되지 않은 Actor는 대기열에 등록 되었다가 다음 Frame에 녹화된다.
  • Checkpoint 녹화 및 Take에 드는 시간에 상한선을 두어 게임이 멈추는 현상을 방지하는데 도움이 된다.
  • Actor에 대한 Data에 들어있는 Checkpoint를 여러 Frame걸쳐 찍기 때문에
    재생 도중 약간의 시각적 오류가 발생할 수 있다.
  • 이 기능은 주로 게임에서 Checkpoint 녹화를 위해 지정된 시간 제한보다 오래 걸렸을 때에만 발동한다.
    • 저사양 머신 또는 퍼포먼스를 많이 요하는 게임에서 주로 적용된다는 의미이다.

녹화 우선순위 지정

  • 다음 조건을 만족하면 Replay에 저장되는 Actor의 녹화 순서를 지정 할 수 있다.
    • bPriotizeActors 옵션을 활성화
    • GetReplayPriority 함수를 Implement
  • MaxDesiredRecordTimeMS를 통한 분산 녹화와 함께 사용하면 더 효과적이다.

Checkpoint 녹화 빈도

  • 콘솔 변수 demo.CVarCheckpointUploadDelayInSeconds로 조절
    • 기본값: 30초
  • Checkpoint 사이 기간을 늘리면 Replay를 앞뒤로 문질러 이동하는 작업이 느려진다.
  • 대신 Replay 크기는 줄어든다.

녹화 중 임시 정지

  • bPauseRecording 변수를 true로 설정해 Demo 녹화 중 녹화를 임시 정지할 수 있다.
    • false로 설정하면 녹화가 재게된다.

대체 PlayerController 생성

  • SerViewerOverride를 사용하면 DemoNetDriver가 녹화 목적으로 사용되는 대체 PlayerController를 생성한다.
    • 이 Playercontroller는 Actor의 Network Relevancy, Curling, Priority 결정 방식을 변경할 수 있다.
  • 이 기능은 GamePlay에서 멀리서 일어나는 일을 알 수 없지만, Replay에서는 모든 것을 볼 수 있도록 할 때 좋다.

Slate와의 병렬 처리

  • Slate와 병렬 처리를 위해 아래 콘솔 변수가 0이 아닌 값으로 적용되어야 한다.
    • tick.DoAsyncEndOfFrameTasks
    • demo.ClientRecordAsyncEndOfFrame

주의점

  • Replay 생성 Actor는 Live Gameplay Actor와 마찬가지로 함수 호출을 한다.
  • 이는 Live Actor처럼 행동해 Replay Data를 최소화할 수도 있다.
  • 하지만 공유 Object에 영향을 주는 함수 호출이 Replay Actor에서도
    사용 가능해 원하지 않는 방식으로 Game의 상태에 영향을 줄 수 있다.
    • GameInstance, GameState, GameMode
  • 특히 Memory Streamer가 그러한데, 현재 Play 중인 Live GamePlay를 바로 시청하는 경우이다.
  • Actor에 영향을 주지 않도록 하는 보호 장치로,
    Actor가 Live인지 Replay Level의 일부인지 확인한 후 작업을 처리하는 것을 권장한다.
  • 이러한 문제는 거의 Game에서만 발생할 것이라서 각 Project에서 건 by 건으로 처리해줘야 한다.
  • 이러한 문제의 대표적인 예시로 Replay 도중 Player의 상태가 변하지만 점수가 변하지 않는 것이다.

Replay Data Format

  • Data 측면에서 Replay에는 3가지 게임 상태 정보와 더불어 약간의 Text Data가 추가로 저장된다.

기준 Data

  • Game World의 시작 상태를 설명하는 시작 부분

Checkpoint

  • World에 가해지는 전체 변경 사항의 Snapshot 역할을 한다.
  • 정기적인 사용지 지정 간격으로 나타난다.

점증적 변화량

  • Checkpoint 사이를 채워주는 요소
    • World의 개별 Object들이 각자의 점증적 변화량을 가진다.
  • 이를 통해 Game 내 어느 순간도 Engine에서 빠르고 정확하게 재구성 할 수 있다.

Text Data

  • 다음 2가지로 구성되어 있다.
    • Player가 보는 목록을 만드는데 사용할 수 있는 표시명
    • Game 목록의 검색 또는 필터링에 사용할 수 있는 Custom Text Tag
      • HTTP Streamer 전용

Replay 방식

  • World를 기준 Data로 초기화
  • 선택한 시간 이전의 Checkpoint가 구현된 상태로 변경
  • 가장 최근 Checkpoint 이후 지정된 시간 직전까지의 점증적 변화량 적용

Local File Streamer

  • DemoNetDriver가 가진 기본 Streamer 타입
  • Host Machine의 Replay Data를 로컬 저장장치의 단일 파일에 비동기 기록한다.
    • 때문에 Single Player Game 및 Replay를 로컬에서 재생하는 게임에 적합하다.
  • 저장된 Replay 배포와 관리가 쉽다.
  • 비동기 기록 기능이 있어 Console처럼 HDD 속도가 낮은 System의 Performance가 향상된다.
  • Replay Data File은 Project/Saved/Demos/ 폴더에 저장된다.
  • 확장자는 ".replay"이다.

SaveGame Replay Streamer

  • Replay를 SaveGame Slot을 선택해 저장하는 기능이 추가된 특수한 Local File Streamer
  • Client에 Replay를 저장한 뒤, 다음 Platform의 SaveGame 로드 용 Interface를 통해 읽을 수 있다. 
    •  SaveGame System 없이 Replay를 저장/보관/로드가 가능하다.
  • 주 목적은 SaveGame Slot에 복사되지 않은 Replay 식별/복사/재생/삭제 등의 작업을 Local File과 SaveGame Slot 양쪽에서 할 수 있는 보조 API 활용이다.
  • Console 게임에 적합함.

Null Streamer

  • Replay Data를 Local 디스크에 직접 작성한다.
    • Local 녹화 제작, Single Player Game에 좋다.
  • GamePlay Trailer나 Cut-Scene 영상 제작, Tutorial, TimeAttack Video 시청 및 공유를 할 수 있게 해준다.
  • 4.20 버전 이후로 Deprecated 되었지만 예전 Replay를 재생할 수 있도록 하위 호환성을 유지하고 있다.

Memory Streamer

  • 사용자가 지정할 수 있는 실행 길이의 Replay Data를 Client Machine의 Memory에 저장
  • 최근의 극적인 순간에 대한 즉석 Replay에 최적화 되어 있다. 
    • Sports Game의 즉석 Replay
    • Shooting Game의 Kill Cam
    • Action Game에서의 최종 보스 처치 장면

사용법 세부사항

  • Memory Streamer는 하나의 Session 도중 녹화와 재생, Gameplay가 재개되도록 되어 있다는 점에서 특별하다.
    • Player가 Replay를 시청하는 도중 LiveGame은 모습도 소리도 업싱 계속 진행시키고,
      Replay가 끝나면 매끄럽게 Game이 이어지도록 할 수 있다.
  • 로드 시간에 Engine은 Level을 Static, Dynamic Source, Dynamic Duplicate으로 모은다.
    • 이를 그룹을 통해 Live Gameplay 및 Replya System과의 Level 상호작용 방식이 다음과 같이 정해진다.

Static Level

  • Persistant Level이 아니면서 IsStatic이 마킹 된 Level
  • 작동 시 Gameplay 영향을 받지 않으며, Live Play와 Replay 양쪽에 모두 표시된다.

Dynamic Source Level

  • Persistant Level이면서 IsStatic이 마킹되지 않은 Sublevel
  • Live Gameplay의 영향을 받는다.
  • Replay 도중에는 숨겨지지만, Gameplay에는 여전히 정상 실행된다.

Dynamic Duplicate Level

  • 로드 시간에 Dynamic Source Level에서 복제한 사본
    • Dedicated Server나 Editor Mode에는 존재하지 않음
  • Live Gameplay 도중에는 숨겨진다.
  • Replay는 이 Level에서 발생한 뒤 비워진다.

효율적인 사용법

  • Dynamic Source Level에 대해 DemoNetDriver를 하나, Dynamic Duplicate Level에 대해 또 하나 만들 수 있다.
    • 이 경우 Dynamic Source Level의 Live Gameplay를 녹화한 뒤, Dynamic Duplicate Level에서 재생할 수 있다.
    • Replay 도중 Dynamic Source Level은 숨기고 Dynamic Duplicate Level을 표시하면
      Gameplay는 계속하면서 REplay에 영향받지 않는 Network Update를 받을 수 있다.
  • Static Level 그룹은 언제든 활성화시켜 보이도록 할 수 있다.
  • Live Gameplay에 영향을 받지 않은 것들이 저장 되므로 Replay Process에는 포함시킬 필요가 없다.
    • Static World Geometry
    • BGM
    • Particle
    • Animation
  • Dynamic Source Level은 소멸이나 정지된 적 없이 숨기기만 했을 뿐이다.
    • 그렇기에 Gameplay Replay 시청 도중에도 자연스럽게 진행되고,
      Dynamic Source Level을 다시 시청할 수 있도록 만들 수 있다.
  • 더불어 이 System에는 개발자가 Level을 Static 마킹하여 REplay 녹화 및 재생에서 제외도도록 하는 기능이 있다.
    • 결과적으로 Memory와 시간을 절약할 수 있다.

HTTP Streamer

  • Replay Data를 LAN이나 인터넷을 통해 다른 Machine에 전송할 때 사용
  • 다음 경우에 유용함
    • Dedicated Server Game
      • Server가 항상 Game 내 모든 곳에서 벌어지는 일을 알고 있음.
      • Replay Data 처리 작업에 들어가는 작업을 분산시켜
        단일 서버에서 동시 Hosting 할 수 있는 Game 수를 늘리려는 경우에 좋음.
    • 많은 수의 시청자에게 Live Streaming 방송을 하면서도 반응 속도는 좋게 유지해야 하는 경우
    • Live Streaming 경기나 경기 녹화 기능을 유지하여 언제든지 볼 수 있도록 할 때
  • Game을 실행하는 쪽이 완벽히 제어하는 Computer에서 Data를 캡쳐할 수 있어 치트 감지 툴 역할을 하기 좋다.

사용법 세부사항

  • HTTP Streamer REST API를 통해 Custom Replay Server와 통신한다.
    • GET 및 POST Method를 사용해 Binary나 JSON Format String으로 Data 전송
    • Server를 구성하기 위해서는 URL을 구성해야 한다.

Custom Replay Server URL 구성법

  • Project의 DefaultEngine.ini 파일의 [HttpNetworkReplayStreaming] 섹션 아래 ServerURL 변수
  • http://replay/yourgame.com/ << 이와같은 포맷
  • 마지막 /는 있으나 없으나 문제 없다

HTTP Streamer REST API

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/http-streamer-rest-api-for-unreal-engine?application_version=5.3

'UE5 > Network' 카테고리의 다른 글

[Network] Property Replication  (1) 2024.06.28
[Network] Network Property  (0) 2024.06.25
[Network] Network Driver  (0) 2024.06.18
[Network] Beacon  (0) 2024.06.17
[Network] Replication Graph  (1) 2024.06.13

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/using-online-beacons-in-unreal-engine?application_version=5.3

  • 일반 게임 접속을 통하지 않고 RPC를 통해 서버와 접촉해 가벼운 상호작용을 제공하는 Actor
  • Project에 맞는 상호작용, 로직, 정보 요청을 위한 Custom Class 확장을 권장
    • 특수한 경우에 내장 Class를 그대로 사용 하기도 함.

 

OnlineBeacon

  • 대표적인 사용 예시는 다음과 같다.
    • 서비스 품질 정보 요청
    • Client가 참여하고자 하는 Game의 Slot 예약
    • Player 이름 목록
    • 진행 중인 Game의 진행 시간 및 점수

AOnlineBeacon

  • AOnlineBeaconHost, AOnlineBeaconClient의 BaseClass

AOnlineBeaconHost

  • 별도의 NetDriver를 사용해 Remote Client에서 들어오는 OnlineBeacon Access를 Listen.
  • Access를 받으면 등록된 OnlineBeaconHostObject 인스턴스를 대상으로 일치하는 Client를 탐색,
    해당 Object에 Access를 넘겨준다.
  • 이 Class는 파생 Class를 만들 필요가 없다.
    • Client와 등록된 OnlineBeaconHostObject 사이의 초기 접속만 관리하기 때문이다.

AOnlineBeaconClient

  • Host에 접속하여 실제 RPC를 생성
    • 하나는 Client에서 생성
    • 다른 하나는 Server의 OnlineBeaconHost에 등록된 적합한 OnlineBeaconHostObject에 의해 생성
  • GetBeaconType 함수를 사용해 적합한 Host Object Class의 Register Instance에 일치시킨다.
    • 이 방식은 일반적으로 Server가 Spawn하고 Client에 Replicate하는 Actor Spawning 방식과 다르다.
    • 하지만 Client Object와 Server Object 사이에 접속이 이루어진 후,
      어느 한 쪽이 다른 쪽에 RPC를 할 수 있게 되면서 Object Replicate가 정상적으로 이루어지게 되며,
      Server Actor는 Property Replicate와 관련해 Authority를 가지게 된다.
  • OnConnected와 OnFailure 함수를 통해 접속 시 RPC를 호출하거나, 접속 실패 처리를 할 수 있다.
  • Beacon에서 요구하는 Client쪽 작업이 필요할 시 이 Class에서 구현되어야 한다.

AOnlineBeaconHostObject

  • OnlineBeaconClient Class와 짝을 이루도록 만들어져야 하는 Class
    •  Client의 GetBeaconType() 함수의 반환값과, BeaconTypeName에 저장된 값을 일치 시켜 짝을 이룬다.
  • OnlineBeaconHost에 Access를 요구하는 OnlineBeaconClient에 대응하는 OnlineBeaconHostObject가 탐지 되면,
    OnlineBeaconHostObject::SpawnBeaconActor를 통해 OnlineBeaconClient의 사본을 Spawn
    • SpawnBeaconActor로 ClientBeaconActorClass 변수를 사용해 Sapwn 할 Actor Class를 결정
    • 이 CleintBeaconActorClass가 짝을 이룬 OnlineBeaconClient Class로 설정 되어야 함.
  • Spawn 된 OnlineBeaconClient에서 SetBeaconOwner도 호출해야 Client와 통신을 할 수 있다.
  • 위의 기능들은 대부분 BaseClass에서 이루어지기 때문에 Override 할 필요가 없다.

PartyBeacon

  • Party 기반 매치메이킹을 위해 특별히 설계된 클래스
  • Multiplay Game에서 파티 형성 및 GameSession 접속을 관리

PartyBeaconClient

  • Server에 있는 PartyBeaconHost와 통신해 Party 매치메이킹을 요청
    • Server에 Party 정보 전송
    • 성공 여부를 받아 처리하는 Client Interface

PartyBeaconHost

  • Server에서 각 Party의 요청에 따라 GameSession 할당

PartyBeaconState

  • 현재 Party의 상태와 Session의 예약 정보를 관리
    • Party 크기
    • Session에 접속된 Party 수
    • 가능한 최대 Party 수
  • Server로부터 예약 요청 처리에 필요한 정보들을 제공

SpectatorBeacon

  • 관전자 모드를 위한 특수 구성 요소
  • Multiplayer Game에서 관전자가 게임을 관찰할수 있도록 한다.
    • 관전자가 Server에 효율적으로 접속하고, 게임 진행을 관찰할 수 있게하는 과정을 관리

SpectatorBeaconClient

  • Client에서 관전자가 GameServer에 접속 요청을 할 때 사용
  • Server의 SpectatorBeaconHost와 통신해 관전 가능한 세션을 요청, 입장 승인 여부를 확인

SpectatorBeaconHost

  • Server에서 실질적인 관전자의 접속 요청을 수신, 관리
  • 관전자에게 제공할 GameSession을 관리
  • 관전자의 접속을 허가하거나 거부할 수 있는 권한이 있음

SpectatorBeaconState

  • 관전자 접속 상태와 관려 정보를 관리
    • 관전 가능한 GameSession의 상태
    • 현재 관전자 수
    • 최대 관전자 수
  • SpectatorBeaconHost가 이 정보를 기반으로 판단을 내린다.

VoiceSynthSystem

  • 음성 통신 기능을 담당하는 구성 요소
  • Game 내에서 Player간의 실시간 음성 커뮤니케이션이 가능하도록 한다.

VoiceEnvineImpl

  • Unreal Engine의 음성 엔진 구현 Class
    • Hardware와 OS에 특화된 음성 처리를 담당
  • 음성 데이터의 Capture, 처리, 재생을 관리

VoiceInterfaceImpl

  • 음성 데이터 인터페이스의 구현을 제공
  • 다양한 Network 환경에서 음성 데이터의 Reliable 한 전송을 보장
  • 음성 데이터 Pakcet의 생성과 송수신 Interface를 정의

VoicePacketBuffer

  • 음성 데이터 Packet을 임시로 저장하는 버퍼 역할
    • Network 지연, Data Packet 손실을 관리하는데 유용

VoicePacketImpl

  • 실제 음성 데이터 Packet의 구현체
  • 음성 데이터를 압축해 Packet 형태로 만드는 역할

VoiceListenerSynthComponent

  • Unreal Engine의 합성 음성 Component
  • 게임 내 음성 데이터를 재생하는 기능 제공

'UE5 > Network' 카테고리의 다른 글

[Network] Property Replication  (1) 2024.06.28
[Network] Network Property  (0) 2024.06.25
[Network] Network Driver  (0) 2024.06.18
[Network] DemoNetDriver 및 Streamer  (0) 2024.06.17
[Network] Replication Graph  (1) 2024.06.13

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/replication-graph-in-unreal-engine?application_version=5.3

https://www.unrealengine.com/ko/tech-blog/replication-graph-overview-and-proper-replication-methods

 

  • 일반적으로 Replicate되는 Actor들은 매 Tick마다 해당 Actor가 Replicate될지 말지 판단을 한다.
    • 게임이 클수록, 동시접속자가 많을수록 CPU 병목현상이 발생하기 쉬워짐
  • Replication Graph는 Actor 단위의 Replicate 판단 여부를 Node 단위로 묶어서 비용을 감소시킨다.

동작 방식

  • 기본적인 동작 방식은 이전의 Actor Replicate와 크게 다르지 않다.
    • 특정 공간 안의 Actor를 별도로 관리(Spatial Partitioning)
    • 대상 클라이언트로부터 먼 거리의 Actor를 제외 (Relevancy Culling)
    • Replicate 빈도 관리 (Frequency Control)

ReplicationGraphNode

  • 동일한 조건으로 Replicate 되어야 할 Actor를 하나로 묶어주는 단위
  • BaseClass인 UReplicationGraphNode는 Pure Virtual Function이 있어서 반드시 이를 상속 받은 Class를 써야 한다.
    • 최소 아래 함수들은 반드시 Implement 되어야 한다.
/** Override this function to initialize the per-class data for replication */
//Initialize UReplicationGraph::GlobalActorReplicationInfoMap.
virtual void InitGlobalActorClassSettings();

/** Override this function to init/configure your project's Global Graph */
//Instantiate new UGraphNodes via ::CreateNewNode. Use ::AddGlobalGraphNode if they are global (for all connections).
virtual void InitGlobalGraphNodes();

//Route actor spawning/despawning to the right node. (Or your nodes can gather the actors themselves)
virtual void RouteAddNetworkActorToNodes(const FNewReplicatedActorInfo& ActorInfo, FGlobalActorReplicationInfo& GlobalInfo);
virtual void RouteRemoveNetworkActorToNodes(const FNewReplicatedActorInfo& ActorInfo);

/** Override this function to init/configure graph for a specific connection. Note they do not all have to be unique: connections can share nodes (e.g, 2 nodes for 2 teams) */
//Initialize per-connection nodes (or associate shared nodes with them via ::AddConnectionGraphNode)
virtual void InitConnectionGraphNodes(UNetReplicationGraphConnection* ConnectionManager);
  • Node 안에 별도의 Child Node를 가질 수 있다.

ReplicationGraphNode_ActorList

  • 간단한 Actor 목록을 관리
  • 복잡한 Frequency나 Relevancy 로직 없이 관리 된다.
  • 소규모 목록에서 사용할 때 유용

ReplicationGraphNode_ActorListFrequencyBuckets

  • Replicate 빈도에 따라 Actor들을 Bucket 단위로 관리
  • 다양한 간격으로 업데이트가 필요한 Actor를 관리할 때 유용

ReplicationGraphNode_AlwaysRelevant

  • 위치, 상태와 관계 없이 모든 Client에게 항상 Replicate 되어야 하는 경우
  • GameMode, Controller, GameState와 같은 GamePlay에 주요한 Actor에게 적합

ReplicationGraphNode_AlwaysRelevant_ForConnection

  • AlwaysRelevant와 유사하지만 그 대상을 특정 Client에게만 제한할 수 있다.
  • 특정 Player에게 필수적인 Actor를 Replicate할 때 적합

ReplicationGraphNode_ConnectionDormancyNode

  • 비활성화 될 여지가 있는 Actor들에 적합
  • 또는 배경의 Actor와 같이 업데이트를 제한하여 자원을 최적화 하는데 적합

ReplicationGraphNode_DormancyNode

  • Actor가 활성화 될 때 모든 Client에 Replicate되어야 하는 경우
  • 간헐적으로 활성화 되는 Actor들에게 유용

ReplicationGraphNode_DynamicSpatialFrequency

  • 공간적 조건에 따라 Replicate 빈도를 동적으로 조절
  • Player의 이동이나 게임 내 Event로 인해 Relevancy가 자주 변경되는 환경에 이상적

ReplicationGraphNode_GridSpatialization2D

  • World를 Grid로 나누고, Grid 위치에 따라 Replicate를 관리
  • 넓은 오픈월드 게임에서 플레이어 주변 Actor만 업데이트하여 네트워크 트래픽 최적화

ReplicationGraphNode_TearOff_ForConnnection

  • Tear Off(서버에서 어느정도 분리된 상태)된 Actor들을 관리
  • 해당 Actor들을 새로운 Client에 적절하게 Replicate 되도록 보장
  • Actor가 급격하게 변경되는 빠른 페이스의 액션이나 파괴 시나리오에서 사용됨.

ReplicationGraph

  • Replication Driver의 기능을 확장한 Class
  • 다수의 ReplicationGraphNode를 관리한다.

작업 방식

Node 추가

  • 기존에 만들었던 ReplicationGraphNode를 InitGlobalGraphNodes에서 생성, 추가한다.
void UBasicReplicationGraph::InitGlobalGraphNodes()
{
	// -----------------------------------------------
	//	Spatial Actors
	// -----------------------------------------------

	GridNode = CreateNewNode<UReplicationGraphNode_GridSpatialization2D>();
	GridNode->CellSize = 10000.f;
	GridNode->SpatialBias = FVector2D(-UE_OLD_WORLD_MAX, -UE_OLD_WORLD_MAX);

	AddGlobalGraphNode(GridNode);

	// -----------------------------------------------
	//	Always Relevant (to everyone) Actors
	// -----------------------------------------------
	AlwaysRelevantNode = CreateNewNode<UReplicationGraphNode_ActorList>();
	AddGlobalGraphNode(AlwaysRelevantNode);
}

Actor 추가

  • AddNetworkActor에서 RouteAddNetworkActorToNodes를 호출
  • RouteAddNetworkActorToNodes에서 등록된 Node를 통해 NotifyAddNetworkActor로 Actor 등록
void UReplicationGraph::AddNetworkActor(AActor* Actor)
{
	LLM_SCOPE_BYTAG(NetRepGraph);
	QUICK_SCOPE_CYCLE_COUNTER(UReplicationGraph_AddNetworkActor);

	if (IsActorValidForReplicationGather(Actor) == false)
	{
		return;
	}

	if (NetDriver && !NetDriver->ShouldReplicateActor(Actor))
	{
		return;
	}

	bool bWasAlreadyThere = false;
	ActiveNetworkActors.Add(Actor, &bWasAlreadyThere);
	if (bWasAlreadyThere)
	{
		// Guarding against double adds
		return;
	}

	ensureMsgf(!Actor->bNetTemporary, TEXT("ReplicationGraph does not support bNetTemporary. Actor: %s has bNetTemporary set."), *Actor->GetPathName());

	// Create global rep info	
	FGlobalActorReplicationInfo& GlobalInfo = GlobalActorReplicationInfoMap.Get(Actor);
	GlobalInfo.bWantsToBeDormant = Actor->NetDormancy > DORM_Awake;

	RouteAddNetworkActorToNodes(FNewReplicatedActorInfo(Actor), GlobalInfo);
}

 

void UReplicationGraph::RouteAddNetworkActorToNodes(const FNewReplicatedActorInfo& ActorInfo, FGlobalActorReplicationInfo& GlobalInfo)
{
	// The base implementation just routes to every global node. Subclasses will want a more direct routing function where possible.
	for (UReplicationGraphNode* Node : GlobalGraphNodes)
	{
		Node->NotifyAddNetworkActor(ActorInfo);
	}
}

Node 탐색

  • 매 Tick마다 ServerReplicateActors를 호출
  • 함수 내부에서 조건에 맞는 Node를  FNewReplicatedActorInfo로 검색
/** This is the struct we use to push new replication actors into the graph. "New" doesn't mean "newly spawned" it means "new to the graph". FIXME: Please suggest a better name! */
struct FNewReplicatedActorInfo
{
	explicit FNewReplicatedActorInfo(const FActorRepListType& InActor) : Actor(InActor), Class(InActor->GetClass())
	{
		StreamingLevelName = GetStreamingLevelNameOfActor(Actor);
	}

	explicit FNewReplicatedActorInfo(const FActorRepListType& InActor, FName OverrideLevelName)
		: Actor(InActor)
		, StreamingLevelName(OverrideLevelName)
		, Class(InActor->GetClass())
	{
	}

	AActor* GetActor() const { return Actor; }

	REPLICATIONGRAPH_API static FName GetStreamingLevelNameOfActor(const AActor* Actor);

	FActorRepListType Actor;
	FName StreamingLevelName;
	UClass* Class;
};

설정 방법

ini 파일 설정

  • Project의 Default.ini에서 아래와 같이 ReplicationDriverClassName 추가
[/Script/OnlineSubsystemUtils.IpNetDriver]
ReplicationDriverClassName="/Script/ProjectName.ClassName"

Instance 반환 함수 Bind

UReplicationDriver::CreateReplicationDriverDelegate().BindLambda([](UNetDriver* ForNetDriver, const FURL& URL, UWorld* World) -> UReplicationDriver*
{
	return NewObject<UMyReplicationDriverClass>(GetTransientPackage());
});

NetReplicationGraphConnection

  • 각 Client 연결에 대한 Replicate Data를 관리
    • ReplicationGraph가 ReplicationDriver를 상속받아 NetDriver의 역할을 한다면, 
      NetReplicationGraphConnection은 ReplicationConnectionDriver를 상속받아 NetConnection의 역할을 한다.
  • ReplcationGraph에서 Replication이 결정 된다면,
    NetReplcationgraphConnection은 해당 Client에게 최적화 된 데이터를 전달해준다.

일반적인 사용 기준

  • Actor의 위치에 따라 Group을 나눈다.
  • 비활성화된 Actor를 식별하여 별도의 목록으로 관리한다.
  • Character가 주워서 들고 다닐 수 있다면, 소유자와 같이 업데이트 한다.
  • 모든 Client가 Replicate 받는 특수 목록을 만든다.
  • 특정 Client에 Relevancy를 갖는 특수 목록을 만든다.

'UE5 > Network' 카테고리의 다른 글

[Network] Property Replication  (1) 2024.06.28
[Network] Network Property  (0) 2024.06.25
[Network] Network Driver  (0) 2024.06.18
[Network] DemoNetDriver 및 Streamer  (0) 2024.06.17
[Network] Beacon  (0) 2024.06.17

+ Recent posts