手軽に触るUE4duino

# これはなに
この記事は鈴鹿高専Advent Calendar2023 18日目の記事です。

https://qiita.com/advent-calendar/2023/snct

本記事ではESP32を使用しますがその環境構築などは説明しませんのでご了承ください。
# UE4duinoとは

https://github.com/RVillani/UE4Duino

UE4とArduino(COMポート)のSerial通信を行うためのプラグインです。
Arduino専用というわけではなくCOMポートを使ってのSerial通信を行えるものなのでマイコンなら割となんでも通信できます。
入れ方については普通のプラグインと変わりません。

# 使ってみる
送ったメッセージをそのまま返すものを作ってみます
今回使用するものは以下になります
- Unreal Engine4.27
- ArduinoIDE
- ESP32

## UE4側でやること
LevelBluePrintにて以下のようなノードを作成しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/e97cdcd8-ec6a-90f6-a617-a04ee5cf54a8.png)


<dl>
  <dt>Open Serial Port</dt>
  <dd>COMポートとボーレートを指定してポートを開放します

  返り値にあるSerialオブジェクトで送受信するCOMポートを選ぶことができます</dd>
  <dt>Print Line</dt>
  <dd>Stringと改行(/n)を指定したCOMポートに送ります</dd>
  <dt>Read Line</dt>
  <dd>指定したCOMポートから改行(/n)までのStringを取得する</dd>
  <dt>Close Serial Port</dt>
  <dd>指定したCOMポートを閉じます</dd>
</dl>


## Arduino側でやること
以下のスケッチをESP32に書き込みます
```java:ue4duino_test.ino
String s;

void setup() {
  Serial.begin(115200);
}

void loop() {
  if (Serial.available()) {
    s = Serial.readStringUntil('\n');
    Serial.println(s);
  }
}
```
改行(\n)までstringを受け取ってそれを送り返すだけのシンプルなコードです
ボーレートはUE4で設定した値と合わせてください
## 結果
printlineで送った文字列がUE4に表示されます

# ミニゲームも作ってみる
UE4duinoを使う魅力はセンサー等を利用してふつうとは違うゲーム体験ができることだと思います。
なのでポテンショメーターを使って簡単な釣りゲームを作ってみようと思います。

## 準備
使用するものは以下
- Unreal Engine4.27
- ArduinoIDE
- ESP32
- ポテンショメーター(M22e10)

具体的にどんなデータをやり取りするかを決めます
ESP32のanalogreadで取れる値は0~4096で、今回は細かな値を送る必要はないので読めた値を100分の1した値を送ることにします

## Ue4側でやること
色々、やり方があると思いますが自分はwidgetのスライダーを利用して作成しようと思います。
ということでとりあえずwidgetのBluePrintを作成して、そのwidgetをLevelBluePrintで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/53e1a676-321c-4516-3d1d-2da559c18063.png)


後はこのwidgetの中身をこねこねするだけ
デザイナーはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/0d2b640a-e9f7-ce77-e2d4-b1adddea6f14.png)

気を付けることはスライダーのminとmaxをポテンショメーターで送られてくる値に合わせること。
今回は0~40の整数値が送られてくるのでmaxを40、minを0にします。
グラフの中身はこんな感じ
<details><summary>画像いっぱいなので折りたたみ</summary>
constructとdestructの処理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/af54f2a6-3001-501a-a3b3-7e6c96e4e9de.png)
tickの処理1(初期化と通信)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/de5224c5-5121-faaa-974b-1da8cf017076.png)
tickの処理2(釣りのゲージが100になったかの判別)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/a4912715-9458-eadb-d5d9-9a9ff5bdf546.png)
tickの処理3(釣りゲーム中の主な挙動)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/3ae01782-c622-8d2e-5733-f4b3747bcb0c.png)

</details>
これでUe4側でやることは終わり


## Arduino側でやること
以下のスケッチを書き込み
```java:ue4duino_fishing_game.ino
int kahen_teiko_pin = 32;
int kahen_teiko_data = 0;

void setup() {
  Serial.begin(115200);
  pinMode(kahen_teiko_pin, INPUT);
}

void loop() {
  int kahen_teiko_data = analogRead(kahen_teiko_pin) / 100;
  Serial.write(kahen_teiko_data);

  delay(50);
}
```
そしてポテンショメーターをESP32につなげます。
入力端子に3.3V、出力端子にGND、ワイパにはスケッチに定義されたio32を接続します。

## 結果
![fishing_game-_64-bit-Development-PCD3D_SM5_-2023-12-15-16-03-07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/b2377f72-6fd1-8e41-8f52-cf06e69e2b4d.gif)
ポテンショメーターを動かしてる様子

https://twitter.com/6nakimikan9/status/1735208235945296057

これで完成
# 余談
- Windowsでしか使えない…と思います。
筆者はWindowsでしか使ったことがないのではっきりはわかりませんが使えないと思います。
- UE4duinoとSerial通信をしようとした際、if(Serial.available())の部分でUe4からの通信が始まるまで処理が完全に止まってしまうという事案に遭遇しました
なぜif文で止まるのかはわかりませんでした
自分の研究でこのトラブルに遭遇した際は間に別のESP32をSerial2で噛ませて通信させる~~ゴリ押し~~方法をとりました。
- 間違っている箇所、おかしい箇所などあればコメントでお願いします...