スタンプ型デバイス(2) ~UnityとBluetoothSerial通信~

####まえがき
[前回](https://qiita.com/T170521/items/dcfa59f2861a6ef237b6)はデバイスを完成させましたので次は利用できるアプリケーションを作成していきたいと思います．

####本題
Unityと端末がBluetoothで通信できるようにする

#####機器概要
・Windows10 Laptop
・Unity 2019.3.2f1
・スタンプ型デバイス(M5StickC)

####手順
デバイスからの送信は前回実装したので今回はUnity側で受信するscriptを実装する
#####1.新規プロジェクトを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563922/41a3a7b8-0092-58df-a9d6-9a6eec0c4e15.png)

#####2.設定を変更
File/Build Settings...からUWPに変更
Switch Platformする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563922/ff746e6c-a77b-83c0-e541-2503a5151a8a.png)

#####3.script作成
受信するためのscriptは[こちら](https://gist.github.com/hecomi/f16a006cc0942a917cb3)をありがたく使わせていただきます．

以下のscriptをAssetsに作成

```c#:ColorChanger.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ColorChanger : MonoBehaviour
{
    public SerialHandler serialHandler;
    private bool flag = false;

    int num = 0;
    public Material[] array = new Material[5];
    void Start()
    {
        serialHandler.OnDataReceived += OnDataReceived;
    }
    void OnDataReceived(string message)
    {
        var data = message.Split(
            new string[]{"\n"}, System.StringSplitOptions.None); //受信する
        Debug.Log(message);

        switch (data[0]){
            case "ON":  //ONの時
                if(flag == false){  //一度だけ実行する
                    //オブジェクトの色を用意したMaterialの色に変更する
                    GetComponent<Renderer>().material.color = array[num].color;
                    num++;
                    if(num > 4) num = 0;
                    flag = true;
                }
                break;
            default:
                if(flag == true) flag = false;
                break;
        }
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563922/25a56d11-040a-5a34-332e-7689e6d2b0c6.png)

#####4.objectにアタッチ
Demo用にCubeを作成
Cubeに作成したscriptをアタッチする

**Serial Handler**
Port Name：作成したデバイスのBluetooth接続Portに変更
※今回はBluetoothがCOM6となっていた
**ColorChanger**
Serial Handler：Cubeをアタッチ
Array：変化させる色のマテリアルをいくつか作成してアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563922/9e945e88-3919-2a7b-9b65-e98640d8a4ee.png)

####実行例
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Unityで使えた！！ <a href="https://t.co/Iyj506nRYU">pic.twitter.com/Iyj506nRYU</a></p>&mdash; ゆーま (@sagirin262) <a href="https://twitter.com/sagirin262/status/1296675235211534336?ref_src=twsrc%5Etfw">August 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

####あとがき
次はHoloLens2での利用，スタンプデバイスの位置を取得する手法を考えようかと思います

####参考
[【Unity】ESP32マイコンでBluetoothでUnityと接続するコントローラを作る](https://techblog.kayac.com/unity_advent_calendar_2018_05)
[Unity2018でシリアル通信できない問題](https://qiita.com/Fox_Kei/items/dbe10141e36f6a91ee83)

[BluetoothSerialでお手軽無線通信(M5StickC)](https://qiita.com/naninunenoy/items/4cf9f00b99e56969e0b4)
[Bluetoothの自作デバイスを作りたい](https://mori.nc-net.or.jp/qa9659430.html)
[UnityでC#によりCOMポートからのデータ入力](https://tomosoft.jp/design/?p=7256)

[Serial Port Utility Pro](https://portutility.com/ja/)
[【Unity】Serial Port Utility Proをつかってシリアル通信する（Unity2019 & Win10 ※System.IO.Portsは使用しない）](https://qiita.com/aaaikmsu/items/88dd6a52b44a4af4b36c)