정의
일반적인 게임들은 Steam에 연동하는 등의 플랫폼 작업이 뒤따르거나, DB에 현재 상태의 값을 저장하는 등 서버로서 필요한 작업이 더욱 많다. 다만 이러한 부분은 일단 제쳐두고 별다른 save data 없이 단판 게임으로서 멀티플레이 게임을 어떻게 만들 것인지 부터 생각해보자.
개인적으로는 dedicated server를 연습하기 위해 멀티플레이 개념을 잡고 있으므로 리슨 서버(listen server)에 대해서는 별도로 다루지 않는다.
참고로 Editor에서 dedicated server를 이용해 여러 클라이언트를 띄우려면 아래와 같이 설정하면 된다.
Replicated 속성 적용하기
기본적으로 위의 그래프를 보면 replicated 속성은 아래 구조체에 적용할 수 있다.
- GameState
- PlayerState
- Pawn: Actor, Character 등
이번에 테스트를 해보기 위해 캐릭터의 body 색깔을 변경해보았다.
우선 설정은 아래와 같이 한다.
VisibleInstanceOnly를 설정한 후에 게임을 실행하면 아래와 같이 값이 표시된다.
- Visible : 단순히 값을 보여주기 위한 설정
- InstanceOnly : 인스턴스(게임) 실행 중에 보임
BodyColor에 VisibleInstanceOnly를 설정한 결과이다. 하지만 이것만 설정한다고해서 Replicated 속성을 사용할 수 있는 것이 아니다. (이대로 빌드하면 에러메시지가 발생한다.)
Replicated 속성을 사용하기 위해서는 GetLifetimeReplicatedProps() 함수에 Replicated할 속성값을 등록해줘야만 정상적으로 빌드를 할 수 있다.
그리고 DOREPLIFETIME은 [#include "Net/UnrealNetwork.h"]헤더를 사용하므로 까먹지말고 추가해주자.
참고로 해당 코드를 따라가보면 AActor에는 이미 override된 상태로 선언되어 있으므로 header에 별도의 선언없이 그냥 선언해서 사용해도 잘 작동한다. 랜덤하게 색깔을 변경하는 코드를 우선 아래와 같이 Constructor 에서 적용해보자.
Constructor에서는 ConstructorHelpers를 사용해서 UObject를 읽어온다. 이후 실행해보면 아래와 같이 될 것이다.
왜 서로 색깔이 다르게 보이는 것일까? 이유는 Constructor에서 BodyColor를 지정했다는데 있다. Actor(Pawn)의 Constructor에서는 아직 Server와 연결되어 있지 않은 상태이기 때문이다.
접속 프로세스는 아래 문서를 참고하자
https://docs.unrealengine.com/ko/Gameplay/Networking/Server/index.html
그렇다면 서버에 접속한 상태에서 실행시켜주면 제대로 색깔이 공유되겠다는 것을 쉽게 추측해볼 수 있다. 그러므로 Constructor에 구현해두었던 BodyColor를 바꾸는 로직을 BeginPlay로 옮겨보자.
Constructor가 아니므로 LoadObject를 통해 가져오면 된다.
'게임엔진 > Unreal' 카테고리의 다른 글
[Unreal] Construction Script (0) | 2022.12.15 |
---|---|
[Unreal] 클래스 블프 및 메쉬, 텍스처 등 로딩 Finder (0) | 2022.12.03 |
[Unreal] 디버깅용 드로워 이용 방법 (Draw Debug) (0) | 2022.11.22 |
[Unreal] UI(위젯)에서 메인 캐릭터 가져오기 (0) | 2022.11.19 |
[Unreal] 포인터 널 체크는 조심히 하도록 하자 (0) | 2022.10.21 |