如何将通用代码移动到外部程序集中以用于 Unity 3d 项目?

How can I move common code into external assembly to be used in Unity 3d projects?

我必须在 Unity 中的多个项目之间共享一些代码。此代码在项目工作期间不断变化。所以我需要我的代码作为单独的程序集共享,并包含在 Visual Studio 2015 年的每个 Unity 解决方案中。

在公共程序集中进行更改以使其自动为其他项目和 Unity 编辑器更新的方法是什么?

假设我在这里有我的共享项目:c:\UnityProjects\DesignPatterns\ 并且需要在我的 Unity 项目中包含:c:\UnityProjects\Game\

解决方案:

  1. 将所有共享代码移动到单独的项目中 (c:\UnityProjects\DesignPatterns)
  2. 将此项目包含在您所有 Unity 项目的解决方案中。这允许您在需要时进行更改,而无需单独重新打开共享项目。
  3. 目前一切正常,除了 Unity 编辑器看不到您的外部程序集。您必须将其复制到 Unity 中的任何资产文件夹中。 Unity 会自动检测并创建 .meta 文件。让我们为此创建文件夹:c:\UnityProjects\Game\Assets\ExternalDLLs\
  4. 我们不想将最近构建的程序集复制到此目录中,我们希望自动生成它。 Visual Studio post-build 事件命令行可以帮助解决这个问题。右键单击 CSharp 项目和 select 属性,然后转到“构建事件”选项卡并将以下行添加到 post-build 事件命令行中:

    xcopy $(ProjectDir)..\DesignPatterns\bin\$(ConfigurationName)\DesignPatterns.dll" "$(ProjectDir)\Assets\ExternalDLLs\DesignPatterns.dll" /Y

现在每次我们构建解决方案时,此命令都会将我们的 dll 从共享项目的输出文件夹复制到我们项目的资产文件夹中。

请注意:必须在构建统一代码程序集之前构建共享项目。当您总是构建解决方案时就是这种情况。在其他情况下,请考虑从 Unity 临时目录复制程序集(您有此文件夹的宏 select)。

您的解决方案是在具有版本控制的子模块中。您有一个主项目的回购协议。然后你有一个文件夹,里面是另一个仓库。这是一个子模块。它在您的主仓库中显示为灰色,并且不会提交。

https://git-scm.com/book/en/v2/Git-Tools-Submodules

它确实适用于其他版本控制系统。

该模式的重点是您使用 utility-submodule 处理项目 A。 utility 是 Assets 文件夹中的一个文件夹。然后你修改 Utility.cs 并将其推送到 Utility repo.

项目 B 正在使用 utility-submodule 并进行拉取,您的修改就在那里而不会改变项目 B 的其余部分。显然,这包括版本控制提供的所有麻烦,即如果项目 B 发生冲突已经在实用程序上工作,如果您更改实用程序的实现等等,其他项目可能会中断(虽然没有什么不寻常的)。

另一方面,这是一种将通用代码传递给独立项目的简单方法。