Online Subsystem Steam

Online Subsystem Steam的概述,包括如何设置项目以在Valve的Steam平台上分发。

Windows
MacOS
Linux

Contributors:Valve

Online Subsystem Steam API 使您可以将虚幻引擎4(UE4)应用程序发布到Valve的Steam平台Steam 模块的主要目的是帮助您通过一组功能(如媒介和通栏广告)将应用程序分发给Steam用户。 此外,Steam模块实现多个由Online Subsystem 公开的接口,支持Steamworks Software Development Kit(SDK)提供的大多数功能。

部分可用的Steam接口包括:

  • Matchmaking(Lobbies和GameServer API)

  • Leaderboards

  • Achievements

  • Voice

  • UserCloud

  • SharedCloud

  • External UI

请参考Online Subsystem Steam API参考 以了解当前可用的Steam接口的更完整列表。

满足Valve的要求

Steam Subsystem需要通过Valve Steamworks 进行额外设置。 请联系Valve 并参考Steamworks SDK文档 以确保您的应用程序满足Valve的要求,然后再尝试将Steam与UE4一起使用。

下载Steamworks

如果您的应用程序满足Valve的要求,请继续并下载最新版Steamworks SDK 。 SDK需要解压并复制到/YourUnrealEnginePath/Engine/Source/ThirdParty/Steamworks/Steam[当前版本]/sdk

如果要更新项目的Steamworks SDK,请确保更新项目Steamworks路径中的[当前版本]
/YourUnrealEnginePath/Engine/Source/ThirdParty/Steamworks/Steam[当前版本]/sdk
您还需要更新`Steamworks.build.cs,它位于项目目录中。<br /><picture> <source data-srcset="./../../../../Images/ProgrammingAndScripting/Online/Steam/SteamworksCSFile.webp"> <img class=" lazyload" alt="SteamworksCSFile.png" data-src="./../../../../Images/ProgrammingAndScripting/Online/Steam/SteamworksCSFile.jpg" /> </picture> <br />在本示例中,[当前版本]格式为`v139

编译UE4

如果您从源代码编译虚幻引擎4 ,应采取以下步骤:

  1. 打开"OnlineSubsystemSteamPrivatePCH.h"(位于"..\..\Plugins\Online\OnlineSubsystemSteam\Source\Private\"中),在这里您会看到以下代码,这行代码定义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复制到相应的文件夹。如果您想要根据源代码重新编译引擎,还需要将SDK放在合适的位置。现在,将相关的可重新分发文件从SDK istributable_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

只有在显式链接不允许为专用服务器版本使用 "-force_steamclient_link" 标签时,才会需要 tier0_s.dllvstdlib_s.dll 文件。客户端版本永远不会需要这些文件。

在UE4 4.22及更早版本中: /YourUnrealEnginePath/EngineOrGameFolder/Binaries/Mac/YourGame.app/Contents/MacOS

  • libsteam_api.dylib (from /redistributable_bin/osx32 - the dynamic library (*.dylib) has both 32 and 64 bit support)

从UE4 4.23版本开始,Mac用户还必须运行以下命令: /YourUnrealEnginePath/Engine/Binaries/ThirdParty/Steamworks/Steam[Current Version]/Mac/

  • libsteam_api.dylib, generated by running the following command:

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

Linux用户必须随可执行文件一起链接并分发以下文件。

/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应用ID

所有使用Steam Online Subsystem的游戏都必须有有效的应用程序ID,因为如果Steamworks API不知道您应用程序的Steam应用ID,就无法初始化。 在初始化Steam之前,UE4将生成`steam_appid.txt(在正常关闭引擎时,UE4会删除这个文件)。 需要注意的是,steam_appid.txt`必须位于应用程序可执行文件所在的目录,因为Steam将在当前工作目录寻找这个文本文件。 此外,该文件不应包含在任何Steam映像中。

如果您打开`steam_appid.txt`,将会看到 **SteamDevAppId** 条目,这个字段向Steam暗示应用程序ID。 这样就无需使用Steam客户端(尽管它必须运行)启动游戏。

如果想要测试应用程序,可以使用 SteamDevAppId 480,这是所有开发者共享的测试应用ID。 虽然您可以使用之前提到的测试应用ID来测试大都数Steam接口,但应用程序需要有Steam应用ID才能发布。

发布构建版

在发布构建版时,引擎会检查以确保登录用户正确订阅了游戏,如果引擎测试返回false,则会关闭(这是帮助保护游戏的一种方式)。 此外,使用Steam DRM(请参阅Steamworks SDK)应进一步保护游戏不被篡改。

配置应用程序设置

如果您使用 虚幻项目浏览器 创建新项目,那么`DefaultEngine.ini`中应该没有 Online Subsystem 设置;但如果您要修改我们的某个样本项目,则 Online Subsystem 设置可能已经存在。

现在,您已经为应用程序设置了Steamworks SDK(同时设置Steam应用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,请参考我们的样本项目库。

完成的设置

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网站上的合作伙伴文档

大厅细节

大厅实质上是Steam的后端服务上的聊天室,作为点对点实例存在。与服务器不同,在加入前无法获得如ping时或当前其他用户数等大厅相关信息。其通常用于聆听服务器。要设置大厅,将 bUsesPresence 标志设为 true

服务器细节

要设置服务器实例,将 bUsesPresence 标为 false。专用服务器需要以下三种宏,均须与合作伙伴面板(位于Steam专用服务器工具页面)上的值匹配。如此类值不匹配,Steam网络将不显示专用服务器:

UE4宏

Steam命名

说明

UE4_PROJECT_STEAMPRODUCTNAME

STEAMPRODUCTNAME

Valve建议将此设为版本ID,通常使用AppID(字符串形式)或无额外符号的简略产品名。

更改此字段(如更新版本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的合作伙伴文档

Steam在线验证

Steam使用一种特殊的验证系统,用于控制对平台提供的部分独特服务器相关功能的访问,如广告服务器和玩家计数、检索禁令列表和做出反应(发行商和Valve反作弊禁令)和执行许可证检查。 虚幻引擎4允许通过`FOnlineAuthSteam`类与这个功能连接。 应用程序设置为使用Steam Online Subsystem后,就可以启用 SteamAuth 包处理程序组件来利用这些功能。

启用SteamAuth

要启用SteamAuth,并将以下内容添加到"DefaultEngine.ini"或者针对每一个打算支持Steam在线验证的平台,添加到特定于平台的引擎.ini文件(如"WindowsEngine.ini"、"LinuxEngine.ini"或"MacEngine.ini"):

[PacketHandlerComponents]
+Components=OnlineSubsystemSteam.SteamAuthComponentModuleInterface

启用后,就可以使用Steam Online Subsystem接口(SteamOSS)功能`GetAuthInterface`来访问SteamAuth功能。

启用SteamAuth将会使应用程序对所有加入的玩家运行验证程序(针对Steam服务)。默认情况下,SteamAuth将没有通过这项检查的玩家踢出游戏,但这个行为可以被覆盖。

SteamAuth委托

SteamAuth系统中有两个开发者可能希望覆盖的委托:OverrideFailureDelegate`和`OnAuthenticationResultDelegate

当玩家尝试加入服务器而没有通过Steam验证时,或者玩家在会话期间失去了Steam验证,通过玩家的`FUniqueNetId`调用`OverrideFailureDelegate`。 默认情况下,SteamAuth会将玩家踢出游戏。 但是,如果该委托受到约束,则默认行为将被暂停,因此开发者必须在仍需要这个行为时手动将玩家踢出。

`OnAuthenticationResultDelegate`处理来自Steam验证服务的响应,提供玩家的`FUniqueNetId`和一个指示验证尝试是否成功的布尔值。

附加提示

使用IPNetDriver

UE4的Steam OSS默认将Steam网络用作默认套接字子系统。在4.22版中,可通过将 OnlineSubsystemSteam.bUseSteamNetworking 设为 false 禁用此行为。要进行此操作,请将以下代码添加到"DefaultEngine.ini",或者各支持平台的平台特定引擎.ini文件(如"WindowsEngine.ini"、"LinuxEngine.ini"或"MacEngine.ini"):

[OnlineSubsystemSteam]
bUseSteamNetworking=false

在4.22之前的版本中,修改调用 RegisterSocketSubsystem 函数的 SocketSubsystemSteam.cpp,将 布尔 参数改为 false。同时还需在项目配置文件中修改网络驱动。

模块设置

确保将虚幻引擎Steam模块作为项目的一部分包含进去(请参阅UnrealBuildTool目标哦文件 以获取更多帮助)。 具体而言,在`mygame.build.cs`的构造函数中添加以下行应足以确保随着游戏构建Steam模块。

DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");

Steam Overlay on Mac

Steam Overlay on Mac要求通过Steam客户端启动游戏。为此,需要先使用Steam"游戏"菜单中的"将非Steam游戏添加到我的库"选项来将游戏添加到库。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback