faq.md 17 KB


title: Defold 引擎和编辑器常见问题

brief: 关于 Defold 游戏引擎、编辑器和平台的常见问题。

常见问题

一般问题

问: Defold 真的免费吗?

答: 是的,具有完整功能的 Defold 引擎和编辑器完全免费。没有隐藏成本、费用或版权使用费。就是免费。

问: 为什么 Defold 基金会要免费提供 Defold?

答: Defold 基金会 的目标之一是确保 Defold 软件可供全球开发者使用,并且源代码免费提供。

问: 你们会支持 Defold 多久?

答: 我们对 Defold 深度投入。Defold 基金会 的设立方式保证了它将作为 Defold 的负责任所有者存在多年。它不会消失。

问: 我可以信任 Defold 用于专业开发吗?

答: 绝对可以。Defold 已被越来越多的专业游戏开发者和游戏工作室使用。查看 游戏展示 了解使用 Defold 创建的游戏示例。

问: 你们在进行什么样的用户跟踪?

答: 我们记录来自我们网站和 Defold 编辑器的匿名使用数据,以改进我们的服务和产品。在你创建的游戏中没有用户跟踪(除非你自己添加分析服务)。在我们的 隐私政策 中阅读更多相关信息。

问: 谁创造了 Defold?

答: Defold 由 Ragnar Svensson 和 Christian Murray 创造。他们从 2009 年开始开发引擎、编辑器和服务器。King 和 Defold 在 2013 年开始合作,King 于 2014 年收购了 Defold。阅读完整故事请点击这里

游戏开发问题

问: 我可以在 Defold 中制作 3D 游戏吗?

答: 当然可以!引擎是一个完整的 3D 引擎。然而,工具集是为 2D 设计的,所以你必须自己完成大量繁重的工作。更好的 3D 支持正在计划中。

编程语言问题

问: 我在 Defold 中使用什么编程语言?

答: Defold 项目中的游戏逻辑主要使用 Lua 语言编写(特别是 Lua 5.1/LuaJIT,详情请参考 Lua 手册)。Lua 是一种轻量级的动态语言,快速且非常强大。从 1.8.1 版本开始,Defold 支持使用能生成 Lua 代码的转译器。安装转译器扩展后,你可以使用替代语言——如 Teal——来编写静态类型检查的 Lua。你也可以使用原生代码(根据平台不同,可以是 C/C++、Objective-C、Java 和 JavaScript)来为 Defold 引擎扩展新功能。在构建自定义材质时,使用 OpenGL ES SL 着色器语言来编写顶点和片段着色器。

问: 我可以使用 C++ 来编写游戏逻辑吗?

答: Defold 中的 C++ 支持主要用于编写与第三方 SDK 或平台特定 API 交互的原生扩展。dmSDK(用于原生扩展的 Defold C++ API)将逐步扩展更多功能,使开发者可以选择完全使用 C++ 编写所有游戏逻辑。Lua 仍将是游戏逻辑的主要语言,但通过扩展的 C++ API,也可以使用 C++ 编写游戏逻辑。扩展 C++ API 的工作主要是将现有的私有头文件移至公共部分,并清理 API 以供公共使用。

问: 我可以在 Defold 中使用 TypeScript 吗?

答: TypeScript 不是官方支持的。社区维护了一个工具包 ts-defold,用于编写 TypeScript 并直接从 VSCode 将其转译为 Lua。

问: 我可以在 Defold 中使用 Haxe 吗?

答: Haxe 不是官方支持的。社区维护了 hxdefold 用于编写 Haxe 并将其转译为 Lua。

问: 我可以在 Defold 中使用 C# 吗?

答: Defold 基金会将添加 C# 支持并将其作为库依赖项提供。C# 是一种广泛采用的编程语言,它将帮助那些大量投资于 C# 的工作室和开发者过渡到 Defold。

问: 我担心添加 C# 支持会对 Defold 产生负面影响。我应该担心吗?

答: Defold 不会放弃将 Lua 作为主要脚本语言。C# 支持将作为扩展的新语言添加。除非你在项目中选择使用 C# 扩展,否则它不会影响引擎。

C# 支持是有代价的(可执行文件大小、运行时性能等),但这由个别开发者/工作室来决定。

至于 C# 本身,这是一个相对较小的变化,因为扩展系统已经支持多种语言(C/C++/Java/Objective-C/Zig)。SDK 将通过生成 C# 绑定来保持同步。这将使绑定以最小的努力保持最新。

Defold 基金会以前一直反对在 Defold 中添加 C# 支持,但由于多种原因改变了看法:

  • 工作室和开发者继续要求 C# 支持。
  • C# 支持的范围已缩小到仅扩展(即工作量小)。
  • 核心引擎不会受到影响。
  • 如果生成 C# API,可以以最小的努力保持同步。
  • C# 支持将基于带有 NativeAOT 的 DotNet 9,从而生成现有构建管道可以链接的静态库(就像任何其他 Defold 扩展一样)。

平台问题

问: Defold 可以在哪些平台上运行?

答: 以下平台支持编辑器/工具和引擎运行时:

| System | Version | Architectures | Supported | | ------------------ | ------------------ | ------------------ | ------------------ | | macOS | 11 Big Sur | x86-64, arm-64 | Editor | | macOS | 10.15 | x86-64, arm-64 | Engine | | Windows | Vista | x86-32, x86-64 | Editor and Engine | | Ubuntu (1) | 22.04 LTS | x86-64 | Editor | | Linux (2) | Any | x86-64, arm-64 | Engine | | iOS | 11.0 | arm-64 | Engine | | Android | 4.4 (API level 19) | arm-32, arm-64 | Engine | | HTML5 | | asm.js, wasm | Engine |

(1 编辑器为 64 位 Ubuntu 构建和测试。它应该也能在其他发行版上运行,但我们不提供保证。)

(2 只要图形驱动是最新的,引擎运行时应该在大多数 64 位 Linux 发行版上运行,有关图形 API 的更多信息见下文)

问: 使用 Defold 我可以为哪些目标平台开发游戏?

答: 只需点击一下,您就可以发布到 PS4™、PS5™、Nintendo Switch、iOS(64 位)、Android(32 位和 64 位)和 HTML5,以及 macOS(x86-64 和 arm64)、Windows(32 位和 64 位)和 Linux(x86-64 和 arm64)。真正的一套代码库,多个支持的平台。

问: Defold 依赖哪种渲染 API?

答: 作为开发者,您只需要担心使用完全可编程渲染管线的一种渲染 API。Defold 渲染脚本 API 将渲染操作转换为以下图形 API:

:图形 API

问: 有什么方法可以知道我运行的是哪个版本?

答: 是的,在帮助菜单中选择"关于"选项。弹出窗口清楚地显示了 Defold 测试版版本,更重要的是,特定的发布 SHA1。对于运行时版本查找,请使用 sys.get_engine_info()

可以从 http://d.defold.com/beta 下载的最新测试版可以通过打开 http://d.defold.com/beta/info.json 来检查(稳定版本也存在相同的文件:http://d.defold.com/stable/info.json)

问: 有什么方法可以在运行时知道游戏在哪个平台上运行?

答: 是的,请查看 sys.get_sys_info()

编辑器问题

:Editor FAQ

Linux 问题

:Linux FAQ

Android 问题

:Android FAQ

HTML5 问题

:HTML5 FAQ

iOS 问题

:iOS FAQ

Windows 问题

:Windows FAQ

主机问题

:Consoles FAQ

发布游戏

问: 我正在尝试将我的游戏发布到 AppStore。我应该如何回答 IDFA 的问题?

答: 提交时,Apple 为其三个有效的 IDFA 用例提供了三个复选框:

  1. 在应用内投放广告
  2. 来自广告的安装归因
  3. 来自广告的用户行为归因

如果您选择选项 1,应用审核人员会在应用中寻找广告。如果您的游戏不显示广告,游戏可能会被拒绝。Defold 本身不使用广告 ID。

问: 我如何通过游戏获利?

答: Defold 支持应用内购买和各种广告解决方案。查看 资源门户中的盈利类别 获取最新的可用盈利选项列表。

使用 Defold 时出现的错误

问: 我无法启动游戏,也没有构建错误。出了什么问题?

答: 在极少数情况下,构建过程可能无法重新构建文件,特别是当它之前遇到过您已经修复的构建错误时。通过从菜单中选择 Project > Rebuild And Launch 来强制完全重新构建。

游戏内容

问: Defold 支持预制件吗?

答: 是的,它支持。它们被称为集合。它们允许您创建复杂的游戏对象层次结构,并将这些作为单独的构建块存储,您可以在编辑器中或在运行时(通过集合生成)实例化它们。对于 GUI 节点,支持 GUI 模板。

问: 我无法将游戏对象添加为另一个游戏对象的子对象,为什么?

答: 可能是因为您试图在游戏对象文件中添加子对象,而这是不可能的。要理解为什么,您必须记住父子层次结构严格来说是_场景图_变换层次结构。尚未被放置(或生成)到场景(集合)中的游戏对象不是场景图的一部分,因此不能成为场景图层次结构的一部分。

问: 为什么我不能向游戏对象的所有子对象广播消息?

答: 父子关系只表达场景图变换关系,不应被误认为是对象导向的聚合。如果您尝试专注于您的游戏数据以及如何在游戏改变状态时最好地转换它,您可能会发现不需要一直向许多对象发送带有状态数据的消息。在需要数据层次结构的情况下,这些可以在 Lua 中轻松构建和处理。

问: 为什么我的精灵边缘周围会出现视觉瑕疵?

答: 这是一种称为"边缘出血"的视觉瑕疵,其中图集中相邻像素的边缘像素会渗入分配给您的精灵的图像中。解决方案是用额外的相同像素行和列填充图集图像的边缘。幸运的是,这可以通过 Defold 中的图集编辑器自动完成。打开您的图集并将 Extrude Borders 值设置为 1。

问: 我可以为我的精灵着色或使它们透明,还是必须为此编写自己的着色器?

答: 所有精灵默认使用的内置精灵着色器定义了一个常量"tint":

  local red = 1
  local green = 0.3
  local blue = 0.55
  local alpha = 1
  go.set("#sprite", "tint", vmath.vector4(red, green, blue, alpha))

问: 如果我将精灵的 z 坐标设置为 100,那么它就不会被渲染。为什么?

答: 游戏对象的 Z 位置控制渲染顺序。低值在高值之前绘制。在默认渲染脚本中,深度在 -1 和 1 之间的游戏对象被绘制,任何低于或高于此值的都不会被绘制。您可以在官方渲染文档中阅读更多关于渲染脚本的信息。在 GUI 节点上,Z 值被忽略,根本不影响渲染顺序。相反,节点按照它们列出的顺序以及子层次结构(和分层)进行渲染。在官方GUI 文档中阅读更多关于 gui 渲染和使用分层优化绘制调用的信息。

问: 将视图投影 Z 范围更改为 -100 到 100 会影响性能吗?

答: 不会。唯一的影响是精度。z 缓冲区是对数的,对于接近 0 的 z 值具有非常精细的分辨率,而对于远离 0 的 z 值分辨率较低。例如,使用 24 位缓冲区,可以区分 10.0 和 10.000005,而 10000 和 10005 则不能。

问: 角度表示方式没有一致性,为什么?

答: 实际上有一致性。在编辑器和游戏 API 中,角度处处表示为度数。数学库使用弧度。目前,对于 angular_velocity 物理属性,约定被打破,它当前表示为弧度/秒。这预计会改变。

问: 当创建一个只有颜色(没有纹理)的 GUI 框节点时,它将如何被渲染?

答: 它只是一个顶点着色的形状。请记住,它仍然会消耗填充率。

问: 如果我即时更改资源,引擎会自动卸载它们吗?

答: 所有资源在内部都有引用计数。一旦引用计数为零,资源就会被释放。

问: 是否可以在不使用附加到游戏对象的音频组件的情况下播放音频?

答: 一切都是基于组件的。可以创建一个带有多个声音的无头游戏对象,并通过向声音控制器对象发送消息来播放声音。

问: 是否可以在运行时更改与音频组件关联的音频文件?

答: 通常所有资源都是静态声明的,好处是您可以免费获得资源管理。您可以使用资源属性来更改分配给组件的资源。

问: 有没有办法访问物理碰撞形状属性?

答: 不,目前不可能。

问: 有什么快速方法可以渲染场景中的碰撞对象吗?(就像 Box2D 的调试绘制)

答: 是的,在 game.project 中设置 physics.debug 标志。(请参考官方项目设置文档

问: 拥有许多接触/碰撞的性能成本是多少?

答: Defold 在后台运行一个修改版本的 Box2D,性能成本应该相当相似。您可以通过调出分析器来查看引擎在物理上花费了多少时间。您还应该考虑使用什么类型的碰撞对象。例如,静态对象在性能方面更便宜。有关更多详细信息,请参考 Defold 中的官方物理文档

问: 拥有许多粒子效果组件的性能影响是什么?

答: 这取决于它们是否正在播放。没有播放的 ParticleFx 性能成本为零。必须使用分析器评估播放中的 ParticleFx 的性能影响,因为它的影响取决于它的配置方式。与大多数其他事情一样,内存是为在 game.project 中定义为 max_count 的 ParticleFx 数量预先分配的。

问: 如何接收通过集合代理加载的集合中游戏对象的输入?

答: 每个代理加载的集合都有自己的输入栈。输入从主集合输入栈通过代理组件路由到集合中的对象。这意味着,仅仅让加载集合中的游戏对象获取输入焦点是不够的,_持有_代理组件的游戏对象也需要获取输入焦点。有关详细信息,请参阅输入文档

问: 我可以使用字符串类型的脚本属性吗?

答: 不可以。Defold 支持hash类型的属性。这些可用于指示类型、状态标识符或任何类型的键。哈希也可用于存储游戏对象 id(路径),尽管url属性通常更可取,因为编辑器会自动为您填充相关 URL 的下拉列表。有关详细信息,请参阅脚本属性文档

问: 如何访问矩阵的各个单元格(使用 vmath.matrix4() 或类似方法创建的)?

答: 您可以使用 mymatrix.m11mymatrix.m12mymatrix.m21 等访问单元格。

问: 使用 gui.clone()gui.clone_tree() 时,我收到 Not enough resources to clone the node 错误

答: 增加 gui 组件的 Max Nodes 值。您可以在大纲中选择组件的根时在属性面板中找到此值。

论坛

问: 我可以发布一个宣传我作品的帖子吗?

答: 当然可以!我们有一个专门的"Work for hire" 类别。我们将始终鼓励任何有益于社区的事情,向社区提供您的服务——无论是否收费——就是一个很好的例子。

问: 我发布了一个帖子并添加了我的作品——我可以添加更多吗?

答: 为了减少"Work for hire"帖子的刷屏,您在自己的帖子中每 14 天只能发布一次(除非是对帖子中评论的直接回复,在这种情况下您可以回复)。如果您想在 14 天内向您的帖子添加更多作品,您必须编辑现有帖子来添加内容。

问: 我可以使用 Work for Hire 类别来发布招聘信息吗?

答: 当然可以,随意使用!它可以用于发布招聘信息,也可以用于请求,例如"程序员寻找 2D 像素艺术家;我很富有,我会给你很好的报酬"。