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で開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/5adc8482-9d1e-d121-e8b6-94b1ca12994f.png)

## VSCodeのターミナルから作成コマンドを打つ
```
dotnet new classlib -o DLLTest
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/5c303544-6dbf-66db-bf50-2d2197e9c52b.png)


## .csprojを設定する
Unity用のDLLは「.Net4.x」または「.Net Standard 2.0」で作る必要がある
Unity＋VSCodeでブレークポイントを使うのに必要な.NetFrameworkSDK4.7.1が入っているので今回はそれを設定した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/2108a002-2b1b-9ade-6e2c-f23cbb8eae99.png)

## プログラムを書く
「Class1.cs」を「DLLTest.cs」にリネームする
足し算を行うSumメソッドを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/06b6572d-25bf-b795-577a-6200a2464416.png)

```
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
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/1ca3ebd3-8d1f-8b0b-fa59-c15ea3e6e1dc.png)

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

```
bin\Release\net471\win-x64
```

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

## 新規Unityプロジェクトを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/5d171ffc-d403-61a2-87e4-07dec0ac0e38.png)

## DLLをAssets以下に配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/2961754d-3b1b-6125-c25a-20c5a43b3d9e.png)

## Test.csファイルを作成してMainCameraにつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/bc95ed24-67d6-1400-3629-7fd46357b01e.png)

Test.cs

```
using UnityEngine;

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

## 実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/9d00cabc-e483-6300-cd78-ffbb84cd73fb.png)

# 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
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/c2e8e58a-9f9e-2d8d-1829-c0e82f345ddc.png)

コピー先
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/e255b8fa-3822-e6e8-3d83-57a92dcbac1f.png)

## .csprojでDLLの読み込み設定
以下を追加

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/9e18a0dc-a294-a11d-d021-eddde1ca7ded.png)

## プログラムを書く
```
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);
		}
	}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/52c90f3e-3616-f284-51e2-66618d4cd659.png)

## 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);
    }
}
```

## 実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64194/1458750b-aa23-ac5b-034c-d1847d7088c3.png)