Epic Online Service?
언리얼 엔진에서 멀티플레이를 구현하는 방법으로 데디케이티드 서버(Dedicated Server), 리슨 서버(Listen Server) 등의 방식이 있지만, 실제로 이를 불특정 다수의 플레이어가 접속할 수 있도록 만들려면 NAT 우회, 포트 포워딩 등의 네트워크 설정이 필요하다. 이는 우리가 일반적으로 접하는 상용 멀티플레이 게임과는 차이가 있다.
규모가 큰 멀티플레이 게임은 자체 전용 서버를 구축하거나 하이브리드 방식(P2P + 매치메이킹 서버 활용)을 사용하지만, 인디 게임이나 규모가 작은 멀티플레이 게임의 경우 언리얼 엔진 개발사인 Epic Games에서 제공하는 EOS(Epic Online Services)를 활용할 수 있다.EOS는 로그인, 클라우드 저장(Cloud Storage), 매치메이킹, 보이스 채팅, 안티 치트 등의 기능을 제공하여, 별도의 서버를 구축하지 않고도 손쉽게 멀티플레이 환경을 구축할 수 있도록 돕는다. 본 시리즈 에서는 이 EOS를 어떻게 Unreal 5 프로젝트에 사용하는지에 대해 다루도록 하겠다.
Project Setup
프로젝트 플러그인 활성화
우선 프로젝트를 생성하고 EOS 관련 Plugin을 활성화한다.
개발자 포털 등록
에픽 게임즈 개발자 포털에서 등록을 먼저 해야한다. 에픽 게임즈 계정을 사용하지만 2단계 인증이 필요하다.
2단계 인증을 마친 계정으로 개발자 포털에 처음 들어가면 조직을 생성하라고 한다.
조직생성을 하고 나면 맨 처음 만나는 창에서 제품 생성 버튼을 눌러 원하는 이름의 프로젝트를 생성한다.
생성된 프로젝트의 설정 버튼을 눌러 관리 페이지로 들어간다.
프로젝트 관리 페이지의 클라이언트 탭에서 클라이언트 섹션 버튼을 눌러 약관 동의를 해준다.
약관 동의를 마치면 제품 설정 페이지가 다음과 같이 바뀐다.
새 클라이언트 정책 추가 버튼을 눌러 다음과 같이 클라이언트 정책과 해당 클라이언트 정책을 사용하는 클라이언트를 추가한다.
그 다음 에픽 계정 서비스에서 애플리케이션을 생성하기 버튼을 눌러 애플리케이션을 생성한다.
생성된 애플리케이션을 다음과 같이 설정해준다.
이제 EOS를 사용할 사전 준비는 끝났다. 다시 왼쪽 메뉴의 제품 설정 창으로 돌아오면 이제 다음과 같이 프로젝트의 고유키들이 준비되어 있는 것을 볼 수 있다.
이제 이 키값을 사용해서 언리얼의 프로젝트 세팅의 EOS 플러그인에서 관련 설정을 추가해준다.
ProductId | 제품 ID |
SandboxId | 샌드박스 ID |
DeploymentId | 디폴로이 ID |
ClientId | 클라이언트 ID |
ClientSecret | 클라이언트 비밀키 |
각각에 대칭되는 ID를 EOS SDK 크리덴셜에서 붙여넣기를 하면 되는데 ClientEncryptionKey 얘는 해당하는 ID를 찾을 수 없을 것이다. 이 칸에는 복구와 같은 작업을 위해 입력하는 암호 라고 생각하면 된다. 문제는 1q2w3e! 같은 패스워드를 입력하는게 아니라 길이 64 짜리 영어+숫자 조합을 입력해야 하는데 무작위 16진수 생성기이런데서 64길이짜리 16진수를 생성해서 입력한다음에 어디 저장해놓거나 하면 된다.
// 예시
ClientEncryptionKey=8447403366f7ee0ad91e9852deebe63abd178a27c768cd5f9b8aa3ad37387f80
마지막으로 .Build.cs 와 DefaultEngine.ini에 EOS 사용에 필요한 모듈을 추가하면 EOS를 사용하기 위한 사전 작업은 끝이다.
MyPoject.Build.cs
PublicDependencyModuleNames.AddRange(new string[] { "OnlineSubsystemEOS", "OnlineSubsystem", "OnlineSubsystemUtils" });
DefaultEngine.ini
[OnlineSubsystemEOS]
bEnabled=true
[OnlineSubsystem]
DefaultPlatformService=EOS
[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemEOS.NetDriverEOS",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")