浏览代码

Update PS4 development and other things (#350)

* update physics

* update input

* update

* update code sharing in getting-help.md

* Export Compliance

* update on file i/o

* pi / 4

* inputs

* forum url

* read only user

* html5 gamepad

* sdk api update

* update

* image properties

* update editor

* defold sdk update

* animation updates

* animation fix

* run as admin

* update bob

* update about AndroidX support

* software render

* linux-faq.md update

* 4.28.2021 updates

* Basis Universal format

* sound & mesh

* gamepad event mapping

* admob url

* Minor edit to building blocks intro text

* update gamepad & ios

* project settings

* libffi version

* scaling

* image compression

* update gamepads

* increase memory

* caching assets

* update 2021/10/6

* update 2021/10/16
blend-modes.md

* update 2021/11/12

* allow dynamic transforms update

* Bundle update

* update faq

* bullet & bob

* script properties update

* editor-styling

* build server url

* editor templates

* spine extension update

* Fix typo in the "optimizations" word in Chinese docs

* Update to material.md - Constants buffers

* Verify Graphics Calls

* H5 parameters

* OpenJDK downloads

* cn update corresponds to [pull 259](https://github.com/defold/doc/pull/259)

* application security

* porting guidelines

* update for 8f1651f

* cn update for 094bf6f

* cn update for 20fdfc5 & 6263317

* cn update for 7/19/2022

* title

* profiling update

* update editor.md

* update bob.md

* update shortcuts

* update fixed update note

* Update properties.md

* Update material.md

* Updates links

* Update bob help with the latest info

* camera & renderer

* Updated android keystore info zh_cn

* bundling.md release vs debug zh_cn

* update bob.md & gui-clipping.md

* contentless bundle

* consoles update

* model animation link

* gamepad & faq

* remove a camera lib

* font shadow render mode fix

* updates about app-manifest and others

* Update script.md

* includes in shaders

* editor scripts

* material updates

* Added dynamic atlas and texture creation

* fixes for atlas and some others

* update screenshots and add explanations (CN)

* add a line about Dynamic Prototype (CN)

* remove "inline" marks in pics

* de-translate the subtitle "Running the debugger" & images fix

* bundle identifier restrictions

* node properties Enabled and Visible (CN)

* release checklist & slice-9

* Update project-settings.md (CN)

* Update camera.md (CN)

* Update project-settings.md (CN)

* culling of meshes (CN)

* Update project-settings.md (CN)

* gltf model file support (CN)

* updates about factory (CN)

* Update bob.md (CN)

* Update bob.jar help (CN)

* Update about renderer and other things

* Update PS4 development and other things
COCO 2 年之前
父节点
当前提交
97584f4d0e

+ 4 - 2
docs/zh/manuals/camera.md

@@ -70,9 +70,11 @@ end
 ```
 1. 这个消息中包含一个视口矩阵和一个映射矩阵.
 
-摄像机组件支持基于摄像机属性 *Orthographic Projection* 的, 使用透视或者平视透视矩阵的渲染脚本.
+摄像机组件支持基于摄像机属性 *Orthographic Projection* 的, 使用透视或者平视透视矩阵的渲染脚本. 投射矩阵还参考了定义好的远近裁切平面和摄像机的视角及宽高比.
 
-::: sidenote
+摄相机提供的视图矩阵定义了摄相机的位置和方向. *Orthographic Projection* 的摄像机基于其父游戏对象的位置居中视口, 而 *Perspective Projection* 的摄像机会基于其父游戏对象的位置确定视口左下角的位置.
+
+::: important
 出于向后兼容性的原因,默认渲染脚本会忽略相机提供的透视,并始终使用平视透视. 关于渲染脚本, 视口和透视矩阵更多详情参见 [渲染教程](/manuals/render/#default-view-projection).
 :::
 

+ 1 - 1
docs/zh/manuals/collection-factory.md

@@ -107,7 +107,7 @@ end
       -- 集合工厂父级集合加载时
       -- 集合工厂资源不会被加载. 调用 create 函数
       -- 会把资源进行同步加载.
-      self.go_ids = collecionfactory.create("#collectionfactory")
+      self.go_ids = collectionfactory.create("#collectionfactory")
   end
 
   function final(self)  

+ 16 - 0
docs/zh/manuals/input-gamepads.md

@@ -128,6 +128,22 @@ end
 
 如果手柄没有配置消息映射的话, 就只有 "connected", "disconnected" 和 "raw" 三种事件. 这种情况下只能使用手柄原始数据来控制游戏.
 
+(更新于 Defold 1.4.8)
+
+可以通过查看 action 的 `gamepad_unknown` 值来确定输入行为是否来源于未知手柄:
+
+```lua
+function on_input(self, action_id, action)
+    if action_is == hash("connected") then
+        if action.gamepad_unknown then
+            print("The connected gamepad is unidentified and will only generate raw input")
+        else
+            print("The connected gamepad is known and will generate input actions for buttons and sticks")
+        end
+    end
+end
+``` 
+
 ## HTML5上的游戏手柄
 HTML5平台同样支持游戏手柄, 效果和原生应用一样. 游戏手柄的支持基于 [标准游戏手柄API](https://www.w3.org/TR/gamepad/), 并且受绝大多数浏览器支持 ([详见此图表](https://caniuse.com/?search=gamepad)). 万一遇到不支持的浏览器 Defold 会忽略所有游戏手柄的操作. 可以通过检查浏览器的`navigator`对象中是否存在`getGamepads`函数来判断其是否支持游戏手柄:
 

+ 1 - 1
docs/zh/manuals/physics-shapes.md

@@ -52,7 +52,7 @@ Defold 包含一个功能就是从瓷砖地图中自动生成瓷磚圖源的物
 :::
 
 ## 凸多边形
-Defold 有一个功能就是让你用3个或多个点建立凸多边形. 可以使用资源 [Defold 多边形编辑器](/assets/defoldpolygoneditor/) 或者 [物理刚体编辑器](/assets/physicsbodyeditor/) 来创建凸多边形.
+Defold 有一个功能就是让你用3个或多个点建立凸多边形. 可以使用资源 [Defold 多边形编辑器](/assets/defoldpolygoneditor/) 或者 [物理刚体编辑器](https://selimanac.github.io/physics-body-editor/) 来创建凸多边形.
 
 1. 新建凸多边形文件 (扩展名 `.convexshape`).
 2. 不在碰撞对象上加入形状, 而是设置 *Collision Shape* 属性为 *凸多边形文件*.

+ 34 - 2
docs/zh/manuals/porting-guidelines.md

@@ -5,7 +5,7 @@ brief: 本手册重点介绍了将游戏移植到新平台时需要考虑的一
 
 # 移植指南
 
-将 Defold 游戏移植到新平台通常是一个非常简单的过程. 理论上只要在 *game.project* 文件里配置好就行了, 但是处于对平台充分利用的考量还是推荐针对目标平台进行适配. 本教程包含一些通用移植的最佳实践和一些平台相关的细节.
+将 Defold 游戏移植到新平台通常是一个比较简单的过程. 理论上只要在 *game.project* 文件里配置好就行了, 但是处于对平台充分利用的考量还是推荐针对目标平台进行适配. 本教程包含一些通用移植的最佳实践和一些平台相关的细节.
 
 
 ## 最佳实践
@@ -18,6 +18,34 @@ brief: 本手册重点介绍了将游戏移植到新平台时需要考虑的一
 本地化翻译游戏中的任何文本以及商店页面中的文本,因为这将对销售产生积极影响! 对于本地化, 确保玩家可以在游戏的不同语言之间轻松切换 (通过暂停菜单).
 
 
+### 保存游戏进度
+
+#### 在桌面设备, 手机和 web 游戏里保存进度
+保存游戏状态可以使用 Defold API 函数 `sys.save(filename, data)` 然后使用 `sys.load(filename)` 加载. 可以使用 `sys.get_save_file(application_id, name)` 获取不同系统上文件保存的路径, 一般就是登录用户的 home 文件夹.
+
+#### 在游戏主机里保存进度
+用 `sys.get_save_file()` 和 `sys.save()` 能在大多数平台上顺利工作, 但是在游戏主机上推荐另一个方法. 游戏主机平台通常将用户与每个连接的手柄相关联, 这样当保存进度时, 成就和其他功能应与其各自的用户相关联.
+
+游戏手柄输入事件将包含一个用户 id, 可用于将手柄的操作与控制台上的用户关联起来.
+
+主机平台及其原生扩展会暴露相关 API 函数,以保存和加载与特定用户关联的数据. 在主机上使用这些 API 以实现保存和载入游戏.
+
+主机平台的文件操作 API 通常都是异步的. 在给主机开发跨平台游戏时推荐把所有文件操作做成异步的, 不管目标是哪个平台. 例如:
+
+```lua
+local function save_game(data, user_id, cb)
+	if console then
+		local filename = "savegame"
+		consoleapi.save(user_id, filename, data, cb)
+	else
+		local filename = sys.get_save_file("mygame", "savegame" .. user_id)
+		local success = sys.save(filename, data)
+		cb(success)
+	end
+end
+```
+
+
 ### 性能
 用真机进行调试! 必要的话查找性能瓶颈然后进行优化. 可以使用 [性能分析器](/manuals/profiling) 分析找出代码性能瓶颈.
 
@@ -29,11 +57,15 @@ brief: 本手册重点介绍了将游戏移植到新平台时需要考虑的一
 
 
 ### Nintendo Switch
-集成目标平台代码 - 比如 Nintendo Switch 就有一个特殊的扩展包以及很多工具供用户使用
+集成目标平台代码 - 对于 Nintendo Switch 就有一个特殊的扩展包以及很多工具供用户使用.
 
 Defold 的 Nintendo Switch 使用 Vulkan 作为图形后端 - 要使用 [Vulkan 图形后端](https://github.com/defold/extension-vulkan) 测试游戏.
 
 
+### PlayStation®4
+集成目标平台代码 - 对于 PlayStation®4 就有一个特殊的扩展包以及很多工具供用户使用.
+
+
 ### HTML5
 在手机上玩网页游戏正越来越流行 - 当然前提是要确保游戏在手机浏览器可以流畅运行! 还要注意的是网页游戏要能快速载入! - 换句话说就是优化游戏体积. 同时还要考虑加载速度,以免造成不必要的玩家流失.
 

+ 129 - 112
docs/zh/manuals/render.md

@@ -9,7 +9,7 @@ brief: 本教程介绍了 Defold 的渲染流程及其编程方法.
 
 ### 渲染管线是什么东东?
 
-渲染管线决定了渲染什么, 何时渲染以及渲染哪里. 渲染什么由 [渲染优先级](#render-predicates) 决定. 什么时候渲染由 [渲染脚本](#the-render-script) 决定, 渲染哪里由 [视口映射](#default-view-projection) 决定.
+渲染管线决定了渲染什么, 何时渲染以及渲染哪里. 渲染什么由 [渲染优先级](#render-predicates) 决定. 什么时候渲染由 [渲染脚本](#the-render-script) 决定, 渲染哪里由 [视口映射](#default-view-projection) 决定. 渲染管线还能剔除基于渲染优先级所渲染的的那些位于边界框或视锥体之外的图像. 这个过程称为视锥体剔除.
 
 
 ## 默认渲染器
@@ -119,6 +119,26 @@ msg.post("@render:", "use_camera_projection")
 ```
 
 
+## 视锥体剔除
+
+Defold 的渲染 API 能让开发者做到叫做视锥体剔除的功能. 视锥体剔除能忽视位于定义好的边界框之外或者视锥体之外的图像. 在超大游戏世界中每次只显示其中一部分, 视锥体剔除能极大地减少发送给 GPU 的待渲染数据, 从而提高了效率并节省了电量 (移动设备中). 常见用摄像机视口和透视映射来创建边界框. 默认渲染脚本使用视口和透视映射 (来自摄像机) 的数据计算出视锥体.
+
+视锥体剔除在引擎里的实现基于组件类型. 目前的状况是 (Defold 1.4.7):
+
+| 组件          | 是否支持  |
+|-------------|-------|
+| Sprite      | 是     |
+| Model       | 是     |
+| Mesh        | 是 (1) |
+| Label       | 是     |
+| Spine       | 是     |
+| Particle fx | 否     |
+| Tilemap     | 否    |
+| Rive        | 否    |
+
+1 = Mesh 的边界框需要开发者手动设置. [详情请见](/manuals/mesh/#frustum-culling).
+
+
 ## 坐标系统
 
 提到渲染就不得不说其基于的坐标系统. 一般游戏都有世界坐标系和屏幕坐标系.
@@ -135,113 +155,110 @@ Sprite, 瓷砖地图和其他游戏组件都是使用游戏世界坐标系. 既
 init()
 : 函数 `init()` 用来设定优先级, 视口和视口颜色. 这些渲染时都会被用到.
 
-  ```lua
-  function init(self)
-      -- 定义渲染优先级. 每个优先级的绘制不相干所以绘制时可以任意修改 OpenGL 的状态.
-      self.tile_pred = render.predicate({"tile"})
-      self.gui_pred = render.predicate({"gui"})
-      self.text_pred = render.predicate({"text"})
-      self.particle_pred = render.predicate({"particle"})
-      self.model_pred = render.predicate({"model"})
-
-      self.clear_color = vmath.vector4(0, 0, 0, 0)
-      self.clear_color.x = sys.get_config("render.clear_color_red", 0)
-      self.clear_color.y = sys.get_config("render.clear_color_green", 0)
-      self.clear_color.z = sys.get_config("render.clear_color_blue", 0)
-      self.clear_color.w = sys.get_config("render.clear_color_alpha", 0)
-
-      -- 视口矩阵. 如果使用了摄像机, 摄像机就会
-      -- 把 "set_view_projection" 信息发送给渲染脚本
-      -- 以便我们根据摄像机提供的参数更新视口矩阵.
-      self.view = vmath.matrix4()
-  end
-  ```
+```lua
+function init(self)
+  -- 定义渲染优先级. 每个优先级的绘制不相干所以绘制时可以任意修改 OpenGL 的状态.
+  self.tile_pred = render.predicate({"tile"})
+  self.gui_pred = render.predicate({"gui"})
+  self.text_pred = render.predicate({"text"})
+  self.particle_pred = render.predicate({"particle"})
+  self.model_pred = render.predicate({"model"})
+
+  self.clear_color = vmath.vector4(0, 0, 0, 0)
+  self.clear_color.x = sys.get_config("render.clear_color_red", 0)
+  self.clear_color.y = sys.get_config("render.clear_color_green", 0)
+  self.clear_color.z = sys.get_config("render.clear_color_blue", 0)
+  self.clear_color.w = sys.get_config("render.clear_color_alpha", 0)
+
+  -- 视口矩阵. 如果使用了摄像机, 摄像机就会
+  -- 把 "set_view_projection" 信息发送给渲染脚本
+  -- 以便我们根据摄像机提供的参数更新视口矩阵.
+  self.view = vmath.matrix4()
+end
+```
 
 update()
 : 函数 `update()` 每帧都会被调用. 用于调用底层 OpenGL ES API (OpenGL 嵌入系统 API) 以实现渲染. 想了解 `update()` 函数, 先要了解 OpenGL 工作原理. 对于 OpenGL ES 有许多教程. 官方网站就是个不错的学习之地. 参考 https://www.khronos.org/opengles/
 
   本例中函数里设置了渲染 3D 模型必须的两部分内容. `init()` 定义了 `self.model_pred` 优先级. 含有 "model" 标签的材质被建立. 以及使用此材质的模型组件:
 
-  ```lua
-  function update(self)
-      -- 设置深度蒙版以便修改深度缓存.
-      render.set_depth_mask(true)
-
-      -- 使用背景清空渲染缓存然后设置其深度为 1.0.
-      -- 通常深度范围为 0.0 (近端) 到 1.0 (远端) 要全包括所以设置为 1.0
-      -- 缓存只保持并渲染比 1.0 近的物体
-      -- 这样的配置就很合乎逻辑.
-      render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color, [render.BUFFER_DEPTH_BIT] = 1, [  render.BUFFER_STENCIL_BIT] = 0})  
-
-      -- 视口大小设置为窗体大小.
-      render.set_viewport(0, 0, render.get_window_width(), render.get_window_height())
-
-      -- 填充视口 (摄像机会自动填充)
-      render.set_view(self.view)
-
-      -- 渲染 2D 空间
-      render.set_depth_mask(false)
-      render.disable_state(render.STATE_DEPTH_TEST)
-      render.disable_state(render.STATE_STENCIL_TEST)
-      render.enable_state(render.STATE_BLEND)
-      render.set_blend_func(render.BLEND_SRC_ALPHA, render.BLEND_ONE_MINUS_SRC_ALPHA)
-      render.disable_state(render.STATE_CULL_FACE)
-
-      -- 设定正交映射及Z轴范围为 -200 到 200
-      render.set_projection(vmath.matrix4_orthographic(0, render.get_width(), 0,   render.get_height(), -200, 200))  
-
-      render.draw(self.tile_pred)
-      render.draw(self.particle_pred)
-
-      -- 渲染 3D 空间, 此时仍是正交映射
-      -- 需要打开面剔除和深度测试
-      render.enable_state(render.STATE_CULL_FACE)
-      render.enable_state(render.STATE_DEPTH_TEST)
-      render.set_depth_mask(true)
-      render.draw(self.model_pred)
-      render.draw_debug3d()
-
-      -- 最后渲染 GUI
-      render.set_view(vmath.matrix4())
-      render.set_projection(vmath.matrix4_orthographic(0, render.get_window_width(), 0,   render.get_window_height(), -1, 1))  
-
-      render.enable_state(render.STATE_STENCIL_TEST)
-      render.draw(self.gui_pred)
-      render.draw(self.text_pred)
-      render.disable_state(render.STATE_STENCIL_TEST)
-
-      render.set_depth_mask(false)
-      render.draw_debug2d()
-  end
-  ```
+```lua
+function update(self)
+    local window_width = render.get_window_width()
+    local window_height = render.get_window_height()
+    if window_width == 0 or window_height == 0 then
+        return
+    end
+
+    -- clear screen buffers
+    --
+    render.set_depth_mask(true)
+    render.set_stencil_mask(0xff)
+    render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color, [render.BUFFER_DEPTH_BIT] = 1, [render.BUFFER_STENCIL_BIT] = 0})
+
+    -- render world (sprites, tilemaps, particles etc)
+    --
+    local proj = get_projection(self)
+    local frustum = proj * self.view
+
+    render.set_viewport(0, 0, window_width, window_height)
+    render.set_view(self.view)
+    render.set_projection(proj)
+
+    render.set_depth_mask(false)
+    render.disable_state(render.STATE_DEPTH_TEST)
+    render.disable_state(render.STATE_STENCIL_TEST)
+    render.enable_state(render.STATE_BLEND)
+    render.set_blend_func(render.BLEND_SRC_ALPHA, render.BLEND_ONE_MINUS_SRC_ALPHA)
+    render.disable_state(render.STATE_CULL_FACE)
+
+    render.draw(self.tile_pred, {frustum = frustum})
+    render.draw(self.particle_pred, {frustum = frustum})
+    render.draw_debug3d()
+
+    -- render GUI
+    --
+    local view_gui = vmath.matrix4()
+    local proj_gui = vmath.matrix4_orthographic(0, window_width, 0, window_height, -1, 1)
+    local frustum_gui = proj_gui * view_gui
+
+    render.set_view(view_gui)
+    render.set_projection(proj_gui)
+
+    render.enable_state(render.STATE_STENCIL_TEST)
+    render.draw(self.gui_pred, {frustum = frustum_gui})
+    render.draw(self.text_pred, {frustum = frustum_gui})
+    render.disable_state(render.STATE_STENCIL_TEST)
+end
+```
 
 上面是一个简单版的渲染脚本. 每帧工作都一样. 然而有些时候需要对不同的游戏状态进行不同的渲染操作. 可能还需要与游戏代码脚本进行交互.
 
 on_message()
 : 渲染脚本有一个 `on_message()` 函数用来接收游戏其他脚本发来的消息. 典型的例子比如 _摄像机_. 摄像机组件每一帧都把视口和映射发给渲染脚本. 消息名为 `"set_view_projection"`:
 
-  ```lua
-  function on_message(self, message_id, message)
-      if message_id == hash("clear_color") then
-          -- 根据消息命令清空屏幕.
-          self.clear_color = message.color
-      elseif message_id == hash("set_view_projection") then
-          -- 焦点摄像机每一帧都发送 set_view_projection
-          -- 消息到 @render 端口. 使用摄像机发来的数据可以
-          -- 设置渲染视口 (及映射).
-          -- 这里使用默认正交映射所以
-          -- 不使用消息传输映射.
-          self.view = message.view
-      end
+```lua
+function on_message(self, message_id, message)
+  if message_id == hash("clear_color") then
+      -- 根据消息命令清空屏幕.
+      self.clear_color = message.color
+  elseif message_id == hash("set_view_projection") then
+      -- 焦点摄像机每一帧都发送 set_view_projection
+      -- 消息到 @render 端口. 使用摄像机发来的数据可以
+      -- 设置渲染视口 (及映射).
+      -- 这里使用默认正交映射所以
+      -- 不使用消息传输映射.
+      self.view = message.view
   end
-  ```
+end
+```
 
-  GUI 脚本同样可以向 `@render` 端口发送消息:
+GUI 脚本同样可以向 `@render` 端口发送消息:
 
-  ```lua
-  -- 更改清屏颜色.
-  msg.post("@render:", "clear_color", { color = vmath.vector4(0.3, 0.4, 0.5, 0) })
-  ```
+```lua
+-- 更改清屏颜色.
+msg.post("@render:", "clear_color", { color = vmath.vector4(0.3, 0.4, 0.5, 0) })
+```
 
 ## 系统消息
 
@@ -251,34 +268,34 @@ on_message()
 `"window_resized"`
 : 窗体大小变化时系统发送给渲染脚本的消息. 监听此消息以便在窗体大小变化时采取相应的渲染方案. 桌面设备窗口大小改变和移动设备屏幕方向改变都会触发此消息发送.
 
-  ```lua
-  function on_message(self, message_id, message)
-    if message_id == hash("window_resized") then
-      -- 窗体变化. message.width 与 message.height 保存了变化后的窗体尺寸.
-      ...
-    end
+```lua
+function on_message(self, message_id, message)
+  if message_id == hash("window_resized") then
+    -- 窗体变化. message.width 与 message.height 保存了变化后的窗体尺寸.
+  ...
   end
-  ```
+end
+```
 
 `"draw_line"`
 : 调试用画线. 可以用来检查射线, 向量等等. 线的绘制调用了 `render.draw_debug3d()` 函数.
 
-  ```lua
-  -- 绘制白线
-  local p1 = vmath.vector3(0, 0, 0)
-  local p2 = vmath.vector3(1000, 1000, 0)
-  local col = vmath.vector4(1, 1, 1, 1)
-  msg.post("@render:", "draw_line", { start_point = p1, end_point = p2, color = col } )  
-  ```
+```lua
+-- 绘制白线
+local p1 = vmath.vector3(0, 0, 0)
+local p2 = vmath.vector3(1000, 1000, 0)
+local col = vmath.vector4(1, 1, 1, 1)
+msg.post("@render:", "draw_line", { start_point = p1, end_point = p2, color = col } )  
+```
 
 `"draw_text"`
 : 调试用文字绘制. 可以用来展示一些调试信息. 文字使用自带 "system_font" 字体. 使用材质标签 "text" 于渲染脚本里进行绘制.
 
-  ```lua
-  -- 文字信息绘制
-  local pos = vmath.vector3(500, 500, 0)
-  msg.post("@render:", "draw_text", { text = "Hello world!", position = pos })  
-  ```
+```lua
+-- 文字信息绘制
+local pos = vmath.vector3(500, 500, 0)
+msg.post("@render:", "draw_text", { text = "Hello world!", position = pos })  
+```
 
 可视分析器通过发送 `"toggle_profile"` 消息到 `@system` 端口显示出来, 它不是在渲染脚本里进行绘制的, 而是在系统内部其他脚本里进行绘制的.
 

+ 18 - 19
docs/zh/manuals/sony-playstation.md

@@ -1,44 +1,43 @@
 ---
-title: Sony PlayStation 的 Defold 开发
-brief: 本教程介绍了如何访问 Sony PlayStation
+title: PlayStation®4 的 Defold 开发
+brief: 本教程介绍了如何访问 PlayStation®4
 ---
 
-# Sony PlayStation 开发
-
-Defold 基金会是 PlayStation® 中间件提供商, 我们正积极筹备从 Defold 到 Sony PlayStation® 的应用输出. 这项工作将于 2022 年第 4 季度完成.
+# PlayStation®4 开发
 
 基于 Sony 许可证限制, 支持 Sony PlayStation® 平台的 Defold 版本不包括标准版. 要获取支持 Sony PlayStation® 的 Defold 特殊版本首先必须成为 Sony PlayStation® 的正式开发者.
 
+::: sidenote
+Defold 目前只提供 PS4™ 开发支持. 给 PlayStation 4 开发的游戏可以以兼容模式运行于 PlayStation 5. 官方 PS5 支持会在本年下半年提供.
+:::
 
-## 注册成为 Sony Playstation 开发者
-
-可以在 [Sony PlayStation® Partner page](https://register.playstation.net/) 注册成为 Sony Playstation 开发者:
+## 注册成为 PS4 开发者
 
-![](images/sony-playstation/sony-playstation-partner.png)
+可以在 [Sony PlayStation® Partner page](https://register.playstation.net/partnership) 注册成为 PlayStation®4 开发者:
 
-Sony 审核通过后就可以访问 Sony PlayStation® 开发者大厅里的 Defold 可用的工具和中间件. 开发者申请 Defold 工具访问时, 我们将从 Sony 获得一份说明开发者是否为 Sony PlayStation® 开发者的鉴定邮件.
+Sony 审核通过后就可以访问 Playstation 4 DevNet. 导航到 Development > Tools & Middleware > Tools & Middleware directory > Defold. 点击 'Confirm Status' 按钮.
 
 
-## Sony Playstation 的 Defold 访问
+## PS4 的 Defold 访问
 
-当我们确定开发者是正式 Sony PlayStation® 开发者时, 我们会在 Defold 中提供对 Sony PlayStation® 的两层访问:
+当我们确定开发者是正式 PS4™ 开发者时, 我们会在 Defold 中提供两层访问:
 
-1. 标准访问 - Sony PlayStation® 扩展, 编译工具及技术支持.
-2. 源码访问 - Sony PlayStation® 扩展, 编译工具及技术支持连同 Defold 引擎用于访问 Sony PlayStation® 那部分的源代码.
+1. 标准访问 - PS4™ 扩展, 编译工具及技术支持.
+2. 源码访问 - PS4™ 扩展, 编译工具及技术支持连同 Defold 引擎用于访问 PS4™ 那部分的源代码.
 
 
 ### 标准访问
 
-Sony 批准的所有开发人员均可免费访问支持 Sony PlayStation® 的 Defold 版本. 作为获得批准的开发人员, 我们将为您提供以下访问权限:
+PS4™ 的正式开发者可以免费访问支持 PS4™ 的 Defold 版本. 作为获得批准的开发人员, 我们将为您提供以下访问权限:
 
-* Sony PlayStation® 相关 API 整合的扩展程序.
-* 用于编译打包 Sony PlayStation® 应用的 [命令行工具](/manuals/bob).
-* 提供 Sony PlayStation® 相关技术支持的论坛.
+* PS4™ 相关 API 整合的扩展程序.
+* 用于编译打包 PS4™ 应用的 [命令行工具](/manuals/bob).
+* 提供 PS4™ 相关技术支持的论坛.
 
 
 ### 源码访问
 
-只对 [活跃月度社区捐款](/community-donations/) 达到一定数额的开发者提供源码访问.
+只对 [活跃月度社区捐款](/community-donations/) 达到一定数额的 PS4™ 开发者提供源码访问.
 
 ![](images/nintendo-switch/register-defold.png)
 

+ 3 - 3
docs/zh/shared/consoles-faq.md

@@ -1,13 +1,13 @@
 #### Q: 为什么访问主机源码不免费?
 
-A: Defold 基金会的目标之一就是让 Defold 软件和代码面向全世界免费. 我们不会食言, 但是接入 Nintendo Switch 和 Sony PlayStation 的 SDK 是人家说了算. 也就是说对 Nintendo 和 Sony 的支持, 编辑器, 各种工具, 我们没法自己做出来. 同样 Defold 基金会的社区贡献者也没法自己做出来, 为了确保对主机平台的合法长远的技术支持, 就必须缴费了. 访问主机源码所需的费用将用于确保基金会拥有支持主机的必要资源.
+A: Defold 基金会的目标之一就是让 Defold 软件和代码面向全世界免费. 我们不会食言, 但是接入 Nintendo Switch 和 PlayStation®4 的 SDK 是人家说了算. 也就是说对 Nintendo 和 Sony 的支持, 编辑器, 各种工具, 我们没法自己做出来. 同样 Defold 基金会的社区贡献者也没法自己做出来, 为了确保对主机平台的合法长远的技术支持, 就必须缴费了. 访问主机源码所需的费用将用于确保基金会拥有支持主机的必要资源.
 
 
 #### Q: 开发主机游戏需要什么别的工具吗?
 
-A: 使用 Defold 编辑器和命令行工具都可以打包主机游戏. 一旦你取得了相应开发资格, 关于如何调试 Nintendo Switch 和 Sony PlayStation 游戏的方法也会发送给你.
+A: 使用 Defold 编辑器和命令行工具都可以打包主机游戏. 一旦你取得了相应开发资格, 关于如何调试 Nintendo Switch 和 PlayStation®4 游戏的方法也会发送给你.
 
 
 #### Q: 开发跨平台游戏加上主机游戏, 一个代码库够用吗?
 
-A: 够用, 所有标准 Defold API 功能在主机游戏平台同样有效. 除此之外也许需要调用一些 Nintendo Switch 和 Sony PlayStation 的原生功能, 但总体上讲一套代码跨平台没问题.
+A: 够用, 所有标准 Defold API 功能在主机游戏平台同样有效. 除此之外也许需要调用一些 Nintendo Switch 和 PlayStation®4 的原生功能, 但总体上讲一套代码跨平台没问题.