将外部 ChessEngine 与我的 Unity 项目集成的正确方法是什么?

What is the correct approach to integrate an external ChessEngine with my Unity project?

我正在 Unity 中开发国际象棋游戏。我不是自己编写 AI,而是使用名为 MadChess 的国际象棋引擎。

我下载了引擎的源代码(用 C# 编写)以及名为“MadChess.exe”的可执行文件(基本上是一个命令通过提示我们可以按照 UCI 协议与引擎对话)

我以前没有真正将国际象棋引擎与统一项目集成,也无法在网上找到很多关于如何做的资源。

方法一: 最初,我在 Unity 中编写了一个 C# 脚本,它创建了一个单独的进程来与“MadChess.exe”通信,但后来我意识到这种方法有问题。这是因为当我将我的 Unity 项目构建为 Windows 的独立应用程序时,它依赖于位于我的 PC 上的物理“MadChess.exe”文件,即它不会将所有内容(我的 Unity 项目代码和国际象棋引擎代码)一起构建到单个可执行应用程序中。根据我的说法,这是错误的,只能通过创建游戏安装程序来纠正,该安装程序将“MadChess.exe”文件与我的主要 Unity 代码一起注入。

方法二: 现在,我正在尝试浏览 MadChess 国际象棋引擎项目的源代码,并基本上创建国际象棋引擎项目的 .dll 文件,我打算将其用作我的 Unity 项目中的插件。我最终会通过我在 Unity 中的 C# 代码与他们进行交互。方法对不对?

我被困在这个问题上大约一个星期左右,但仍然找不到明确的方法。我不想再花一个星期才意识到我做错了。即使我从一开始就错了,请告诉我。我只是想将国际象棋引擎与我的 Unity 项目集成。如果有人有任何建议或想法,或者以前有人做过,请指导我。我会很感激。谢谢你陪我到这里。

我推荐使用方法 1

这两种方法听起来都有效,但我建议使用方法 1 作为一个过程与 MadChess.exe 进行通信,因为这比方法 2 的工作要少得多,尤其是如果您已经使用了第一种方法(除了构建问题)。

此外,除了源代码之外,如果 MadChess 项目只提供 exe 而不是 dll 文件,那么我认为坚持使用隐式 "recommended" 的方法更安全由项目。当您尝试自己制作 dll 文件时,您不知道会 运行 遇到什么样的问题(听起来您已经 运行 遇到问题了)。

尽管应该可以使用 dll 文件,但我认为最好选择能让您更快地推进项目的方法。如果您 运行 遇到其他问题,您以后可以随时切换到方法 2。

(请确保在找不到 MadChess.exe 时显示适当的错误,以便您可以快速解决问题。)

如何将 MadChess.exe 作为构建的一部分包含在内

您不一定需要安装程序来将 MadChess.exe 文件包含在您的游戏中。您还可以复制 MadChess.exe 作为 Build Player Pipeline. Using either BuildPipeline.BuildPlayer or the PostProcessBuildAttribute, you can get the path of the built project, and then use FileUtil.CopyFileOrDirectory 的一部分,以便在构建步骤中复制 MadChess.exe

此外,正如@AdrianSgro 在评论中提到的,StreamingAssets 也可以。 (但请注意,文档明确提到如果您需要包含任何 dll 依赖项,则不包含此文件夹中的 .dll 文件。)