Unity 中的 NuGet 包

Posted

技术标签:

【中文标题】Unity 中的 NuGet 包【英文标题】:NuGet packages in Unity 【发布时间】:2018-11-23 13:27:35 【问题描述】:

我想在 Unity 中使用一些 NuGet 包。我实现了Unity根据这篇文章(https://www.what-could-possibly-go-wrong.com/unity-and-nuget/)找到下载的DLL。 nuget.config 文件可以配置为将包下载到 Assets 文件夹内的 Plugins 文件夹中。问题是 NuGet 会下载每个 DLL 的多个版本(例如 net46、netcore50、netstandard21 等),而 Unity 不喜欢具有相同名称的多个 DLL。我知道我可以简单地将 DLL 手动放入 Plugins 文件夹中,但不幸的是,这不是一个让我满意的解决方案。

您知道我该如何解决这个问题吗?是否可以将 NuGet 配置为只为每个依赖项下载一个 DLL?

【问题讨论】:

您的文章谈到了问题和解决问题的方法。作者使用单独的 Visual Studio 项目来解决此问题。 查看 MS 文档 docs.microsoft.com/en-us/visualstudio/cross-platform/… 【参考方案1】:

只是想我会添加这个以防它帮助任何人

我使用Nuget for Unity 资产(免费)来导入一个包(websocketsharp),它真的很容易和无痛。 VS 中的引用也立即生效

您尝试导入的包自然必须与 Unity 兼容,但即使您手动导入也是如此。所以我建议尝试一下

【讨论】:

怎么知道包是否兼容unity? 通常在包自述文件中说它与 Unity 兼容。如果没有,那么最好的找出方法是尝试导入它并查看 Unity 报告任何兼容性错误。 this post 中有一些更有用的信息 包管理器对该包抛出各种错误。 @BrainSlugs83 在 repo 中提交问题可能是个好主意【参考方案2】:

这里are the details,

1. go to your desired NuGet package webpage.
2. on the right side **Download Package** option click it.
3. your package **.nupkg** file will be downloaded.
4. change its extension to .zip and extract it
5. go to lib and copy your package dll file from net or any netstandard folder. For [your unity project compatibility purposes][2] view this:

    6. open unity workspace and create plugin folder 
    7. paste your dll file here.

这里是 video 指南,我已经统一导入了 newtonsoft.json 包

【讨论】:

但是如果您有两个同名的 .dll 文件怎么办?一个 dll 用于 x64,另一个用于 x86 @Muhammad Fauzan Khan 你应该在插件文件夹 x86 和 x64 中创建两个文件夹并放置你的 dll 文件 作为记录,根据这个答案,您应该创建MyUnityProject/Assets/Plugins 并将您的.dll 文件放在那里【参考方案3】:

您真的不想走上将 Unity 配置为自动使用 Nuget 的道路。那篇文章比较老了。使用 Unity 2018,您可以获得 .net 标准 2.0 兼容级别,这对于 Nuget 包来说应该是完美的。只需使用单独的 VS 项目(如文章中所述)下载包,然后获取 netstandard20 版本的 DLL 并将其放入您的 Unity 项目中。

【讨论】:

最有可能的是,如果该库是在考虑其他平台的情况下实现的。 JSON.Net(甚至是 dotnet 标准版本)在 AOT 平台上尤其存在问题,至少在 Unity 内部是这样。 我刚刚在一个 IL2CPP 项目中使用了 Json.NET,它运行良好。 对于在 EditMode 测试中使用 FluentAssertions:将 netstandard20 DLL 放到 Plugins 文件夹中,然后打开 EditMode 程序集定义并添加 FluentAssertions.dll 的程序集参考。 (可能需要重新启动一些 Unity)。然后在您的测试 .cs 文件中,添加“使用 FluentAssertions;”你应该很好。 你救了我的命。非常感谢@Arshia001【参考方案4】:

使用本机 Nuget(适用于仅针对一个框架的包)

您可以创建一个nuget.config 和一个packages.nuget 文件并将它们放在项目的根目录中,而不是手动下载所有内容。

nuget.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
      <!-- This makes Nuget to place the packages at ./Assets/Plugins -->
      <add key="repositoryPath" value="./Assets/Plugins" />
  </config>
  <packageSources>
    <clear /> <!-- Delete packageSources from other nuget.configs -->
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
</configuration>

packages.nuget:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <!-- targetFramework="netstandard2.0" makes nuget to unzip the netstandard2.0 version of the package-->
  <package id="PackageA" version="1.0.0" targetFramework="netstandard2.0" />
  <package id="PackageADependsOnThis" version="1.0.0" targetFramework="netstandard2.0" />
  <package id="PackageB" version="1.0.0" targetFramework="netstandard2.0" />
</packages>

用法

要恢复这些包,请在终端中打开项目的根目录并输入以下内容:

nuget restore -NoCache

您可能希望省略 -NoCache,它会阻止 nuget 使用 C:\Users\&lt;username&gt;\.nuget\packages 处的缓存。如果您使用私有 nuget 提要,并且缓存中已有包符合您所需的包名称和版本但来自不同的提要,这将非常有用。

这种方法的缺点是您将同时拥有./Assets/Plugins netstandard2.0-Library 和 Nuget 包,如下所示: Nuget 包通常不是那么大,所以这不应该是一个因素。 另请注意,这种方法不会解决包依赖关系,您必须自己在packages.config 中列出它们。

编辑:我注意到另一个缺点:也将安装针对多个框架的 NugetPackages。这会导致 Unity-Error,需要自己删除这些框架安装。

另见

nuget.config reference

【讨论】:

【参考方案5】:

您必须在包文件夹/插件中手动设置下载的 nuget /is。 Nuget 不知道哪个插件可以使用 unity 以及如何使用。你可以在inspector中设置它们的参数:editor,standalone ... x86,x64 ...

【讨论】:

【参考方案6】:

NuGet2Unity 允许将任何 Nuget 包转换为“.unitypackage”。 我用它来转换“SpecFlow”,并且能够导入生成的 Unity 包。 查看他们的Examples。

它对我有用:

dotnet.exe run -n specflow --version 3.0.225

请注意,您可能需要跳过由 NugetPackage 提供的依赖项,这些依赖项已经由 unity 本身提供。

【讨论】:

NuGet2Unity 链接已损坏。

以上是关于Unity 中的 NuGet 包的主要内容,如果未能解决你的问题,请参考以下文章

NuGet 包中的文档消失了

如何调试我创建的 NuGet 包中的代码

Unity 中的 NuGet 包

使用 FHIR nuget 包通过引用查找包中的资源

适用于其他平台的 Unity 中的 Nuget 库

NuGet 包中的运行时异常引用类型:'无法加载文件或程序集'Foo'。该系统找不到指定的文件。'