온라인 서브시스템 Steam

온라인 서브시스템 Steam 에 대한 개요와, Valve 의 Steam 플랫폼에서 배포용 프로젝트 셋업 방법을 알려드립니다.

Windows
MacOS
Linux

기여자: Valve

온라인 서브시스템 Steam API 를 통해 언리얼 엔진 4 (UE4) 애플리케이션을 Valve 의 Steam 플랫폼 에 출시하는 것이 가능합니다. Steam 모듈의 주 목적은 Steam 사용자들에게 (매치메이킹이나 리더보드같은) 피처 세트가 포함된 애플리케이션을 쉽게 배포할 수 있도록 하기 위함입니다. 추가적으로, Steam 모듈은 Online Subsystem 으로 노출된 인터페이스를 다수 구현하여, Steamworks Software Development Kit (SDK) 에 제공된 것을 대부분 지원합니다.

사용가능한 Steam Interface 몇 가지는 다음과 같습니다:

  • Matchmaking (매치메이킹, 로비 및 GameServer API)

  • Leaderboard (리더보드)

  • Achievement (업적)

  • Voice (음성)

  • UserCloud (유저 클라우드)

  • SharedCloud (공유 클라우드)

  • External UI (외부 UI)

현재 사용가능한 Steam Interface 전체 목록은 Online Subsystem Steam API Reference 문서를 참고하세요.

Valve 요구사항 충족

Steam Subsystem 은 Valve Steamworks 를 통한 추가 셋업이 필요합니다. Valve 에 연락 및 Steamworks SDK Documentation 을 참고하여 애플리케이션이 Valve 의 요구사항에 맞는지 확인한 후 UE4 로 Steam 작업을 하시기 바랍니다.

Steamworks 다운로드

애플리케이션이 Valve 의 요구사항에 맞는다면, 계속해서 Steamworks SDK 최신 버전을 다운로드합니다. SDK 압축을 풀어 /YourUnrealEnginePath/Engine/Source/ThirdParty/Steamworks/Steam[Current Version]/sdk 위치로 복사해야 합니다.

프로젝트의 Steamworks SDK 를 업데이트하면, 프로젝트의 Steamworks 경로에서 [Current Version] 부분도 업데이트해 줘야 합니다:
/YourUnrealEnginePath/Engine/Source/ThirdParty/Steamworks/Steam[Current Version]/sdk
프로젝트 디렉터리에 위치한 Steamworks.build.cs 파일 역시 업데이트해 줘야 할 것입니다.
SteamworksCSFile.png
이 예제에서 [Current Version] 포맷은 v139 입니다.

UE4 컴파일

소스에서 UE4 를 컴파일 하는 방법은 다음과 같습니다:

  1. ("..\..\Plugins\Online\OnlineSubsystemSteam\Source\Private\" 에 위치한) "OnlineSubsystemSteamPrivatePCH.h" 를 엽니다. 여기서 Steamworks SDK 루트 위치를 정의하는 다음과 같은 코드 줄을 찾을 수 있습니다:

    #define STEAM_SDK_ROOT_PATH TEXT("Binaries/ThirdParty/Steamworks")
  2. 이 줄을 다음과 같이 변경하면 됩니다:

    #define STEAM_SDK_VER TEXT("Steam[Current Version]")

Steamworks SDK 셋업

미리 컴파일된 엔진 버전에 대해 Steam 을 사용하기 위해서는, Valve 의 SDK 에서 동적으로 링크된 라이브러리 (dll) 파일 몇 개를 올바른 폴더에 복사해 주기만 하면 됩니다. 소스에 대해 엔진을 리컴파일하려는 경우, SDK 역시 제 위치에 있어야 합니다. 이제, SDK 의 /redistributable_bin/ 디렉터리에서 관련된 재배포 파일을 다음 위치로 복사하면 됩니다:

64 비트 라이브러리 중 몇몇은 Steam 클라이언트 디렉터리에서 찾을 수 있습니다 (이 글 작성 시점에서 Valve 는 SDK 에 모든 라이브러리르 포함하지 않은 상태입니다).

/YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[Current Version]/Win64

  • steam_api64.dll

  • steamclient64.dll

  • tier0_s64.dll

  • vstdlib_s64.dll

/YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[Current Version]/Win32

  • steam_api.dll

  • steamclient.dll

  • tier0_s.dll

  • vstdlib_s.dll

tier0_s.dllvstdlib_s.dll 파일 둘 다 데디케이티드 서버 빌드용으로 "-force_steamclient_link" 플래그를 통해 링크시켜 줄 때만 필요합니다. 클라이언트 빌드에서는 전혀 필요하지 않은 파일입니다.

UE4 버전 4.22 이전에서: /YourUnrealEnginePath/EngineOrGameFolder/Binaries/Mac/YourGame.app/Contents/MacOS

  • libsteam_api.dylib (있는 위치: /redistributable_bin/osx32 - 동적 라이브러리 (*.dylib) 는 32 비트 및 64 비트 둘 다 지원합니다.)

UE4 버전 4.23 부터 Mac 사용자는 반드시 다음 명령도 실행해야 합니다: /YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[Current Version]/Mac/

  • libsteam_api.dylib, 다음 명령을 실행하여 생성합니다:

    install_name_tool -id @rpath/libsteam_api.dylib /redistributable_bin/osx32/libsteam_api.dylib

Linux 사용자는 실행파일과 함께 다음 파일을 link 하여 ship 해야 합니다.

/YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[Current Version]/i686-unknown-linux-gnu/libsteam_api.so

  • redistibutable_bin/linux32/libsteam_api.so

/YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[Current Version]/x86_64-unknown-linux-gnu/libsteam_api.so

  • redistibutable_bin/linux64/libsteam_api.so

Steam App ID

Steam 온라인 서브시스템을 사용하는 모든 게임은 유효한 애플리케이션 ID 가 있어야 하는데, 애플리케이션의 Steam App ID 를 알지 못하면 Steamworks API 초기화가 되지 않기 때문입니다. Steam 초기화 전, UE4 는 steam_appid.txt 를 생성합니다 (엔진 정상적인 종료 도중 UE4 는 이 파일을 삭제합니다). 한 가지 중요한 점은 steam_appid.txt 가 실행파일과 같은 디렉터리에 있어야 합니다. Steam 에서는 현재 작업 디렉터리에서 그 텍스트 파일을 찾기 때문입니다. 추가적으로, 이 파일을 Steam 이미지에 포함시켜서는 안됩니다.

steam_appid.txt 파일을 열면, SteamDevAppId 항목이 보이는데, 이 칸을 통해 애플리케이션 ID 를 Steam 에 알립니다. 그렇게 하면 Steam 클라이언트를 (반드시 실행중이기는 해야 하지만) 통해 게임을 실행시키지 않아도 됩니다.

애플리케이션을 테스트하려면, SteamDevAppId480 으로 하면 됩니다. 모든 개발자에 공유되는 테스트 App ID 입니다. 위의 테스트 App ID 로 Steam Interface 대부분을 테스트할 수는 있지만, 애플리케이션 출시를 위해서는 Steam APP ID 가 필요합니다.

Shipping 빌드

shipping 빌드에서 엔진은 로그인된 유저가 게임에 제대로 가입되어 있는지 체크한 뒤, 엔진 테스트에서 false 를 반환하면 중단됩니다. 추가적으로 Steam DRM 을 사용하면 (Steamworks SDK 참고) 게임 변경을 한 층 더 방지할 수 있습니다.

애플리케이션 세팅 환경설정

언리얼 프로젝트 브라우저 를 사용하여 새 프로젝트를 만드는 경우, Online Subsystem 세팅은 DefaultEngine.ini 에 있지 않을 것입니다. 하지만 Sample Project 중 하나를 변경해서 쓴다면, Online Subsystem 세팅이 이미 존재할 것입니다.

애플리케이션에 대한 Steamworks SDK (및 Steam App ID 도) 셋업이 완료되었으니, 애플리케이션 세팅 환경설정을 통해 Online Subsystem Steam 을 사용할 준비가 되었습니다.

단계

  1. 우선 애플리케이션의 DefaultEngine.ini 파일을 열고 다음 세팅을 추가합니다:

    [/Script/Engine.GameEngine]
    +NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

    NetDriverDefinitions 는 다음과 같은 프로퍼티와 함께 UE4 에서 사용할 수 있는 넷 드라이버를 설명합니다:

    • DefName 은 넷 드라이버 정의 고유 이름입니다.

    • DriverClassName 은 주요 넷 드라이버의 클래스 이름입니다.

    • DriverClassNameFallBack 은 주요 넷 드라이버 클래스의 초기화에 실패한 경우 사용할 예비 넷 드라이버의 클래스 이름입니다.

  2. UE4 가 Online Subsystem Steam 을 사용하도록 하려면, 다음 세팅을 추가합니다:

    [OnlineSubsystem]
    DefaultPlatformService=Steam
  3. UE4 에 애플리케이션이 Steam Online Subsystem 을 사용하고싶다 알렸으니, OnlineSubsystemSteam 모듈 환경설정은 다음 세팅을 추가하면 됩니다:

    [OnlineSubsystemSteam]
    bEnabled=true
    SteamDevAppId=480
  4. 마지막으로, 애플리케이션 연결을 위한 넷 드라이버에 Steam 클래스를 지정해 줘야 합니다:

    [/Script/OnlineSubsystemSteam.SteamNetDriver]
    NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"

최종 결과

이 간략 안내를 마친 이후 애플리케이션의 DefaultEngine.ini 파일은 다음 세팅 블록같아 보일 것입니다. 다른 프로젝트에서 Online Subsystem 을 셋업하고 사용한 방법을 살펴보려면, Sample Project 라이브러리를 참고하세요.

완성 세팅

DefaultEngine.ini

[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

[OnlineSubsystem]
DefaultPlatformService=Steam

[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480

[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"

서버 및 로비

Steam 은 로비를 통한 (데디케이티드 및 리슨 서버 게임 양쪽에) 피어 투 피어 매치메이킹을 지원하며, 데디케이티드 서버 실행 기능을 제공합니다. 로비에서 사용자는 게임 서버 관련 정보를 배울 수 있으며, 보통 리슨 서버 게임의 경우 플레이 중인 맵이나 모드같은 게임 관련 정보를 전달하는 데 쓰입니다. 매치메이킹 시스템을 통해 참가하지 않고도 로비에 접속한 다른 사용자 수를 확인할 수도 있습니다. 데디케이티드 서버는 로비와 별도의 바이너리 파일인데, 그 작업이 게임의 서버 측 부분을 실행하고 호스팅하는 것이기 때문입니다. Steam 의 기능, 구현, 또는 개발자 인터페이스 관련 자세한 정보는 Steam 사이트의 partner documentation 페이지를 참고하세요.

로비 세부 정보

로비는 사실 Steam 의 백엔드 서비스 상에 피어 투 피어 인스턴스로 존재하는 채팅방입니다. 서버와는 달리, 핑 시간이나 현재 다른 사용자 수와 같은 로비 관련 정보는 참가하기 전 알 수 없습니다. 일반적으로 리슨 서버에 사용됩니다. 로비를 구성하려면, bUsesPresence 플래그를 true 로 설정합니다.

서버 세부 정보

서버 인스턴스를 구성하려면, bUsesPresence 플래그가 false 인지 확인합니다. 데디케이티드 서버는 다음 세 개의 매크로가 필요하며, 이 세 개 모두 Steam 의 데디케이티드 서버 툴 페이지의 파트너 패널에 있는 값과 일치해야 합니다. Steam 네트워크는 이 값이 일치하지 않으면 데디케이티드 서버를 표시하지 않습니다.

UE4 매크로

Steam 이름

설명

UE4_PROJECT_STEAMPRODUCTNAME

STEAMPRODUCTNAME

보통 (스트링으로 된) AppID, 또는 복잡한 기호 없이 간단한 제품명을 사용하는 것이 일반적이지만, Valve 에서는 빌드 ID 를 사용할 것을 권장합니다.

이 필드를 변경하면, 예를 들어 빌드 ID 를 업데이트하는 경우, Steam 은 매치메이킹에 이전 이름의 모든 활성 서버를 무시하므로, 직접 파트너 백엔드의 툴 정보를 수정해야 합니다.

UE4_PROJECT_STEAMGAMEDIR

STEAMGAMEDIR

보통 게임의 폴더명이며, 공백이나 기호는 포함되지 않습니다. 반드시 폴더명일 필요는 없지만 공백이나 기호가 있어서는 안됩니다.

UE4_PROJECT_STEAMGAMEDESC

STEAMGAMEDESC

Valve 에서는 프로젝트 전체 이름으로 설정할 것을 권장합니다.

UE4_PROJECT_STEAMSHIPPINGID

N/A

UE4 버전 4.22 이상에서 Steam 외부 실행하려면, 이 매크로에 제품의 Steam ID 가 포함되어야 합니다.

UE4 버전 4.22 에서는 게임의 Target.cs 파일에 이 값을 지정해야 합니다. UE4_PROJECT_STEAMSHIPPINGID 정의에 Steam ID 를 작성할 수도 있습니다. 모든 빌드 구성에 필수이며, 없는 경우 Steam 외부에서 실행할 수 없습니다.

4.22 이전 버전의 경우, OnlineSessionAsyncServerSteam.cpp 를 편집하여 게임의 값을 포함하도록 합니다.

데디케이티드 서버 빌드를 배포하는 방법 관련 정보는, Steam's partner documentation 를 참고하세요.

Steam 온라인 인증

Steam 의 특수 인증 시스템은 플랫폼이 제공하는 고유 서버 관련 기능 몇 가지에 대한 액세스를 제어하는데, 예를 들면 서버 광고와 플레이어 수, 추방 목록 (퍼블리셔와 Anti-Cheat 둘 다) 확인 및 대응, 라이선스 검사 등입니다. 언리얼 엔진 4 는 FOnlineAuthSteam 클래스를 통해 이 기능과의 인터페이스를 제공합니다. 애플리케이션이 Steam 온라인 서브시스템을 사용하도록 구성되면, SteamAuth 패킷 핸들러 컴포넌트를 활성화하는 것으로 그 기능을 활용할 수 있습니다.

SteamAuth 활성화

SteamAuth 를 활성화하려면, "DefaultEngine.ini" 또는 Steam Online Authentication 을 지원하려는 플랫폼에 대한 엔진 .ini (예로 "WindowsEngine.ini", "LinuxEngine.ini", "MacEngine.ini") 파일에 다음과 같이 추가합니다.

[PacketHandlerComponents]
+Components=OnlineSubsystemSteam.SteamAuthComponentModuleInterface

활성화하면, Steam Online Subsystem 인터페이스 (SteamOSS) 함수 GetAuthInterface 를 사용하여 SteamAuth 함수 기능에 액세스할 수 있습니다.

SteamAuth 는 애플리케이션이 참가한 모든 플레이어에 대해 (Steam 서비스의) 인증 프로세스를 실행하도록 합니다. 기본적으로 SteamAuth 는 이 검사를 통과하지 못한 플레이어를 추방하지만, 그 동작을 오버라이드할 수 있습니다.

SteamAuth 델리게이트

SteamAuth 시스템에서 개발자가 오버라이드할 수 있는 델리게이트는 두 가지, OverrideFailureDelegateOnAuthenticationResultDelegate 입니다.

플레이어가 Steam 인증 없이 서버에 참가 시도하거나, 그 플레이어가 세션 도중 Steam 인증을 잃으면 그 플레이어의 FUniqueNetId 와 함께 OverrideFailureDelegate 를 호출합니다. 기본적으로, SteamAuth 는 그 플레이어를 게임에서 추방합니다. 하지만 이 델리게이트가 바인딩된 경우 기본 동작은 일시 중단이며, 그 동작을 그대로 유지하려면 개발자가 플레이어를 수동으로 추방하면 됩니다.

OnAuthenticationResultDelegate 는 Steam 의 인증 서비스에서의 반응을 처리하여, 플레이어의 FUniqueNetId 와 인증 시도 성공 여부를 나타내는 부울 값을 제공합니다.

추가 참고사항

IPNetDriver 사용

기본적으로 UE4 의 Steam OSS 는 Steam Networking 을 기본 소켓 서브시스템으로 사용합니다. 4.22 에서 이 동작을 비활성화하려면 OnlineSubsystemSteam.bUseSteamNetworkingfalse 로 설정하면 됩니다. 그 방법은, "DefaultEngine.ini" 또는 지원하려는 플랫폼별 엔진 .ini (예: "WindowsEngine.ini", "LinuxEngine.ini", "MacEngine.ini") 파일에 다음과 같이 추가합니다:

[OnlineSubsystemSteam]
bUseSteamNetworking=false

4.22 이전 버전의 경우, SocketSubsystemSteam.cpp 를 수정하여 RegisterSocketSubsystem 함수가 호출되는 부분의 bool 파라미터를 false 로 변경하면 됩니다. 프로젝트의 구성 파일에서 넷 드라이버도 변경해 줘야 합니다.

모듈 셋업

반드시 Unreal Engine Steam 모듈을 프로젝트 일부로 포함시켜야 합니다 (자세한 도움말은 UnrealBuildTool 타깃 파일 문서를 참고하세요). 구체적으로는, mygame.build.cs 생성자에 다음 줄을 추가해 주는 정도면 게임에 Steam 모듈을 포함하여 빌드하도록 하는 데 충분할 것입니다.

DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");

Steam Overlay on Mac

Steam Overlay on Mac 은 Steam 클라이언트를 사용하여 게임을 실행시켜야 합니다. 그러기 위해서는, Steam 의 "Game" 메뉴에서 "Add a Non-Steam Game to My Library" 옵션을 사용하여 라이브러리에 게임을 추가해야 합니다.

Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼