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>