VSCode+C#でDLLを作成してUnityで使用する方法


概要

VSCode+C#でDLLを作成してUnityで使用する

環境

Visual Studio Code: 1.60.1 (user setup)
 C# for Visual Studio Code (powered by OmniSharp).:1.23.15
.Net Framework SDK:4.7.1
Unity:2020.3.15f2

DLLプロジェクトを作成

今回作るプロジェクトは「DLLTest」とする
Unity側は「DLLTestUnity」とする

手順

  1. ディレクトリを作成しVSCodeで開く
  2. VSCodeのターミナルから作成コマンドを打つ
  3. .csprojを設定する
  4. プログラムを書く
  5. ビルドしてDLLを作成する

ディレクトリを作成しVSCodeで開く

VSCodeのターミナルから作成コマンドを打つ

dotnet new classlib -o DLLTest

.csprojを設定する

Unity用のDLLは「.Net4.x」または「.Net Standard 2.0」で作る必要がある
Unity+VSCodeでブレークポイントを使うのに必要な.NetFrameworkSDK4.7.1が入っているので今回はそれを設定した

プログラムを書く

「Class1.cs」を「DLLTest.cs」にリネームする
足し算を行うSumメソッドを作成する

namespace DLLTest
{
    public static class DLLTest
    {
        public static int Sum(int x, int y)
        {
            return x + y;
        }
    }
}

ビルドしてDLLを作成する

ビルドコマンドを叩く
publishではなくbuildにした場合は署名がなくてUnityで読み込めないので注意(はまった!)

※cdコマンドでDLLTestに移動してから次のコマンドを叩くこと

Windowsは以下

dotnet publish -c Release -r win-x64

Macは以下(未検証)

dotnet publish -c Release -r osx-x64

以下にDLLが作成されるのでUnityプロジェクトに持っていく

bin\Release\net471\win-x64

Unity上で実行

手順

  1. 新規Unityプロジェクトを作成する
  2. DLLをAssets以下に配置
  3. Test.csファイルを作成してMainCameraにつける
  4. 実行する

新規Unityプロジェクトを作成する

DLLをAssets以下に配置

Test.csファイルを作成してMainCameraにつける

Test.cs

using UnityEngine;

public class test : MonoBehaviour
{
    void Start()
    {
        var x = DLLTest.DLLTest.Sum(10, 20);        
        Debug.Log(x);
    }
}

実行する

DLL内にUnityのメソッドを入れる方法

手順

  1. UnityEngine.dllをDLLプロジェクトにコピー
  2. .csprojでDLLの読み込み設定
  3. プログラムを書く
  4. DLLを作成する
  5. UnityにDLLを上書き
  6. Test.csを書き換え
  7. 実行する

UnityEngine.dllをDLLプロジェクトにコピー

UnityEngine.dllをUnityから持ってきてDLLのプロジェクトにコピーする
UnityHubからインストールした場合、以下の場所にある

C:\Program Files\Unity\Hub\Editor\2020.3.15f2\Editor\Data\Managed

コピー先

.csprojでDLLの読み込み設定

以下を追加

<ItemGroup>
  <Reference Include="UnityEngine">
    <HintPath>UnityEngine.dll</HintPath>
  </Reference>
</ItemGroup>

プログラムを書く

namespace DLLTest
{
    public static class DLLTest
    {
        public static int Sum(int x, int y)
        {
            return x + y;
        }

        public static void ConsoleWrite(object message)
        {
            UnityEngine.Debug.Log(message);
        }
    }
}

DLLを作成する

Windows

dotnet publish -c Release -r win-x64

Mac

dotnet publish -c Release -r osx-x64

UnityにDLLを上書き

作成したDLLTest.dllをUnityのAssets以下のDLLTest.dllに上書き

Test.csを書き換え

using UnityEngine;

public class test : MonoBehaviour
{
    void Start()
    {
        var x = DLLTest.DLLTest.Sum(10, 20);        
        DLLTest.DLLTest.ConsoleWrite(x);
    }
}

実行する