UnityでArduinoからシリアル通信を受け取る

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 　罠だらけらしいので最低限の動作確認から

#やること
UnityでArduinoのシリアル通信を受信するテストを行います。
逆方向の通信が必要な方は、当記事のチェック後に、[UnityでArduinoにシリアル通信を送る](https://qiita.com/Ninagawa_Izumi/items/ff8ae0dbb1bf8a120866)をご覧ください。

#主な参考URL
- [UnityとArduinoをシリアル通信](https://qiita.com/yjiro0403/items/54e9518b5624c0030531)

#環境
- Unity Hub
- Unity 2018.4.28f1
- Arduino

#Arduinoの準備

Arduino側のスクリプトはシンプルに下記のようにします。
"Hello, this is Arduino."という文字列のメッセージを1秒毎にシリアルに送信します。

```C:Arduino
void setup() {
  Serial.begin(115200); //シリアルポートを115200bpsで開く
}

void loop()
{
  //文字列のメッセージを1秒毎にシリアルに送信する
  Serial.print("Hello, this is Arduino.");
  Serial.println();
  delay(1000);
}
```
Arduinoに書き込んだら準備は終了です。

#Unityの環境設定
Unityのプロジェクトを作成し、環境設定を整えます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/fe02f286-8e57-abc1-5dd7-be61baa1dc13.png" width = 500>
Unity Hubより、バージョンを2018.4.28f1に指定してUnityの新規プロジェクトを作成します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/97c31125-ddfc-97f2-92e6-649c5028ac7b.png" width = 300>
メニューの「EDIT」→「Project settings...」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/5a904e48-2e0c-f640-b9cf-8d1d2fa60393.png" width = 500>
「Player」の「Other Settings」から、
- 「Script Runtime Version」 を「.NET 4.x Eauivalent」に設定。
- 「Api Compatibility Level」を 「.NET 4.x」に設定。

これで環境設定は完了です。

#Unityのスクリプト設定
Unityで使うスクリプトを２つ準備します。

#### ① SerialHandler.cs を作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/ceb4fc88-1790-d3ab-97d1-ad3de8f69161.png" width = 500>
スクリプトファイルを作ります。
画面下の「Assets」の中で右クリックし、「Create」→「C# Script」を選択。
ファイル名を「SerialHandler」とします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/ab825796-7d38-26ff-fdbc-bac1f5a32dc0.png" width = 500>
[UnityとArduinoをシリアル通信](https://qiita.com/yjiro0403/items/54e9518b5624c0030531)より、SerialHandler.csのスクリプトを作成したファイルの中にコピペします。

ファイルの内容を環境に合わせて書き換えます。
先に、ArduinoのIDE等で今回のシリアル通信で使うポート名を調べます。

スクリプトを、下記のように書き換えます。

```
    public string portName = "(調べたポート名)";
    public int baudRate = 115200;
```
終わったらセーブします。


#### ② SerialReceive.cs を作成します。
①と同様にC#のスクリプトを作成し、ファイル名を「SerialReceive」にします。
スクリプトは下記のようにします。

```C#:SerialReceive.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SerialReceive : MonoBehaviour
{
    //https://qiita.com/yjiro0403/items/54e9518b5624c0030531
    //上記URLのSerialHandler.cのクラス
    public SerialHandler serialHandler;

  void Start()
    {
        //信号を受信したときに、そのメッセージの処理を行う
        serialHandler.OnDataReceived += OnDataReceived;
    }

    //受信した信号(message)に対する処理
    void OnDataReceived(string message)
    {
        var data = message.Split(
                new string[] { "\n" }, System.StringSplitOptions.None);
        try
        {
            Debug.Log(data[0]);//Unityのコンソールに受信データを表示
        }
        catch (System.Exception e)
        {
            Debug.LogWarning(e.Message);//エラーを表示
        }
    }
}
```
終わったらセーブします。

#スクリプトをアタッチする
作成したスクリプトが実行できるようにします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/e099f2fb-c8a6-61a8-ba28-584e4907d950.png" width=200>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/d25a13dd-3d97-4d64-1c2e-29de64b2d510.png" width=200>
左上のヒエラルキーウィンドウの中で右クリックし、空のオブジェクトを作成します。
オブジェクト名を「Serial_Test」などに変更します。

次に、「Assets」内にある２つのスクリプト、「SerialHandler」「SerialReceive」をヒエラルキーウィンドウの「Serial_Test」オブジェクトにドラッグ＆ドロップでアタッチします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/50cd31f4-83d3-6026-fd20-87065c8d1661.png" width=600>
ヒエラルキーウィンドウの「Serial_Test」をクリックし、右のインスペクターウィンドウを確認します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/46e97865-3da0-9106-16e4-e9f6d5d0aa49.png" width=400>
インスペクターの「SerialReceive(Script)」の「SerialHandler」のボックスに、ヒエラルキーウィンドウの「Serial_Test」をドラッグアンドドロップしてアタッチします。

これで準備が完了です。


#実行
Unityの再生ボタンを押し、実行します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/204a9c30-fedc-aa2f-f080-23166409a301.png" width=400>
画面下部の「Console」タブを選択すると、Arduinoから受信したメッセージが表示されます。


#おわりに
これで最低限のArduino→Unity間のシリアル通信環境がなんとか整いました。
双方向通信やスピード調整、長いデータのやりとりなどに細かなTipsが必要のようなので、そのあたりを調べていきます。

次の記事では、Unityから送られたシリアル信号をArduinoで受け取りLチカをさせてみますので、よかったら合わせてお読みください。

- 次回記事：[UnityでArduinoにシリアル通信を送る](https://qiita.com/Ninagawa_Izumi/items/ff8ae0dbb1bf8a120866)

# 参考
下記のサイトを参考にさせていただきました。ありがとうございました。

- [SerialPort または Uniduino を使った Unity と Arduino を連携させる方法調べてみた](https://tips.hecomi.com/entry/2014/07/28/023525)
- [UnityとArduinoをシリアル通信](https://qiita.com/yjiro0403/items/54e9518b5624c0030531)
- [Unityでシリアル通信する際に試したこと](https://qiita.com/kaz0414/items/30e23e29770471a5f347)
- [Arduino+Unity（シリアル通信）するときの手順メモ ](https://note.com/ke_takahashi/n/n12ba947ec88c)