Unity3D⼊门:为Unity的C#项⽬添加dll引⽤或安装NuGet包因为 Visual Studio 有强⼤的包管理器插件,所以即便是不熟悉 NuGet 命令的⼩伙伴也能轻松安装和管理 NuGet 包。不过,对 Unity C#项⽬来说,你并不能直接引⽤ dll,也不能直接使⽤⾃带的 NuGet 包管理器完成 NuGet 包安装。
本⽂介绍原因和真正的引⽤⽅法。
@
背景
对于传统 .NET/C# 的开发者来说,在解决⽅案中管理 NuGet 包,在 C# 项⽬中引⽤ dll 或 NuGet 包是家常便饭。但在 Unity 项⽬⾥⾯,你可能要改变这⼀观念——因为 Unity 项⽬⾥⾯实际上并不存在 sln 和 csproj ⽂件。
简单了解项⽬根⽬录的 sln ⽂件和 csproj ⽂件将有助于你理解为什么要像本⽂⼀样引⽤ dll 和安装 NuGet 包,因此如果你不了解,建议先阅读:
如何引⽤ dll 或者安装 NuGet 包
在 Unity 中,是给 C# 脚本引⽤ dll 或者安装 NuGet 包,⽽不能给 C# 项⽬做 dll 引⽤。
Unity 中引⽤ dll 有两种官⽅途径:
1. Assets\csc.rsp ⽂件,⽤于指定引⽤ .NET 运⾏时的 dll
2. Assets\Plugins ⽂件夹,⽤于指定引⽤单独的 dll ⽂件
当然,这两个能否正常使⽤,以及扔到 Plugins ⽂件夹中的 dll 应该是什么平台,取决于 Unity 项⽬的配置。
当然,引⽤ NuGet 包的话更推荐⾮官⽅的⽅法,详见:
配置运⾏时和 API 兼容性级别
在 Unity 编辑器中,打开“Edit”->“”->“Player”->“Other Settings”->“Configuration”。
这⾥我们关⼼脚本后端(相当于运⾏时部分),以及 API 兼容性级别。
脚本后端设置的是脚本如何运⾏,⽽ API 兼容性级别设置的是编译时应该使⽤哪⼀套 API。
选 Mono 那么使⽤ Mono 虚拟机运⾏,选 IL2CPP 那么会编译 IL 到静态的 cpp ⽂件不依靠 Mono VM。
如果选 .NET 4.x 那么你能引⽤到 .NET Framework 4.x ⼦集的 API,如果是 .NET Standard 那么能引⽤到 .NET Standard 程序集。
你可以通过 简单了解 IL2CPP 是什么。
mcs.rsp
如果你的 API 兼容性级别是 .NET Standard 2.0,那么你不应该使⽤此 mcs.rsp ⽂件。因为当你选择 .NET Standard 2.0 的 API 级别后,.NET Standard 2.0 中的所有依赖就全部引⼊了,如果还缺,那也不会在 .NET Standard 2.0 ⾥⾯,你应该考虑后⾯“Plugins”的引⽤⽅式。
接下来,我们说说当你使⽤ .NET 4.x 的 API 级别时,应该如何使⽤ mcs.rsp 来引⽤ dll。
例如对于下图(图来⾃微软官⽅⽂档),希望使⽤ .NET 4.x ⾃带的 HttpClient 类型。
向 Unity 项⽬的 Assets ⽂件夹新建⼀个 mcs.rsp ⽂件,⾥⾯添加以下内容:
-r:System.Net.Http.dll
这表⽰此 Unity 项⽬中的 C# 脚本引⽤ .NET Framework 中的 System.Net.Http 程序集。之后,你就能使⽤诸如 HttpClient 这些类型。你也可以使⽤同样的⽅式引⽤其他的 dll,每⾏⼀个。
默认情况下,Unity 会帮我们引⽤这些 .NET 4.x 的程序集:
mscorlib.dll
System.dll
System.Core.dll
System.Runtime.Serialization.dll
System.Xml.dll
System.Xml.Linq.dll
因此,你不需要⼿⼯将它们加⼊到 mcs.rsp ⽂件中。
Plugins
对于 .NET 4.x 或者 .NET Standard 2.0 中不带的类型,那么你应该使⽤ Plugins ⽂件夹来解决。
在 Assets ⽂件夹中新建 Plugins ⽂件夹,然后将你希望引⽤的 dll 丢进去就完成了。
引⽤ dll
因此,如果你已经拥有了 dll 了,那么直接往 Plugins ⽂件夹扔就好了。但是你需要注意,扔进去的 dll 需要兼容⽬标运⾏时(如 Mono 虚拟机)以及⽬标平台(例如 iOS)。
安装 NuGet 包
原⽣ Unity 项⽬不能直接安装 NuGet 包,但可以通过第三⽅插件实现。
原⽣
原⽣ Unity 项⽬并不能直接安装 NuGet 包,所以实际上对于 NuGet 包的引⽤是通过把包⾥的 dll 丢到 Plugins ⽂件夹来实现的。
既然如此,那就看如何丢进去更有效率了。
微软的⽅法是直接从 上直接把包下载下来,解压,然后将对应平台的 dll 从 lib ⽂件夹中取出来(例如 API 兼容性级别是 .NET Standard 2.0 的项⽬,请拷贝 lib/netstandard2.0 中的 dll 出来)。
因为 Unity 编辑器⽣成了 sln 和 csproj,所以在 Visual Studio ⾥安装也是可以的,不过这⾥的安装并
不会真实⽣效,⽽是我们在 Unity 项⽬的根⽬录的 Packages ⽂件夹中能到我们安装的 NuGet 包,也是从对应的⽂件夹中取出来 dll 丢到 Plugins ⽂件夹中。
第三⽅
更推荐⾮官⽅的⽅法,详见:
特别注意:反射需要额外⽀持
如果你前⾯的脚本后端(Script Backend)选择了 IL2CPP,那么⼩⼼ dll 的元数据会丢失,依赖于反射的功能也将崩溃。例如⼤量依赖于反射的 Newtonsoft.Json 库就会在此情况下⽆法正常⼯作。
如果你需要⽤到反射,或者你⽤到的某库中需要依赖反射功能,那么请在 Assets ⽂件夹中添加 l ⽂件,内容如下:
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all" />
</assembly>
</linker>
这将确保 Unity 的字节码剥离过程在导出到 IL2CPP 平台时不会删除必要的数据。参考资料
如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 欢迎⼤家加⼊。
unity3d入门
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论