はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】VisualStudio2019でコードをDLL化(マネージドプラグイン)してUnityで使ってみた

Unityのバージョン Unity2018.4.0f1

はじめに

今回はコードをDLL化してマネージプラグインを作成後にUnityで使ってみる記事になります!

みなさんプラグインと聞いてまずネイティブプラグインを思い浮かべる方も多いのではないでしょうか。

そもそもプラグインとは”機能拡張用のソフトウェア”のことを指します。
https://wa3.i-3-i.info/word11533.html

これはUnityでも用いられ、例えばAdmobunitypackageをインポートしたとき、Pluginsフォルダ内にAndroid用のプラグインIOS用のプラグインが入っているはずです。

Unityではこのプラグインを2種類に分けており、マネージドプラグインネイティブプラグインという名前がついています。

マネージドプラグイン は公式のリファレンスではこのように書かれています。

マネージドプラグイン はマネージドの .NET アセンブリーで、Visual Studio や MonoDevelop などのツールを使用して作られたものです。これらは .NET のコードのみを含んでいるため、.NET ライブラリーの対応していない機能にはアクセスすることができません。

次にネイティブプラグインをみてみましょう。

ネイティブプラグイン はプラットフォームごとのネイティブコードライブラリーです。これらは、システムコールやサードパティのコードライブラリなどといった、元々 Unity で使用できない機能にアクセスすることができます。

プラグイン - Unity マニュアル

今回は前者のマネージプラグインについて少しみてみたいと思います。

マネージプラグインにするメリット

マネージドプラグインは先程の説明のように、基本はUnityのスクリプトですべて表現することができます。

なので、一般的に DLL よりもスクリプトで作業をしたほうが簡単といえるかもしれません。

しかしマネージドプラグインにはいくつかメリットがあります。

  • C# のソースを隠蔽できる
  • 毎回のコンパイルをしなくてすむ
  • Unityによってサポートされていないコンパイラを使うことができる
  • あたらしいC#の機能が使える

2番目に関してですが、UnityのAsset内にあるスクリプトはEditorウィンドウがアクティブになったタイミングでコンパイルがされます。

ただスクリプトをDLL化することで先にコンパイルをしているので、再度コンパイルする必要がなくなるというわけです。

また、マネージドプラグインでも少しいじればUnity APIを利用することも可能です。

Visual Studioでプロジェクトを作成する

この記事ではVisual Studio 2019を使ってコードの作成、コンパイルを行います。

まずはVisual Studioを開き、 ファイル -> 新規作成 -> プロジェクト をクリック、 クラスライブラリ(.NET Framework) を選択します。
(.NET Standerdというのもあるみたいなのですが、正直よく分かっていません)

f:id:hanaaaaaachiru:20190524130850p:plain

f:id:hanaaaaaachiru:20190524131847p:plain

今回はDLLTestという名前で作成をしてみました。

f:id:hanaaaaaachiru:20190524132147p:plain

UnityのAPIを使えるようにする

やはりUnity APIが使えないとなにかと不便です。

今の状態ではusing UnityEngine;と書いてもエラーが出てしまうので、これを使えるようにUnity DLLの参照を追加する必要があります。

まずはソリューションブラウザーで参照の上を右クリック、参照の追加を選択します。

f:id:hanaaaaaachiru:20190524134748p:plain

左の欄の一番下にある参照を選択し、右下の参照を押して、UnityEngine.dllを選択します。

Mac OS Xでは

 Applications/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll

Windowsでは

Program Files\Unity\Editor\Data\Managed\UnityEngine.dll

にあります。

f:id:hanaaaaaachiru:20190524135030p:plain

f:id:hanaaaaaachiru:20190524141252p:plain

windowsの場合、~/Managed/UnityEngine/UnityEngine.dllもあるそうで、誤って私はこちらを参照してしまい上手くいかないことがありましたのでご注意を。

コードを書く

実際にコードを書いてみましょう。

using System;
using UnityEngine;

namespace DLLTest
{
    public class Utils
    {
        /// <summary>
        /// ランダムなUnityEngine.Colorを生成する
        /// </summary>
        public static Color GenerateRandomColor()
        {
            return new Color(UnityEngine.Random.value,UnityEngine.Random.value,UnityEngine.Random.value,1);
        }
    }
}

これをビルドすることでマネージドプラグの完成です。

ビルドする

ビルド -> ソリューションのビルドをクリック。

f:id:hanaaaaaachiru:20190524150533p:plain

すると下の出力に結果が表示され、dllのパスも表示されているはずです。

f:id:hanaaaaaachiru:20190524153208p:plain

f:id:hanaaaaaachiru:20190524151523p:plain

これをUnityのProjectビュー内のAsset以下好きなところのPluginsフォルダ内にドラッグアンドドロップしてください。

f:id:hanaaaaaachiru:20190524152229p:plain

実際にUnityで使ってみる

以下のようなスクリプトを作成後、ゲームオブジェクトにアタッチして、色を変えたいゲームオブジェクトのRendererコンポーネントを指定してください。

using UnityEngine;
using DLLTest;

public class TestUseDLL : MonoBehaviour
{
    //色を変えるゲームオブジェクトが持つRenderコンポーネント
    [SerializeField] private Renderer _targetRenderer;

    private void Start()
    {
        _targetRenderer.material.color = Utils.GenerateRandomColor();    
    }
}

f:id:hanaaaaaachiru:20190524161839g:plain

さいごに

これでマネージドプラグインの作成を一通りしてみました。

自作のプラグインを作ってると謎の高揚感があって私は結構好きな感じがします。

後でネイティブプラグインも触ってみたいと思います!