在 Unity3D 中加入 Nuget 的 dll

  • 1497
  • 0

as title.

使用 Visual Studio 開發 .Net 應用程式時,可以在 Nuget Package Manager 下載各式各樣的 library 來提供功能,

不過在 Unity3D 中卻沒有直接的方式可以引用。

查了些資料,Unity3D 還是可以使用這些 Nuget package的,

使用的方式只要把想要使用的 dll 放到 Unity3D 專案中的 Assets 資料夾即可。

細節可以參考:https://docs.microsoft.com/zh-tw/visualstudio/cross-platform/unity-scripting-upgrade?view=vs-2019

不過這樣做還是有點麻煩,首先我得把nuget package下載下來,並且解壓縮,找到 dll 後再 copy 到 Unity3D的專案中,

手動的步驟實在是太多了。

把這問題拿去問google後,整理了一個解法,

首先在Unity3D的專案上加入一個 library 的專案,

以這個專案做為參考 nuget package 的入口,

這樣一來,就可以像在 Visual Studio 上開發一樣地使用 Nuget 上的資源,

接下來是 dll copy 到 Unity3D 中的問題,

這個可以利用自定義的 MSBuild 的 Task 來完成,

只要把定義好的 Task 設定在 PostBuildEvent 之後執行,就可以把已經在專案輸出目錄的 dll copy 到 Unity3D 的 Assets 目錄中。

Sample Code 如下

<PropertyGroup>
	<UnityTargetFolder>$(SolutionDir)Assets\Assemblies\</UnityTargetFolder>
</PropertyGroup>
<ItemGroup>
	<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" />
	<PackageReference Include="System.Reactive" Version="4.1.5" />
</ItemGroup>
<Target Name="PublishModule" AfterTargets="PostBuildEvent">
	<ItemGroup>
		<ModuleFiles Include="$(TargetDir)*" Exclude="$(TargetDir)$(AssemblyName).*;$(TargetDir)System.Runtime.InteropServices.WindowsRuntime.dll" />
		<UnityExistsAssemblies Include="$(UnityTargetFolder)*" />
		<UnityAssembliesSubFolders Include="$(UnityTargetFolder)**\" />
	</ItemGroup>
	<Delete Files="@(UnityExistsAssemblies)" />
	<RemoveDir Directories="@(UnityAssembliesSubFolders)" />
	<Copy SourceFiles="@(ModuleFiles)" DestinationFolder="$(UnityTargetFolder)" />
</Target>

我測試的專案是 dotnet standard library,預設只會 build 出專案本身的 dll,不會有 nuget 的 dll,

所以還要再設定 CopyLocalLockFileAssemblies 為 true,才會把 nuget 的 dll 輸出到 build 好的輸出目錄

<PropertyGroup>
	<TargetFramework>netstandard2.0</TargetFramework>
	<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>