如何将 HTML5 Godot 导出嵌入到 React 应用程序中



我将解释这种情况:

这些是我在HTML5中导出Godot游戏后最终得到的文件: 导出文件

最相关的文件是"WYS 0.1.js">,因为所有其他有用的文件(如.pck文件)都是导入并用于在 HTML 文件中执行应用程序的地方。

简而言之,如果我理解得很好,这是一个非常大的文件,其范围是创建一个名为"Engine"的类,从中可以执行一些方法,如startEngine()对启动游戏很有用,遵循作为类参数传递的特定配置。 如果您想检查此文件,这里是链接:https://drive.google.com/file/d/12JYPd5ItYFFelcJcpIX3eU7kr42Y36up/view?usp=sharing (只需跳过最初的文本墙即可查看一些有意义的代码)。

HTML 文件如何执行游戏?

只需使用一个带有src属性指向"WYS 0.1.js">路径的<script>标签和另一个带有一些内联 JavaScript<script>标记,这些标签创建类引擎的新实例并处理正确加载游戏并动画加载游戏(将内联 javascript 移动到单独的 js 文件并在 src 属性中键入正确的路径不会中断执行)。

要正确执行游戏,需要在服务器上。因此,我使用命令行将自己放在导出文件夹中,并使用以下 Python 命令创建一个简单的服务器:python -m http.server 8080,一切都按预期工作。只是为了清楚。

反应部分:

使用npx create-react-app name-app命令创建应用程序后,我的第一次尝试是创建一个 React 组件,导入"WYS 0.1.js">,并将内联 JS 代码移动到一个单独的文件中,然后从该 React 组件使用引擎正确加载和启动游戏(通过在const Engine声明之前添加export来访问引擎)。但是,我得到的是一个编译错误,报告了很多未定义的变量和其他类似的东西:

第10:990行:意外使用"自我">

第 10:74354 行:预期赋值或函数调用,而是看到表达式

第 10:131511 行:"res"未定义

第 10:115986 行:意外使用"addEventListener">

如您所见,这些错误主要位于模块变量(文本墙)中,而在它之外,只有放置在文本墙下方的某个"定义"。

我还尝试简单地在npx create-react-app命令生成的index.html文件中添加<script>标签,但它根本不起作用。

我不清楚为什么在 HTML 部分中定义了某些内容,并且在 ReactApp 中移动时突然变得未定义。

提前感谢所有会帮助我的人,也因为关于这个主题的信息非常稀缺。

我设法在 ReactApp 中执行游戏,我不知道这是否是最好的方法,但它似乎有效。 这是我的解决方案:

godot 导出文件必须放在公用文件夹中,而不是放在公用文件夹的子文件夹中,主JS 文件"WYS 0.1.js">必须位于索引.html的同一目录中。有些文件可以排除,但是"WYS 0.1.js">,.wasm和.pck必须在该目录中,即使没有它似乎一切正常,我也会放.worklet.js

也就是说,要执行游戏,您需要复制"WYS 0.1.js">中的<script>标签,并将它们插入到由npx create-react-app name-app命令生成的索引.html文件中。实际上,在这种状态下,您需要复制整个<body>标签并将其放入索引.html中,因为第二个<script>标签中的内联 JavaScript 代码需要访问<body>中的某些元素来动画加载并在<canvas>标签中执行游戏。

因此,我们现在将跳到可重用性部分。

为了将游戏的执行包含在我可以在任何时间、任何地点渲染的ReactComponent中,我首先将内联 JS 移动到一个单独的 JS 文件中,init_godot_game.js,并将其导入到同一个<script>标签中,将路径放在src属性中。然后,我更改了这个代码在这个新的JS文件中移动的内容,只是将其放在我可以调用的函数中:例如init_game()。

现在,对于 React 部分,只需创建一个新组件并使其返回我们粘贴在索引中的"WYS 0.1.html">文件的所有正文内容.html,现在您可以从那里删除这些内容(在开始之前,您必须稍微更改此代码,以便它可以适应 JSX 语法)。

从这里开始,要执行游戏,您只需通过调用init_game()函数在正文中添加一个新的<script>标签,如下所示:

let script = document.createElement("script");
script.type = "text/javascript"
script.innerHTML = "init_game()"
document.body.appendChild(script)

您可以将这段代码放在useEffect(() => { ... }, [])或函数中,以便在需要时调用。我尝试通过导出来公开init_game()函数,并使用以下命令将其导入 ReactComponent 中:import { init_game } from "path",但无法导入src文件夹之外的内容。在src文件夹中移动init_godot_game.js会导致我之前方法的类似错误。这些文件似乎必须与index.html位于同一路径中

无论如何,可重用性的这些部分,甚至是你想如何加载游戏,都取决于你。您可以根据需要自定义它,如果我做得好,只需要几件事:

  • 你必须在JS文件中执行方法engine.startGame()。 在我的示例中,它处理加载和初始化游戏:init_godot_game().其余的都是微不足道的。
  • 在 ReactApp 中,在组件中或您要运行的任何位置 你的游戏,必须是<canvas id="canvas">标签,因为是什么 主JS文件想要作为游戏的容器。

告诉我你对此的看法,特别是如果你有更好的解决方案:)

最新更新