你好,请选择
语言
关闭

自从我们在 2018 年 4 月推出第一版 Decentraland SDK 以来,已经有许多项目在使用它开发 Decentraland 交互式内容。感谢来自我们社区和合作伙伴的这些早期用户,我们收到了许多针对有关如何扩展和改进 SDK 的非常诚恳的反馈。

我们发现主要有两类人使用 SDK:Web 开发人员和游戏开发人员。 我们收到反馈表明,对于这两种类型的开发人员来说,使用我们 alpha 版 API 进行开发是一个不小的挑战:

  • “即使有 web 和游戏开发经验,也很难将 web 的设计方法应用于游戏设计。”
  • “复杂的游戏仍然需要传统的游戏开发模式,在没有合适工具辅助的情况下重新发明轮子的成本非常高,这些模式往往在Web 开发者的理解和直觉之外。”
  • “React 模式非常适合面向更广泛的开源开发人员,但我们仍然需要覆盖传统的开发者。”

您可能知道,alpha 版本选择了类似 React 的架构。 这是为了方便 Web 开发人员,因为他们中有相当多人熟悉 React 框架

虽然 Web 开发人员能够轻松掌握 SDK 的基本概念,但是很难将常见的游戏设计模式适配到 React 范例中。所以经常需要重新开发传统游戏引擎中一些众所周知的标准实践。随着项目规模的扩大,开发会变得越来越难。

实体-组件-系统架构介绍

所有这些反馈为 Decentraland API 引入了一个新的框架,一个基于实体-组件-系统(ECS)的架构。

ECS 是一种众所周知且经过验证的游戏开发模式,用于缺省情况下高性能代码的编写。 我们希望帮助 Web 开发人员和游戏开发人员为 Decentraland 创建更好、更强大的内容,消除不必要的复杂性并使学习曲线尽可能顺畅。

迁移到 ECS 将有助于我们的图形开发工具的开发,因为 ECS 体系架构是构建编辑器的良好基础。 我们已经开始开发的这些工具,将能提高改善创建内容的体验,方便更多的用户使用。

今天,ECS 将取代旧的 decentraland-api

实体(Entities)

我们去掉了所有的类 React 代码,并且所有的东西都基于 实体 的概念之上。 场景中的所有东西现在都是一个实体(例如 NPC,子弹,车辆等)。

组件(Components)

每个实体都可以包含几个能添加其特性或功能的组件。 因此,在运行时可以通过添加或删除组件来更改实体的行为。

系统(Systems)

systems 随着时间的推移,可以改变存储在组件中的信息,使得场景动态化。systems 在场景的游戏循环中逐帧执行函数,以改变正在渲染的内容。

对于由多块土地组成的场景,我们显著地增大了允许的三角形和实体的数量。 允许的最大值原来是根据递减曲线函数确定的,现在它们与土地数量成线性比例。 这意味着您将能够在您的连块土地上建立更多内容!

通过更改 CLI 的捆绑方式,我们还设法将 CLI 的大小从 118 MB 降低到仅 12 MB!

注意:以 XML 格式编写的 Decentraland 场景不受此版本的影响,原来的 XML 语法仍然可用。唯一区别是在连块土地上可以有更多的三角形和实体数目。

新的 SDK 有何不同

我们很高兴与您分享新的 SDK 的一些改变! 下面是最值得注意的一些改进,但是有一些细节,还请务必查看我们的文档和发行说明。

实体生命周期

新的 SDK 版本引入的一个主要区别是实体生命周期现在以声明式样式编写。

如,现在您需要明确地告诉引擎在场景中添加或删除实体。 旧的 SDK 以隐式方式管理实体生命周期,例如,你并不告诉引擎添加新的实体,而是把包含之前不存在的实体新的渲染指令传递给它,而不是明确地告诉引擎添加新实体,实体是隐式被创建的。

新的这种声明式样式会使代码变得更加冗长,但也更加直观了,因为它更接近我们对场景中发生事情的认识。

跟踪场景的状态

另一个主要区别是场景状态不再存储在单个 state 对象中。 我们正在去除这层抽象,现在实体本身就体现了场景的状态。

因此,不再有 setState() 函数,您可以直接更改实体及其组件的值,就等于更改了状态。 使得代码更为直接。

代码执行

在这个新版本中,代码执行的时序也发生了根本性的变化。 过去仅在状态发生变化时才会渲染场景。

现在,我们引入了一个游戏循环,每秒渲染场景大约 30 次。我们意识到,不使用游戏循环是大多数游戏开发人员感到迷惑的地方,因为使用游戏循环是大多数游戏引擎的一种标准做法。

所以请不要用 setInterval()setTimeout() 函数来延迟代码的执行。 现在,时序由游戏循环中的帧来管理。 要延迟执行某些操作,可以通过计算经过的帧数或计算两者间经过的时间。

在场景周围移动对象

为了平稳地在场景中移动实体,旧的 API 依赖于类似于 CSS 属性的“transition”设置。 虽然对于某些用例来说这是一个优雅的解决方案,但是也增加了一个需要时间来习惯的奇怪抽象。

使用 transition 也有问题,尤其是涉及多人场景时。 最令人不解的是,两点之间的任何移动都发生在用户的本地,在它们移动时无法知道实体的在中间实际位置。在糟糕的帧率或糟糕的网络连接相结合的情况下,会导致不同用户之间的差异,从而破坏游戏体验。

实体的实际位置、旋转、缩放等在游戏循环的每一帧,由新的 API 使用增量更改来实现。这是传统游戏中的另一种标准做法。并且对于 3D 环境更有意义,物体在路径中的中间具体位置对于游戏的逻辑可能是很重要的。

还有哪些改变?

我们已经讨论了新 SDK 引入的一些比较大的变化,还有许多较小的更新、修复和改进。

  • 场景的主要代码不再是具有方法的对象,而是更直接的脚本。 例如,不再需要sceneDidMount()方法。 如果你想在加载场景时执行某些操作,只需随意将代码写入 .ts 文件中,脚本中的代码会按顺序调用。
  • 场景代码中,我们不再使用 render() 函数。渲染现在由引擎在后端处理。没有必要明确地告诉引擎什么时候渲染,或者渲染什么内容。_什么时候_现在由游戏循环中的帧(frame)决定。_内容_则是已添加到引擎的每个实体。
  • 实体不再具有不同的类型,现在所有实体都是一样的,它们的特征由它们拥有的组件决定。 例如,现在没有 boxplane 实体,而是创建一个通用实体并为其添加一个 BoxShapePlaneShape 组件。
  • 引擎不再需要单个实体使用 ID 或 key 键来区分。
  • 主场景文件现在是 .ts 而不是 .tsx,因为不需要声明类 XML 语法。
  • 不再需要将 Decentraland API 库导入主文件。 现在,所有基本库都隐式导入到 .ts 文件中,使其更容易入门。
  • 在 ECS 中,旋转使用四元数角而不是欧拉角来表示。 这使我们的 SDK 更加强健,并有助于与我们计划在未来利用的其他框架保持兼容。 值得庆幸的是,SDK 包含许多方便的辅助程序,可以让您使用更容易使用欧拉角度。

这就是 Decentraland SDK 新的 ECS 版本引入的一些主要差异。

更为具体的示例,我们将在明天分享一个特定的新 SDK 的教程,或者现在浏览场景示例文档

如果您想深入了解新的ECS,请查看我们的开发文档

开始建设!
我们的 SDK 提供了开发游戏和应用所需的一切
让我们开始吧