你好呀!如果您是一名游戏开发者,希望创建一款托管在互联网计算机区块链上的游戏,那么您很幸运。

我创建了一个简单的 Unity 项目来展示钱包集成和获取 NFT —— 专为您而设,现在您可以开始处理游戏中真正“有趣”的部分,而不必担心如何从 Unity C# 调用浏览器 Javascript。

您可以在以下网址查看此钱包集成演示:

  • ti5gm-bqaaa-aaaai-ab7oa-cai.raw.ic0.app

项目代码位于:

  • github.com/tommygames/ic-unity-template

IC Unity 模板演示

注意:该项目集成了一个名为 react-unity-webgl 的 npm 模块,以便 Unity C# 与浏览器 Javascript 进行通信以实现 Plug Wallet 集成,如果您不需要钱包集成或 Javascript 互操作性,则不要遵循本指南,因为有更简单的方法可以将简单的 Unity 游戏部署到 IC。

如果您想了解我如何从头开始设置项目,请跳至从头开始创建 IC Unity 项目部分;如果您只想下载并部署 Unity 项目,请跳至部署 IC Unity 项目部分;如果您想了解代码的工作原理,请阅读以下“它是如何工作的”部分。

它是如何工作的

Plug Wallet 集成需要 2 个功能才能发挥作用:

  • Unity C# 将事件分派给浏览器 Javascript

  • 浏览器 Javascript 将事件分派给 Unity

对于这两者,我们使用一个名为 react-unity-webgl 的 npm 模块,可以在这里找到它的文档:

  • npmjs.com/package/react-unity-webgl

对于第一个功能,我们使用在 Unity 中 .jslib 的插件来编写伪 Javascript(通常称为 UnityScript),在这里阅读更多相关信息:

  • docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html

如果您安装了 react-unity-webgl 模块,这些 .jslib 插件可以通过调用 dispatchReactUnityEvent("EventName")将事件分派到 React 浏览器 Javascript,您可以在 Unity 项目的 PlugUtils.jslib 文件中看到它的实现。

要调用这些函数,您必须将它们导入 C#,在 PlugUtils.cs 文件的 PlugUtilsInternal 类中可以看到这方面的示例。

对于第二个功能,我们从 React javascript 代码中调用 unityContext.send("GameObjectName", “FunctionName", jsonData),您可以在我们的 React 应用程序的 PlugUtils.js 类中看到它的实现。

这将调用指定 GameObject 上的指定函数,对于我的示例,我在 MainScene 中有一个叫做 ReactApi 的 GameObject,脚本包含一个名为 HandleCallback 的函数。

因为我希望每当 Unity 与浏览器 Javascript 对话时都有回调,所以我在 ReactApi.cs 文件中存储了与其索引关联的回调字典,这样,Unity 和 React 之间的任何通信都必须通过 ReactApi 文件,并且当返回 JSON 数据时将触发回调。

返回 JSON 数据后,我使用 Json.NET 将数据反序列化为一个对象,这些对象在 WalletDataTypes.cs 文件中定义。

如果 JSON 数据反序列化成功,它会将其显示到 UI,这就是一切的运作方式。

部署 IC Unity 项目

1. 从以下网址下载项目文件:

  • github.com/tommygames/ic-unity-template

2. 确保您安装了 Dfinity 容器智能合约 SDK(我在此项目中使用版本 0.9.3):

  • smartcontracts.org/docs/developers-guide/install-upgrade-remove.html

3. cd 进入 ic_unity_template Unity 项目内的文件夹(其中包含 dfx 项目)。

4. 运行 npm install 并确保所有节点模块均已正确安装,您可能必须遵循特定说明才能确保正确安装 dab-js 节点模块,说明可以在这里找到:

  • docs.dab.ooo/nft-list/getting-started

5. 在 ic_unity_template 文件夹内运行 dfx start --background 以在后台启动本地 IC 环境,运行 dfx deploy 以将 IC 容器部署到本地 IC 环境,部署完成后,它会告诉您一个可以访问该项目的 URL。

6. 要将项目部署到主网公共区块链网络,您需要 cd 进入该 ic_unity_template 文件夹并运行 dfx deploy --network=ic,部署后,它会告诉您 ic_unity_template_assets 容器的容器 ID,您可以通过访问以下网址来访问该项目:

  • https://.raw.ic0.app 

注意:在 URL 中包含 “raw” 关键字非常重要,因为 Unity 文件非常大,只能使用此关键字提供。

如果您对 Unity 项目进行更改并重新构建它,请确保将您的构建命名为 unity_build。

构建完成后,将 Build、TemplateData 和 StreamingAssets(如果存在)文件夹拖到您的 src/ic_unity_template_assets/assets 文件夹中(您可以忽略 index.html 文件),然后您可以重新部署到容器中。

感谢您阅读到这里,这就是如何通过 react-unity-webgl 集成部署示例 Unity 项目,以便在 Javascript 和 C# 之间进行调用,我希望您喜欢阅读并祝您在游戏开发冒险中好运,请随时在 Twitter 上联系我(@tommyinvests),我是 Plethora 游戏的首席开发者。

从头开始创建 IC Unity 项目

1. 创建一个新的 Unity 项目。

2. 下载并安装 Dfinity 容器智能合约 SDK:

  • smartcontracts.org/docs/developers-guide/install-upgrade-remove.html

3. dfx 是用于启动新 Dfinity 项目的主要命令行工具,它会使用模板代码自动填充项目,文档可以在这里找到:

  • smartcontracts.org/docs/developers-guide/cli-reference.html

4. 打开命令行并 cd 进入 Unity 项目文件夹,然后运行 dfx new project-name-goes-here 创建一个名为 “project-name-goes-here” 的新模板项目,这会在您的 Unity 项目文件夹中创建一个新的 dfx 项目。

注意:您不一定要在 Unity 项目文件夹中创建 dfx 项目,您也可以将它们放在单独的文件夹中。

5. 接下来,您需要修改模板 dfx 项目以与 React Web 框架兼容。

6. 我们将使用 React 框架作为 Unity 项目的包装器,以允许在 React javascript 代码和 Unity C# 之间发送消息,这使得钱包集成成为可能,并且还为您提供了将来将 Web 组件(在 React 中)覆盖在您的游戏之上的灵活性(如果您愿意)。

7. 我遵循这个 Dfinity 指南来使我的项目与 React 兼容:

  • smartcontracts.org/docs/developers-guide/tutorials/custom-frontend.html 

注意:您不需要遵循指南中的所有步骤,只需执行以下步骤:

  • 在你的项目文件夹中运行 npm install --save react react-dom

  • 在你的项目文件夹中运行 npm install --save-dev typescript ts-loader

  • 打开 webpack.config.js 并在插件部分上方添加以下代码:

  • 在项目的根目录中创建一个名为 tsconfig.json 的新文件,并将以下代码粘贴到其中:

8. 一旦将 dfx 项目设置为与 React 兼容后,您需要创建 React 项目文件,我使用 “Create React App” 命令行工具启动了一个默认的 React 项目:

  • reactjs.org/docs/create-a-new-react-app.html

9. 一旦创建 React 项目后,将 React 项目 scr 文件夹中的 index.html、index.js、index.css、App.js、App.css 和任何其他相关文件复制到 srcdfxsrc/project_name_assets/src 项目的文件夹中,这些是您所有私人文件的存放地,您还会注意到 assets 该文件夹旁边有一个文件夹 src,这是您所有公共文件的存放位置,包括您的 Unity 构建文件。

10. 一旦将 React 文件复制到 dfx 项目后,您需要确保为您的项目安装以下 npm 模块。

11. react -unity-webgl 模块非常重要,因为它允许我们在 React 和 Unity 之间发送事件,这些事件将允许 Unity 与浏览器 Javascript 交互并连接到 Plug Wallet,您可以在这里找到它的文档:

  • npmjs.com/package/react-unity-webgl

您可以通过在 dfx 项目文件夹中运行以下命令来安装它:

安装后,请按照 react-unity-webgl 文档中的说明修改您的 App.js 文件,App.js 的基本实现如下所示:

12. dab-js 模块是 Psychedelic 创建的一个库,用于帮助我们查询他们的 NFT 数据库,这将使我们能够获取用户 Plug 钱包中当前的所有 NFT。

注意:这个 npm 模块的安装过程有点复杂,在下载模块之前,您需要创建 Github 访问令牌并登录,请按照此处的说明进行操作:

  • docs.dab.ooo/nft-list/getting-started

13. 最后,您需要确保您的 @dfinity/agent、@dfinity/principal 和 @dfinity/candidnpm 模块使用 0.9.3 或更低版本,这是因为由于主体 ID 编码更改,dab-js 模块目前仅支持这些版本或更低版本,您可以运行以下命令来确保该版本:

14. 现在您需要构建您的 Unity 项目,打开 Unity 并转到 File->Build Settings 并切换到 WebGL 平台。

15. 然后去 Edit->Project Settings,设置 “Compression Format” 为 Disabled,IC 容器目前不支持 Gzip 或 Brotli 压缩格式。

16. 最后,返回构建设置并点击“构建”按钮,您指定的构建名称也会更改构建文件的前缀,让我们称我们的 “BestGame”,完成构建后,将 Build、TemplateData 和 StreamingAssets(如果存在)文件夹拖到 src/project_name_assets/assets dfx 项目中的文件夹中(可以忽略 index.html 文件),然后您需要返回到第 11 步并编辑您的 App.js 以获得构建文件的正确文件路径,如果我们的构建名称是 “BestGame”,那么我们的 App.js 文件将如下所示:

17. 完成这一步后,您就可以将游戏上传到 IC 了,cd 进入您的 dfx 项目文件夹并运行 dfx start --background 这将在后台启动本地 IC 环境,然后运行 dfx deploy 这会将您的 IC Unity 游戏部署到本地 IC 环境,完成部署后,它会告诉您一个 URL,您可以通过该 URL 访问您的游戏。

18. 要将您的 IC 游戏部署到主网公共区块链网络,您需要 cd 进入 dfx 项目文件夹并运行 dfx deploy --network=ic,部署后,它会告诉您 project_name_assets 容器的容器 ID,您可以通过访问以下网址访问您的游戏:

  • https://.raw.ic0.app

注意:在 URL 中包含 “raw” 关键字非常重要,因为 Unity 文件非常大,只能使用此关键字提供。

感谢您阅读到这里,这就是您如何通过 react-unity-webgl 集成创建 Unity 项目并将其部署到容器,以便在 Javascript 和 C# 之间进行调用,我希望您喜欢阅读并祝您在游戏开发冒险中好运,请随时在 Twitter 上联系我(@tommyinvests),我是 Plethora 游戏的首席开发者。

你关心的 IC 内容

技术进展 | 项目信息 | 全球活动

收藏关注 IC 币安频道

掌握最新资讯