联系我们

广州分部

地址:广州国际金融中心 54层29号

电子邮箱:contactcn@improbable.io

SpatialOS:助您自由地设计、制作和运行游戏的平台

什么是 SpatialOS?

SpatialOS 是一个基于云端的协助游戏制作的平台,可超越传统服务器架构的局限。可以经由我们的帮助,通过SDK、流行的引擎和您自己的工作流程来构建游戏。我们的 SpatialOS 技术把多种游戏引擎和服务器整合,创造出丰富的持续在线世界。SpatialOS 还可为您提供工具和基础架构,助您大规模快速部署游戏——您无需为运行游戏服务器费心,而可专注于寻找乐趣。

SpatialOS 平台可以实现曾经不可能的游戏玩法

更宏伟的世界

更宏伟的世界

您的玩家可以探索宏伟的无缝世界,其规模前所未有,超越了传统服务器的极限。

更持续的影响

更持续的影响

长时间维持对游戏系统进行的更改。玩家行为具有长期效应,使沉浸式游戏成为可能。

更丰富的细节

更丰富的细节

您的世界可支持大量实体,它们受实时物理效果和复杂 AI 等沉浸式重叠系统作用,从而产生互动式游戏玩法。

如何使用 SpatialOS

开发在线游戏的全新方式

使用便捷

使用便捷

SpatialOS 支持 Unity 和 Unreal 等常见游戏引擎,也可与其他第三方或专有游戏引擎整合。

开发

开发

可在您的本地主机上快速迭代游戏,打造创新的游戏设计。

部署

部署

使用我们强大的工具套件,可在 SpatialOS 平台上快速上传并运行您的游戏。

畅玩

畅玩

从一开始您就能部署您的游戏,供在线玩家体验。让您的玩家群体测试、迭代并享受游戏乐趣!

平台

平台

  • PC

  • 主机

  • VR/AR

引擎

引擎

  • Unreal

  • Unity

语言

语言

  • C++

  • C#

  • Java

技术阐述

了解更多有关 SpatialOS 的工作原理,以及它如何能帮助您开发更大型、更复杂的游戏。

传统客户端-服务器方法

传统客户端-服务器方法

在线世界或服务器分区通常受限于只在单个服务器上运行。这就限制了游戏世界的规模、可靠性和玩家数量。自行管理服务器的复杂性导致开发过程迟缓。

SpatialOS 方法

SpatialOS 方法

SpatialOS 是一个基于云端的计算平台,可助您用多个服务器和游戏引擎服务于单一世界。该平台可协调大量名为“Worker”的微服务,它们可重叠且动态重组,以构建一个巨型的无缝世界。借助该平台,您还可处理经由不同设备连接到同一世界的大量并发玩家。

您的世界由什么构成?

部署

实体

您的世界里的一切都是实体,包括 AI 生物、玩家、岩石、树木等等。SpatialOS 通过服务器集群维持这些实体的持续性。世界可以包含数百万个实体。

畅玩

组件

实体由组件组成,它们决定了实体的状态以及其他实体如何与之互动。组件由模式语言定义。借助自动生成的集成,不同的 worker 得以对其进行可视化和模拟工作。

开发

Worker

Worker 是模拟全世界实体组件的微服务。SpatialOS 可根据需求在您的世界里运行多个 worker,模拟世界里的每个组件。SpatialOS 可为您处理 worker 间的所有数据同步。

代码

如何在 SpatialOS 编写代码?

想在游戏中应用自然蔓延的燃烧系统吗?SpatialOS 演示中的这段示例代码介绍了游戏世界中实体可燃性的基本概念。SpatialOS 会同时在多个 worker 中执行这段代码,使燃烧行为影响大量实体,并且在多个在线客户端同时产生可视化效果。

// SpatialOS使用模式语言定义组件。因此组件可以用各种编程语言实现。
component Flammability {
  id = 1000;

  // 这个属性定义了这个实体的持久状态——起火
  bool is_on_fire = 1;

  // Command令Worker和其他Worker进行互动。不同的Worker可以用不一样语言编写!
  command Nothing ignite(IgniteRequest);
}

type IgniteRequest {
  // 可以包含其他参数
}
// 将添加到服务器端Unity worker的GameObject上
// 上百个服务器端的Worker可用于同一个世界中
class PropagateFlamesBehaviour : MonoBehaviour {

  // FlammabiiltyWrier是由SpatialOS模式语言编译器生成和注入的代码
  [Require] private Flammability.Writer flammabilityWriter;

  void OnEnable() {
      // 设置一个Ingnite command的handler
      flammabilityWriter.CommandReceiver.OnIgnite.RegisterResponse(HandleIgnite);
  }

  // 当在燃烧的GameObject周围的触发器与另一个实体相交
  void OnTriggerEnter(Collider other) {
      if (flammabilityWriter.Data.isOnFire) {
          // SpatialOS RPC会发送到正在模拟该组件的worker
          SpatialOS.Commands.SendCommand(flammabilityWriter,
              Flammability.Commands.Ignite.Descriptor,
              new IgniteRequest(),
              other.gameObject.EntityId());
      }
  }

  private Nothing HandleIgnite(Nothing request, ICommandCallerInfo callerinfo) {
      if (!flammabilityWriter.Data.isOnFire) {
          flammabilityWriter.Send(new Flammable.Update().SetIsOnFire(true));
      }
      return new Nothing();
  }

  void OnDisable() {
      flammabilityWriter.CommandReceiver.OnIgnite.DeregisterResponse();
  }
}
// 会加在客户端Unity worker的GameObject上
// 会有任意数量的Unity客户端执行这些代码
class FlamesVisualizer : MonoBehaviour {

    // FlammabilityReader是由SpatialOS模式语言编译器生成和注入的代码
    [Require] private Flammability.Reader flammabilityReader;

    // 这将引用GameObject上的ParticleSystem
    public ParticleSystem particles;

    void OnEnable() {
        // 点燃火后重新可视化
        flammabilityReader.IsOnFireUpdated.Add(UpdateVisualization);
        UpdateVisualization(flammabilityReader.Data.isOnFire);
    }

    void UpdateVisualization(bool isOnFire) {
        // 根据需要启用ParticleSystem
        if (isOnFire) {
            particles.Start();
        } else {
            particles.Stop();
        }
    }
}

加入 Improbable 全新的广州分部