sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

Unity コードをマネージド プラグイン (DLL) を作成して利用する

f:id:shikaku_sh:20200910152454p:plain

C# で書いたコードをあらかじめ マネージド プラグイン として DLL 化して、Unity で利用するやり方をメモした記事です。自分で使うライブラリーの中で成熟したものは、もう DLL にしてしまってもよいかもしれません。

まず、Unity のプラグイン形式として、つぎの2つがあります:

マネージド プラグインは、通常だとソースコードを書いたソースファイルとしてプロジェクトに保存されており、ソースが変更されると Unity がコンパイルするようなものです。ただし、外部コンパイラーを使って、あらかじめ DLL 化しておくことも可能です

ネイティブ プラグインは、過去につくった sqlite の DLL のようにプラットフォームごとに別々の DLL を用意するタイプのものです。

この違いを把握しておくほうがよさそうですね。マネージドプラグインは環境に依存しづらく、ネイティブプラグインは環境(プラットフォーム)の影響を受けやすい、とか。汎用的なライブラリーを作成するなら、どっちのプラグインとして開発するでしょうか、とか。

Visual Studio 2019 でライブラリープロジェクトを作成

Visual Studio では、最初にプロジェクトを作成する際に、クラスライブラリーのコンパイル形式を決める必要があります。

Unity で利用できるクラスライブラリーを作成するには、Unity がサポートするコンパイル形式のライブラリーを作成する必要があります。

.NET Standard 2.0 .NET 4.x
.NET Standard サポートあり サポートあり
.NET Framework 制限あり サポートあり
.NET Core サポートなし サポートなし

こんな感じなので、実際的には .NET Standard か .NET Framework のクラスライブラリーを作成すればよさそうです。ポイントは .NET Core で作成しても使えないという点になりそうですね。

ただし、C# 8.0 を利用したい場合は .NET Framework だと今後は不都合な設定になるかもしれません。設定の変更によって C# 8.0 を利用できるようにもできますが、Microsoft サポート外です。まだまだ目新しいのですが .NET Standard にするほうがいいような気がします。どういうものか調べるだけでいいんで、デメリットがわからない・予想できない設定変更よりも、手間コストの先払いというだけで、やさしいと思います。

f:id:shikaku_sh:20201001104036p:plain:w600

クラスライブラリーに Unity の DLL を追加する

Unity API にアクセスできないと UnityEngine.Debug.Log() のような基本的なコードも書けません。不便なので Unity の DLL を参照に追加します。Windows だと以下のパスになります。

  • %ProgramFiles%\Unity\Editor\Data\Managed\UnityEngine.dll

f:id:shikaku_sh:20201001104119p:plain:w600 f:id:shikaku_sh:20201001104126p:plain:w600

これで、Unity 側の機能にもアクセスできるはずです。

個人的に DLL 化するなら、なおさら名前空間とうまく付き合うべきだと思います。「Unity 開発に関する 50 の Tips 〜ベストプラクティス〜2016 Edition」は考え方の参考になると思います。すべてのコードを名前空間に入れること、というTips があります。

利用

Unity のプロジェクトに対して、Plugins フォルダーの中に追加すればよいです。

ネイティブプラグインのときは、ここでも色々気をつかいましたが、プラットフォームを選ばないというのは楽ですね。

参考

C# Game Programming Cookbook for Unity

C# Game Programming Cookbook for Unity

  • 作者:Murray, Jeff W.
  • 発売日: 2021/03/15
  • メディア: ペーパーバック