首批拥有虚拟化身,即可以早期访问 Decentraland。
X
你好,请选择
语言
关闭

Decentraland SDK 6.0 Beta 版本包含了一些对现有场景代码的修改。这些修改虽然没有升级到 5.0 版本时的变化大,但仍然会对使用以前版本的 SDK 构建的场景有所影响。

因此,我们编写了一份升级指南,以帮助您尽可能快速、顺利地升级到新的 SDK。 如果您在完成本指南后仍然遇到迁移问题,可以在Decentraland 的开发人员频道 中求助。

在 SDK 6.0 beta 中创建场景

要使用 SDK 6.0 beta 创建新场景,请确保您已安装最新版本的 CLI,然后使用 dcl init 创建新项目。

要确保使用最新版本的 CLI,请运行:

npm install -g decentraland

将现有项目迁移到 SDK 6.0 beta

迁移到新版本步骤:

  1. 删​​除升级项目中的 binnode_modules 文件夹
  2. 删除 package-lock.json 文件
  3. 确保在 package.json 文件中,decentraland-ecs 值为 latest
  4. 在项目目录中运行 npm install
  5. 按照以下的迁移指南进行语法更改

一般语法更改

为了保持代码的清晰明确,以下用于处理组件的命令已经重新命名。您的场景最有可能至少使用了其中的几个,因此请仔细检查代码并确保更新任何过时的命令。

Old Command New Command
add addComponent
set addComponentOrReplace
get getComponent
getOrNull getComponentOrNull
getOrCreate getComponentOrCreate
remove removeComponent
has hasComponent

原代码:

const ent = new Entity()
ent.add(new GLTFShape('models/Environment.glb'))
ent.add(new Transform({
 position: new Vector3(5, 0, 5)
}))
engine.addEntity(ent)

New code:

const ent = new Entity()
ent.addComponent(new GLTFShape('models/Environment.glb'))
ent.addComponent(new Transform({
 position: new Vector3(5, 0, 5)
}))
engine.addEntity(ent)

提示:您可以对项目使用查找和替换命令,以确保代码使用正确的命令和术语。不过要注意, set 也可以用于设置特定位置、旋转或缩放,该命令并没有改动。如:myTransformComponent.position.set(5, 0, 5)

更大的地块

Decentraland 的每块土地大小现在是 16米 x 16米(以前是 10 x 10)。所以有了更多的空间来容纳场景中的内容!请注意,最大多边形的限制是基于土地的数量,而不是面积,因此这些限制还是跟原来一样。

由于地块场景的尺寸为 16 x 16,因此现在场景的中心坐标为(8, 0, 8)。根据场景的内容,可以按 1.6 倍数缩放所有实体来填满整个空间。当然,您也可以增加新的内容来填充空白区域。

3D 模型旋转

我们更改了 SDK 内部所有 3D 模型的旋转设置,采用了跟大多数其他平台一致的标准。这意味着场景中的任何 3D 模型现在都将面向后渲染,沿 Y 轴旋转 180 度。所有必须重新定位或旋转实体以补偿这个旋转。

如果您使用 lookAt 函数来设置实体的旋转,请记住以前实体的前端现在在它的后面了。我们建议您在 Blender 等外部工具中编辑 3D 模型,使其面向 Y 轴的相反方向。

动画

3D 模型动画现在由单独的 Animator 组件处理,而不是由 GLTFModel 组件处理。

此外,我们已将 AnimationClip 对象重命名为 AnimationState,以避免与 glTF 文件中的动画片段混淆。

原代码:

let shark = new Entity()
shark.add(new GLTFShape("models/shark.gltf"))
let clipSwim = shark.get(GLTFShape).getClip("swim")
clipSwim.play()
engine.addEntity(shark)

New code:

let shark = new Entity()
shark.addComponent(new GLTFShape("models/shark.gltf"))
const animator = new Animator()
shark.addComponent(animator)
let clipSwim = new AnimationState("swim")
animator.addClip(clipSwim)
clipSwim.play()
engine.addEntity(shark)

请在开发文档中阅读有关此内容的更多信息,或查看使用此功能的示例场景

声音

声音现在由必须添加到实体的 SoundSource 组件处理。您不再需要使用 executeTask 函数。

原代码:

executeTask(async () => {
 try {
   await playSound("sounds/Vexento.ogg", {
     loop: true,
     volume: 75,
   })
 } catch {
   log('failed to play sound')
 }
})

New code:

const ent = new Entity()
const audioClip = new AudioClip("sounds/Vexento.ogg")
const audioSource = new AudioSource(audioClip)
ent.addComponent(audioSource)
audioSource.playing = true
engine.addEntity(ent)

开发文档中阅读有关此内容的更多信息,或查看使用此功能的示例场景

Billboard 模式

Billboard 现在是一个单独的组件,而不是形状组件一项设置。

原代码:

let ent = new Entity()
ent.add(new BoxShape())
ent.get(BoxShape).billboard = BillboardMode.BILLBOARDMODE_ALL
engine.addEntity(ent)

New code:

let ent = new Entity()
ent.addComponent(new BoxShape())
ent.addComponent(new Billboard())
engine.addEntity(ent)

更多相关信息,请查看开发文档

纹理

要添加纹理,您现在必须创建一个 Texture 组件,并将其添加到 MaterialBasicMaterial 组件中。 Texture 组件公开了一些你可以设置的新参数,以便进行更好的控制。

MaterialBasicMaterial 组件不再支持使用图像文件的路径,而是必须指向 Texture 组件。

原代码:

const woodMaterial = new Material()
woodMaterial.albedoTexture = "materials/wood.png"

let ent = new Entity()
ent.add(new PlaneShape())
ent.add(woodMaterial)
engine.addEntity(ent)

New code:

const woodTexture = new Texture("materials/wood.png")
const woodMaterial = new Material()
woodMaterial.albedoTexture = woodTexture

let ent = new Entity()
ent.addComponent(new PlaneShape())
ent.addComponent(woodMaterial)
engine.addEntity(ent)

更多相关信息,请查看开发文档

点击事件

我们将 BUTTON_A_DOWNBUTTON_A_UP 事件重命名为 BUTTON_DOWNBUTTON_UP。 按下哪个按钮的信息现在作为事件参数传递。

原代码:

input.subscribe("BUTTON_A_DOWN", e => {
 log("button Down", e)
})

New code:

input.subscribe("BUTTON_DOWN", e => {
 log("button Down", e)
})

增强的点击功能

在 6.0 中我们添加了新的 OnPointerDown 组件,这个组件通常比 OnClick 更好。只有在指向同一实体的同时按下和放开按钮时,才会触发 OnClickOnPointerDown 则只需按下按钮即可触发。

现在仍然支持 OnClick 组件,但支持的功能比较少。 OnPointerDown 使用的事件携带有更多数据,包括光线距离,用户位置以及所点击的 3D 模型中特定网格的名称。

原代码:

ent.add(
 new OnClick(e => {
   log("event data: " + e)
 })
)

新代码:

ent.addComponent(
 new OnPointerDown(e => {
   log("event data: " + e)
 })
)

其它

删除实体

engine.removeEntity() 以前有一个布尔值可选参数,用于确定是否也应删除子实体。

在 6.0 中,默认每次都删除所有子实体。

原代码:

engine.removeEntity(cube, true)

新代码:

engine.removeEntity(cube)

提示:如果您不想删除子实体,可以在删除前,将他们改为其他实体的子实体。

文本组件对齐

TextShape 组件曾经有两个 hAlignvAlign 属性。 已重命名为 hTextAlignvTextAlign

原代码:

let text = new TextShape("Hello world!")
text.hAlign = 'center'

新代码:

let text = new TextShape("Hello world!")
text.hTextAlign = 'center'

实体类型名更改

如果您的场景有将实体作为输入的函数,则现在需要将 Entity 类型改为 IEntity

原代码:

export function myFunction(
    myNumber: number,
    myEntity: Entity
  ) {
	  log("Entity: " , myEntity)
  }

新代码:

export function myFunction(
    myNumber: number,
    myEntity: IEntity
  ) {
	  log("Entity: " , myEntity)
  }
在虚拟世界中展示您的特色
首批拥有虚拟化身,即可先期进入 Decentraland 世界。
了解更多