Unity+ESP8266+加速度センサでゲームづくり
概要
Unityを触ってみたくなり,本を買っていじってみたところ,ゲームづくりが身近に感じられた.中でも,FlappyAzarashiという可愛い2Dゲームが気に入っている.操作はマウスのクリックやスマートフォンのタップでできるように用意されているが,ぬいぐるみをコントローラーに置き換えて操作してみたくなった.
結論
UnityのFlappyAzarashiの操作をESP8266マイコン+加速度センサADXL345にしてみた.
加速度センサを上下に振ることでFlappyAzarashiのあざらしが飛ぶ動作をしてくれた.
Unityゲームを加速度センサで制御できるように改造してみた.ぬいぐるみにセンサをつければ,雰囲気が出そう. pic.twitter.com/YzT7yVgbk3
— ギオン (@gioooon63) 2020年6月21日
実行したこと
準備したものは下記
実行環境
【ホストPC】
- windows10 64bit Home
- VSCode - 1.45.1
- PlatformIO(VScodeにインストール済み)
- Unity 2018.4.23f(UWP Build Support(IL2CPP), UWP Build SUpport(.NET))
【ターゲットボード】
- ESP8266 NodeMCU LUA CP2102 ESP-12E
【センサ類】
- ADXL345*1
手順
-
UnityでFlappyAzarashiを作成する.
Unityを用意して,FlappyAzarashiというゲームを作成する.
作成に参考にしたのは,こちらの書籍.
Unityはもちろん,C#も初めてであったが,本の通りにすればそれなりにゲームができていくことは面白かった.しかし,まだUnityの専門用語が身についてはいない.
準備としては,FlappyAzarashiの章を一通りすればOK.
2. ESP8266マイコンと加速度センサを組み合わせる.
加速度センサをコントローラーに置き換える.
具体的にはz軸の検出値がしきい値を超えたら,マウスのクリックに相当する動作に対応させる.
ADXL345とArduino の組み合わせの例は多くあるが,多くは電圧レベル変換モジュールと組み合わせている事が多い.*2
ADXL345の動作電圧が2.0-3.6 [V]のためである.
しかし,あまりまだ理解できていないのだが,下記のサイトを参考に電圧レベル変換モジュールなしで構成をした.
https://sites.google.com/a/gclue.jp/fab-zang-docs/ni-yinkiiot/adxl345-i2c
作成した回路はこちら.
CSをVDDに接続してI2Cモードで動作させている.
NodeMcuのI2C接続がよくわからなかった.ピン配置はこちらを参考にしたが,
https://analogicintelligence.blogspot.com/2019/06/micropython-devkit.html
こちらにNodeMCUとArduino のI2C接続例があったので,NodeMCUのD1-SDA, D2-SCLという接続にした.
https://www.electronicwings.com/nodemcu/nodemcu-i2c-with-arduino-ide
z軸のみシリアル通信をするようにしている.
ある程度の加速度になると一様に大きな値になっている.もう少し加速度の程度に合わせた波形が得られるのだと思ったのだが.
3. ESP8266マイコンとUnityをシリアル通信をする.
ここからが少し大変だった.
UnityとArduinoの連携はUniduinoなどを用いた例がいくつかあったが,Uniduinoは今はサポートがされていなかった.
そこで,こちらのサイトを参考にさせていただいた.
http://rikoubou.hatenablog.com/entry/2018/01/16/175113
SerialHandlerスクリプトの作成などをUnityのFlappyAzarashi内のオブジェクトに適用させることは問題がなかったが,実行させてみるとエラーが発生した.
System.IOにPortが認識しないようである.この対処方法は下記のサイトが詳しかったので,参考にさせていただいた.
https://qiita.com/Fox_Kei/items/dbe10141e36f6a91ee83
UnityのBuild SettingsをUWPに変更することが肝のようである.このUWPの適用に時間がかかったが,Unity Hubを使えば簡単だった.
あとは先のサイトのようにSystem.IO.Ports.dllを用意することでエラーはなくなった.
これで,UnityとESPマイコンとの間でシリアル通信ができるようになったため,加速度センサの値をUnity側で処理するようにプログラムを修正する.
コントローラー側のスクリプトは下記.
FlappyAzarashiのゲームコントローラに加速度センサの値を参照する
FlappyAzarashiがFlapする条件を加速度センサの値にする
もう少しスマートに書けるのだろうが,C#はよくわからないので.
Unity側のプログラム全体は下記.
加速度センサ側のプログラム全体は下記.
あとがき
加速度センサの判定が結構シビアなので,今のままだとゲームとしては面白くない.実際にぬいぐるみにセンサをうまくつけるともっと雰囲気が出ると思う.
マイコンにESP8266を使用しているので,シリアル通信ではなく,WiFiでもコントロールはできそう.もっと言えば,Bluetoothの方がいいのかもしれない.EPS8266はBluetoothがないので,ESP32に変更したほうがいいかもしれないが.
ゲームプログラミングは面白くしようと思えば切りがないが,ここまでやってみたところ,あまり完成度にはこだわれなくなった.デザインやらゲームの面白さやらにはあまり関心がわかなかった.