Unity(Ver4.5)で使用するC#スクリプトをVisual Studio Express 2013でクラスライブラリとして開発して、作成されたdllファイルをUnityのAssetsに登録します。このAssetsへの登録により、複数のゲームで同じようなロジック部分を外出しにして、使いまわしできるようにします。

プロジェクトの作成

今回はUnityでCOMポートを使用してシリアル転送ができるC#スクリプトを作成します。ます最初にプロジェクトを作成します。Visual Studio Express 2013のメインメニューバーから「ファイル」→「新しいプロジェクト」を選択して、プロジェクトのダイアログを表示させ、次のように設定して新規プロジェクトを作成します。

プロジェクトの作成

Visual Studio Community 2019 Version 16.3.1では次を選択します。

プロジェクトの作成

C#で「SerialHandler.cs」の作成

ゲーム中にCOMポートを使って、データをシリアル転送する共有関数「SerialHandler.cs」をC#スクリプトで作ります。つぎのC#スクリプトを「hecomi/SerialHandler.cs」からダウンロードします。

SerialHandler.cs

using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System.Threading;

public class SerialHandler : MonoBehaviour
{
    public delegate void SerialDataReceivedEventHandler(string message);
    public event SerialDataReceivedEventHandler OnDataReceived;

    public string portName = "/dev/tty.usbmodem1421";
    public int baudRate = 9600;

    private SerialPort serialPort_;
    private Thread thread_;
    private bool isRunning_ = false;

    private string message_;
    private bool isNewMessageReceived_ = false;

    void Awake()
    {
        Open();
    }

    void Update()
    {
        if (isNewMessageReceived_)
        {
            OnDataReceived(message_);
        }
    }

    void OnDestroy()
    {
        Close();
    }

    private void Open()
    {
        serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);
        serialPort_.Open();

        isRunning_ = true;

        thread_ = new Thread(Read);
        thread_.Start();
    }

    private void Close()
    {
        isRunning_ = false;

        if (thread_ != null && thread_.IsAlive)
        {
            thread_.Join();
        }

        if (serialPort_ != null && serialPort_.IsOpen)
        {
            serialPort_.Close();
            serialPort_.Dispose();
        }
    }

    private void Read()
    {
        while (isRunning_ && serialPort_ != null && serialPort_.IsOpen)
        {
            try
            {
                // if (serialPort_.BytesToRead > 0) {
                message_ = serialPort_.ReadLine();
                isNewMessageReceived_ = true;
                // }
            }
            catch (System.Exception e)
            {
                Debug.LogWarning(e.Message);
            }
        }
    }

    public void Write(string message)
    {
        try
        {
            serialPort_.Write(message);
        }
        catch (System.Exception e)
        {
            Debug.LogWarning(e.Message);
        }
    }
}

ここでコンパイルすると、つぎのようにUnityEngineが見つからないというエラーが出ます。このため、Visual Studio Express 2013でUnityEngine.DLLを参照設定します。

UnityEngineが見つからないエラー

UnityEngine.DLLの参照設定

Unity(Ver4.5)のUnityEngine.DLLは、「C:\Program Files\Unity\Editor\Data\Managed」に置かれています。これをデスクトップに置いて、Visual Studio Express 2013から参照させます。参照させるためには、Visual Studio Express 2013のソリューションエクスプローラーの参照設定を右クリックし、参照の対かを選択して、先ほどディスクトップに置いたUnityEngine.DLLを選択します。正常に参照できると、次のように参照設定の表示に、「UnityEngine」が追加されます。

UnityEngine.DLLの参照設定

Unity 2018.4.15f1 では、基底クラス「 MonoBehaviour」を使用するために、「UnityEngine.CoreModule.dll」を参照させます。

コンパイルすると「Unity Projects\SerialHandler\SerialHandler\bin\Debug」に「SerialHandler.dll」が作成されます。

dllファイルをUnityへ登録

作成された「SerialHandler.dll」を、次のようにunityのProjectのAssetsにトラッグします。

dllファイルをUnityへ登録

UnityはプロジェクトをIDEとSyncする際に、Assets以下にあるDLLを自動でプロジェクトの参照に加えます。そのため、他のライブラリのDLL等もAssets以下にドラッグ&ドロップするだけで使用できるようになります。