# 线上子系统

此文为Online Subsystem (opens new window)的原创翻译,本文内容版权归原文所有,仅供学习,如需转载望注本文地址,翻译不易,谢谢理解。

线上子系统和它的接口提供了一个获取线上服务(比如Steam,Xbox Live,Facebook等等)的通用方法。在游戏中它能在多个平台上工作,得到很多线上服务的支持,线上子系统确保了开发需要做的唯一的改变就是对每个被支持服务的配置调整。

# 设计哲学

线上子系统从根本上是被设计成和线上的众多服务进行异步通信。因为网络连接的速度,服务器延迟和后端服务的运行时间对于本地机器来说都是未知的,和这些系统交互会花费未知的时间。为了处理这些,线上子系统对所有远程操作使用委托,然后确保这些委托在一个受支持的,异步通信特性被使用时调用,还提供在回调完成时发回回应和快速的请求。委托也提供了一个单一代码路径,为开发者移除了因为针对不同的成功和失败情况来编写特定代码的需要。

模块,面向具体服务的接口将支持的特性聚集起来,比如,Friends接口处理和朋友列表相关的所有事,Achievements接口处理展示,检查,奖励成就等等。每个特性的接口为了将其所支持的在线服务聚集起来而存在,尽管一个服务不支持的具体函数可能只返回false,这样的设计确保了开发者能为所有的线上服务写同样的代码。

在更高层,更复杂的操作使用Online Asynchronous Task Manager (opens new window)来支持连续的任务,或者运行在不同线程上的任务。异步任务能描述它们的依赖,让不相关的任务能平行地独立运行,尽管连续任务会连续地运行。所有线上子系统的所有接口为了操作的一致性都以这样的方式安排任务。

# 基础结构和用法

基础模块OnlineSubsystem定义和注册了引擎里的面向具体服务的模块,在初始化过程中,线上子系统会尝试加载Engine.ini文件里默认的线上服务模块,要获取一个线上服务都要经过这个模块。

[OnlineSubsystem]
DefaultPlatformService=<Default Platform Identifier>
1
2

如果成功,默认的线上子系统将在没有参数指定时通过静态访问器访问。

static IOnlineSubsystem* Get(const FName& SubsystemName = NAME_None)
1

当这个函数被调用使用其他服务时,这些服务按需加载,在加载模块时无效的标识符或错误都会优雅的返回null。

# 接口

下面这些接口被包含在线上子系统里。

接口 特性描述
Achievements (opens new window) 列出游戏的所有成就,解锁成就,检查你自己或其他人没有解锁的成就。
External UI (opens new window) 打开面向具体硬件平台或在线服务的内置用户界面,在一些情况中,服务仅允许通过该接口来获取某些核心特性。
Friends (opens new window) 和朋友,朋友列表相关的任何事,比如添加用户到你的好友列表,拉黑或不拉黑用户,显示你拥有的在线好友。
Leaderboard (opens new window) 获取在线排行榜,包括注册你自己的分数或时间,从你的朋友列表或世界中的玩家检查分数排行榜。
Online User (opens new window) 手机用户的元数据。
Presence (opens new window) 设置用户对其他用户显示在线状态,比如"在线","离开","玩游戏中"等等。
Purchase (opens new window) 在游戏中完成购买,回顾过去购买的东西。
Session (opens new window) 创建,释放和管理在线游戏的Session,也包括查找和匹配系统。
Store (opens new window) 检索分类和游戏中能购买的东西。
User Cloud 给每个用户云文件存储提供接口。