언리얼 엔진 - 레플리케이션 실습
레플리케이션의 복제 관련된 기능을 사용해보자.
기본적으로 온라인으로 작업하고 플레이어가 접속하면 World Settings - Game Mode - Default Pawn Class 캐릭터 하나를 만들고 시작한다.
레플리케이션 테스트를 위해 새로운 Actor 블루프린트부터 생성해주도록 한다.
Actor 레플리케이션 통신

- Actor 부터 생성
- 이름은 BP_Sphere 으로 지어주었다.

- BP_Sphere 열어 컴포넌트를 Sphere 추가하도록 한다.
게임 구동하기
이제 플레이어 3명 추가해 구동해보자.
- 플레이어 3명 추가
- 넷모드는 Play As Listen Server 선택

레플리케이션이 기본 값으로 활성화 되어 있어 모든 플레이어가 같은 Sphere 구체를 바라볼 수 있다.
Net Load on Client
구체가 기본으로 클라이언트에게 보여지도록 Net Load on Client 기능이 활성화 되어있다. 이것을 꺼보도록 한다.
- BP_Sphere 블루프린트를 오픈한다.
- 좌측 레이아웃 컴포넌트를 자신의 블루프린트를 선택
- 우측 디테일에서 Net Load on Client 항목 확인

- Net Load on Client 기능은 맵이 오픈되면 네트워크 클라이언트에게 보여지게한다.
- 체크를 풀어 준 후 다시 게임을 구동해본다.

- 모든 클라이언트가 BP_Sphere 구체가 사라진 것을 볼 수 있다.
- 우측 Outliner 서버 입장에서 World를 바라보면 구체는 이미 시뮬레이션 되어있다.
- 이렇듯 해당 기능을 통해 클라이언트에게 보여줄지 말지 선택할 수 있다.
Actor - 동적으로 구체 생성해서 클라에게 보여주기
앞서 블루프린트 구체를 생성하고 맵에 표시해주는 방법을 사용하였다.
구체 생성을 조건이나 행동으로 맵에 생성하고 모든 네트워크 클라이언트에게 표시하는 작업을 진행한다.
- 진행하기 전에 맵에 표시한 구체 블루프린트를 삭제한다.
- 구체 블루프린트에서 false한 Net Load on Client 기능을 다시 켜준다.
구체를 스폰하는 담당하는 블루프린트나 클래스를 누가 담당할 것인지 고민이 거리가 된다.
효과 있는 방법은 튜토리얼 템플릿에 생성되어 있는 GameMode 블루프린트를 이용해 스폰하는 연출을 할 것이다. GameMode는 클라이언트에게 없는 서버의 유니크한 클래스이며 이것은 게임 구동시 진행이나 연출을 담당하기 때문이다.

- BP_ThirdPersonGameMode 열기
- EventGraph 를 열기
- Event BeginPlay 노드 추가
- SpawnActor from class 노드 추가

- BeginPlay 실행 노드를 SpawnActor from Class 를 선택
- SpawnActor 노드는 Class 선택 항목으로 생성할 인스턴스가 무엇인지 선택해야한다.
- 이전에 추가한 BP_Sphere 구체 선택
- Spawn Tranform 관련 항목이 있다. 마우스 우클릭으로 "...Split" 선택해서 펼침
- 스폰 위치 Spawn Transform Location 의 Z축 600 으로 지정
- (시작 시 안보여서 500 변경함)

- 게임을 구동하면 머리 위에 구체가 생성됨
- Listen Server 의 GameMode의 서버 대상이 Client 0 이다.
- 나머지 Client 1, Cliemt 2 는 서버가 아니므로 보여주지 않는다.
GameMode는 서버만 시뮬레이션되도록 생성되므로 화면에 보여주지만 클라이언트는 GameMode를 생성하지 않으므로 보여주지 않는다.
Actor 구체를 클라이언트로 생성하기
앞서 GameMode 를 갖지 못한 클라이언트에게도 네트워크를 통해 Actor 구체를 생성하도록 전파한다.

- BP_Sphere 열어주도록 한다.
- 우측의 Detaile에서 Replicates 체크 버튼을 클릭하여 활성화한다.

- GameMode 에서 스폰하는 구체는 서버만 갖추도록 되어있었다.
- Client들에게도 보이도록 구체의 Replicates 활성화한다.
- 게임 구동시 GameMode 액터가 없는 클라에게도 구체가 활성화된 것을 볼 수 있다.
다른 온라인 게임 엔진과 다르게 언리얼 엔진은 네트워크 기본 구성만으로 편리하게 통신을 편리하다는 것을 확인할 수 있었다.
Replicate된 구체 디스폰하기
Replicate 된 구체를 디스폰 하면 어떻게 되는지 살펴보자.

- BP_ThirdPersonGameMode 블루프린트를 다시 켜준다.
- Delay 와 Destroy Actor 노드를 추가한다.
- Delay 초를 지정하고 Complate 대상을 Destroy Actor 노드로 선택한다.
- Destroy Actor 는 SpawnActor BP_Sphere 으로부터 Target으로 받게한다.
- GameMode 갖고 있는 서버뿐 아니라 모든 클라이언트이 구체가 디스폰되고 있다.
- 이는 Replicates 설정된 BP_Sphere 영향에 끼쳐 서버가 모든 클라에게 디스폰하라고 전파하고 있다.
구성된 블루프린트
블루프린트는 여러가지 컴포넌트를 담을 수 있다.

- BP_Sphere 블루프린트를 열람
- 구체라는 스킨을 표시해주는 스태틱 메쉬 컴포넌트 가질 수 있다
- VARIABLES 변수에도 여러가지 추가할 수 있다.
BP_Sphere 는 Replicates 활성화하면 Actor의 생명주기만 복제되지만 그 내부의 정보들은 모두 복제되지 않아 동기화가 이루어지지 않는다.
블루프린트 내부 변수 Replicate 대상으로 지정하기
앞서 설명했다시피 Actor 블루프린트를 레플리케이트 체크해도 내부 변수가 동기화 되지 않는다고 하였다.
별도의 작업을 진행하여 내부 변수도 포함해 레플리케이트로 동기화한다.
변수 추가하기

- BP_Sphere 블루프린틩 Name(String), bIsVisual(Boolean) 추가한다.
- 변수 우측의 눈이 있다. 클릭하여 에디터하여 표시해주는 작업으로 클릭해서 눈을 뜨게한다.
GameMode의 BP_Sphere 액터 변수 설정하기

- BP_ThirdPersonGameMode 열어주도록 한다.
- 그래프에서 Set Name, Set Is Visual 노드를 추가한다.
- 각각 kiioio, True로 설정되도록 한다.
- 시퀀스를 그림과 같이 연결한다.
게임 구동 후 변수 값 확인하기
Server 측 Outliner 액터의 Detail 변수 확인

Client 측 Outliner의 Detail 변수 확인

- 사진과 같이 Is Visual, Name 값을 확인해본다.
- Server는 정상적으로 변경한 값으로 표시한다.
- Client는 초기값으로 None, False 로 표시되고 있다.
이처럼 내부 변수도 레플리케이트 대상으로 해주어야한다.
액터 블루프린트 내부 변수 레플리케이션하기

- BP_Sphere 열어준다.
- Name VARIALBES 에서 클릭하면 우측의 Detail창에서 표시된다.
- Replication 클릭하여 Replicated 선택한다.
- 클릭하면 내부의 클라이언트가 동기화 되어 값이 표시된다.

- 클라이언트에도 Name으로 레플리케이트하여 값이 전파된 것을 볼 수 있다.
- IsVisual 에도 똑같이 설정해준다.
값이 변경된 경우 알림하기
단순 Replication 설정하여도 함수에도 전달해주어야 UI에서 반응해 값을 갱신해주어야 작업이 요구될 수 있다.
RepNotify

앞의 사진처럼 Replicated 이 아닌 RepNotify 가 있다. 콜백 함수처럼 선언형 프로그래밍처럼 동작한다.

- RepNotify 설정 시 좌측 레이아웃 FUNCTION 에서 신규로 OnRep_Name이 자동으로 추가된다.
- 클릭하여 그래프에서 OnRep_Name 이어서 노드를 추가하여 레플리케이션 전파와 함께 멤버함수, 변수 등 블루프린트로 실행할 수 있다.

- 전파받은 클라이언트 각각 Text String이 실행되어 2개 표시된다.
- 값 또한 레플리케이션되어 GameMode 노드의 변경된 값으로 표시한다.
Replication 과 RepNotify 기능을 살펴보았다.
- Replication
- 내부 변수의 값만 클라이언트로 전파되기를 원한다면 해당 옵션을 킨다.
- RepNotify
- 클라이언트로 전파되면 내부 변수 값뿐 아니라 액션까지 수행하도록 한다.
참고로 액션은 전파 받은 클라이언트 수만큼 콜백이 수행하므로 참고해서 개발해야한다.
- 클라이언트로 전파되면 내부 변수 값뿐 아니라 액션까지 수행하도록 한다.
컴포넌트 레플리케이션하기
액터의 내부 변수가 아닌 신규 액터 컴포넌트를 생성해 지속형 상태를 관리 용도로 사용 시 레플리케이션 대상으로 지정할 필요가 있을 것이다.
- 기존에 작업한 Name 과 bIsVisual 변수를 삭제한다.
BP_Stat 액터 컴포넌트 추가

- 블루프린트에서 신규 ActorComponent 클래스의 BP_Stat 이름으로 신규 생성한다.
BP_Stat 변수 추가하기

- 신규 추가한 BP_Stat 에서 변수 Name과 Class 이름으로 지어준다.
- 우측 눈 아이콘 클릭하여 활성화한다.
BP_Sphere 신규 BP_Stat 컴포넌트 추가하기

- BP_Sphere 블루프린트를 열어준다.
- 좌측 레이아웃 Components 에서 추가한 BP_Stat 검색하여 추가한다.
GameMode 값 설정하기

- GameMode 에서 BP_Stat 액터의 멤버 함수 컴포넌트 노드를 추가한다.
- BP_Stat 컴포넌트 노드는 Setter 용도의 Class, Name 추가하여 값을 지정한다.
게임 구동하기

- 게임 구동 후 클라이언트 Outliner 에서 BP_Sphere 아래의 컴포넌트를 확인할 수 있다. BP_Stat 선택한다.
- 클라이언트에다가 레플리케이션이 안되있으므로 Name과 Class 값은 초기값으로 표기된다.
BP_Sphere 컴포넌트 대상으로 레플리케이션하기

- 다시 BP_Sphere 액터를 열어 BP_Stat 컴포넌트를 선택하고 우측의 Component Replicates 체크한다.
이 설정은 컴포넌트 생명주기만 레플리케이션될 뿐이다. 컴포넌트 내부 변수도 마찬가지로 레플리케이션해주도록 한다.
BP_STat 변수 레플리케이션하기


- RepNotify 으로 콜백함수로 수치를 표시해주도록 하였다.
구동하기

- 모든게 정상적으로 온라인으로 값을 표시해주고 있다.
언리얼 엔진에서는 쉽게 느껴지지만 실제 다른 엔진에서는 굉장히 어려운 작업이다.
자체 엔진 같은 경우 Boost의 Asio 또는 iocp 사용한다면 까다로운 작업인데, 언리얼 엔진의 레플리케이션을 사용하여 편리한 네트워크 환경이 만들어졌다.