跳到主要内容

引擎迁移

PlayCanvas Engine 不断演进,更新偶尔会引入破坏性变更,需要用户相应调整脚本。

本指南概述各版本的重要破坏性变更,帮助你将代码迁移到较新版本。有关版本号规则,以及如何控制项目接受哪些发布版本,请参阅版本编号与发布。

排查问题时,建议使用引擎的调试版本,它会记录已弃用 API 的提示、警告,以及错误用法引发的错误。

AI

将当前和目标引擎版本提供给编程助手,使其能够对照本指南检查 API 用法。按照**借助 AI 开发**中的方式,使用调试版引擎逐组审查并测试相关修改。

从 2.4.0 迁移到 2.5.0​

2.5.0 的破坏性变更​

ShaderMaterial​

ShaderMaterial 以前会自动向每个片元着色器注入所需代码,简化伽马校正、色调映射和雾效处理。此功能现已移除,各个着色器需要自行包含相关功能。

如果遇到缺少 gammaCorrectOutput、toneMap 或 addFog 等函数的着色器错误,请确保在着色器中显式包含所需函数。详情见此更新。

从 1.75.0 迁移到 2.4.0​

从主版本 1 迁移到主版本 2 是一次较大的升级,包含多项破坏性变更。

破坏性变更​

WebGL 1​

已停止支持 WebGL1;引擎现在仅支持 WebGL2 和处于测试阶段的 WebGPU。如果应用依赖 WebGL1,需要继续使用引擎 v1。

AudioSourceComponent​

此前已被 SoundComponent 取代的 AudioSourceComponent 现已完全移除。

旧版脚本​

自 2016 年起被弃用、并已维持只读状态多年的旧版脚本系统,现在已完全移除。

已弃用函数​

大量用于向后兼容的已弃用函数已被移除。如果应用在 Engine 1 的调试版本中出现弃用警告,应先解决这些问题,再迁移到 Engine 2。Engine 2 不再显示这些弃用警告,对应的兼容代码也已删除。

基础材质​

BasicMaterial 已被移除。可以改用设置了自发光颜色或自发光贴图的 StandardMaterial,实现相同功能。

着色器材质​

如果遇到 Material class cannot be instantiated, use ShaderMaterial instead 错误,需要将代码改为使用 ShaderMaterial。引擎着色器现在使用线性工作流,请注意片元着色器中如何使用 gammaCorrectOutput 进行最终伽马校正。

渲染到纹理​

渲染到纹理时,在 Layer 上配置 RenderTarget 的旧方式已完全移除。现在必须直接在相机上设置 RenderTarget。

引擎渲染回调​

以前,引擎会在每帧为相机和图层渲染执行多个回调。现在已改为支持多个订阅者的事件系统,新事件由 Scene 类发出。详情见此拉取请求。

StandardMaterial 颜色调制标记​

StandardMaterial 的颜色调制选项曾存在含义不清且行为不一致的问题,因此 Ambient、Diffuse 和 Emissive 的调制标记已被移除。以前,这些标记仅在应用纹理等特定情况下生效;现在始终应用调制颜色。若要禁用调制,请将颜色设为中性值,即创建新材质时使用的默认颜色:

各类调制颜色的默认值如下:

  • Ambient:new Color(1, 1, 1)(白色)。
  • Diffuse:new Color(1, 1, 1)(白色)。
  • Emissive:new Color(0, 0, 0)(黑色)。

有一个需要注意的行为:为确保材质默认不发光,自发光调制颜色初始为黑色。分配自发光纹理后,应将自发光颜色设为白色,否则黑色调制会覆盖纹理的自发光贡献,使其无法显示发光效果。

视频纹理显示为黑色​

如果视频纹理显示为黑色,请检查调试版引擎的警告。原因很可能是材质的自发光调制颜色为黑色。将自发光颜色改为白色即可修复。

伽马校正、色调映射和雾效设置​

以前,gammaCorrection 和 toneMapping 在 Scene 上全局设置,影响所有相机的渲染。现在,这些设置直接位于各个相机上,可为不同相机配置独立的渲染效果。

以前,雾效通过 Scene.fog、Scene.fogColor 和 Scene.fogEnd 等 Scene 属性直接访问。现在,这些设置统一移到 Scene.fog 属性下,使用 Scene.fog.type、Scene.fog.color、Scene.fog.end 等属性配置。

详情见此拉取请求。

伽马空间纹理​

Diffuse、Emissive、Specular 和 Sheen 等表示颜色的纹理通常存储在 sRGB 空间中,以保留颜色范围并减少色带。引擎使用它们时,会从 sRGB 转换到线性空间,以进行准确的光照计算。以前,该转换通过着色器运算完成,会影响性能。移除 WebGL1 支持后,可以利用硬件高效执行转换,无需额外开销。唯一要求是使用 sRGB 格式创建纹理:

  • 加载表示 sRGB 颜色的 Texture 资源时,需要指定 sRGB 编码。详情见此拉取请求。
  • 创建表示 sRGB 颜色的 Texture 实例时,需要使用 PIXELFORMAT_SRGBA8 等 sRGB 像素格式。

实例化​

如果代码修改了 transformVS 着色器块中的实例化部分,需要将相关定制移到 transformInstancingVS 中,并配置材质,指定使用了哪些顶点属性。详情见此拉取请求。

其他变更​

各个引擎版本的详细变更,请查阅对应的版本说明: