キイロイトリらぼ

ぬいぐるみと一緒に生きていきます

Unity+ESP8266+加速度センサでゲームづくり

概要

Unityを触ってみたくなり,本を買っていじってみたところ,ゲームづくりが身近に感じられた.中でも,FlappyAzarashiという可愛い2Dゲームが気に入っている.操作はマウスのクリックやスマートフォンのタップでできるように用意されているが,ぬいぐるみをコントローラーに置き換えて操作してみたくなった. 

結論

 UnityのFlappyAzarashiの操作をESP8266マイコン+加速度センサADXL345にしてみた.

加速度センサを上下に振ることでFlappyAzarashiのあざらしが飛ぶ動作をしてくれた.

実行したこと

準備したものは下記

  1. UnityでFlappyAzarashiを作成する.
  2. ESP8266マイコンと加速度センサを組み合わせる.
  3. ESP8266マイコンとUnityをシリアル通信をする.

実行環境

【ホスト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

  

 

手順 

 
  1. UnityでFlappyAzarashiを作成する.

Unityを用意して,FlappyAzarashiというゲームを作成する.

作成に参考にしたのは,こちらの書籍. 

Unityはもちろん,C#も初めてであったが,本の通りにすればそれなりにゲームができていくことは面白かった.しかし,まだUnityの専門用語が身についてはいない.

準備としては,FlappyAzarashiの章を一通りすればOK.

f:id:gijin94yobu:20200621171804p:plain

FlappyAzarashiの作成例
 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

作成した回路はこちら.

 

f:id:gijin94yobu:20200621182252p:plain

NodeMCU+ADXL345

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軸のみシリアル通信をするようにしている.

ある程度の加速度になると一様に大きな値になっている.もう少し加速度の程度に合わせた波形が得られるのだと思ったのだが.

f:id:gijin94yobu:20200621173713p:plain

NodeMCU+ADXL345で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を使えば簡単だった.

f:id:gijin94yobu:20200621175814p:plain

Unity HubでUWPモジュールを追加

f:id:gijin94yobu:20200621175948p:plain

Build SettingsでUWPを適用

あとは先のサイトのようにSystem.IO.Ports.dllを用意することでエラーはなくなった.

これで,UnityとESPマイコンとの間でシリアル通信ができるようになったため,加速度センサの値をUnity側で処理するようにプログラムを修正する.

コントローラー側のスクリプトは下記.

FlappyAzarashiのゲームコントローラに加速度センサの値を参照する

FlappyAzarashiがFlapする条件を加速度センサの値にする

もう少しスマートに書けるのだろうが,C#はよくわからないので.

 

Unity側のプログラム全体は下記.

github.com

加速度センサ側のプログラム全体は下記.

github.com

あとがき

 加速度センサの判定が結構シビアなので,今のままだとゲームとしては面白くない.実際にぬいぐるみにセンサをうまくつけるともっと雰囲気が出ると思う.

マイコンにESP8266を使用しているので,シリアル通信ではなく,WiFiでもコントロールはできそう.もっと言えば,Bluetoothの方がいいのかもしれない.EPS8266はBluetoothがないので,ESP32に変更したほうがいいかもしれないが.

ゲームプログラミングは面白くしようと思えば切りがないが,ここまでやってみたところ,あまり完成度にはこだわれなくなった.デザインやらゲームの面白さやらにはあまり関心がわかなかった.