Aizu-Progressive xr Lab blog

会津大学のVR部であるA-PxLの部員が持ち回りで投稿していくブログです。部員がそれぞれVRに関する出来事やVRにちなんだことについて学んだことを書いていきます。

「面白法人カヤックVR分室」としても活動しています。詳細はこちら

Serial Port Utility Pro for Unityを使って自作コントローラーを作って見た

こんにちは。学部二年の星です。
先日のハッカソンで気付いたのですが、Uniduinoのサポートが終了したようです。IVRCで我々のチームはUniduinoにお世話になりました。
TwitterでこちらのSerialPort Utility Proを見つけたので無料版を試して見ました。
f:id:aizu-vr:20190301061624p:plain
Serial Port Utility Pro for Unity :シリアル通信をUnityで簡単に。

公式のマニュアルがとても分かり易かったです。
コードでUSBポートを書くのではなく、ボタン一つでVendor ID,Product ID,Serial Numberを取得し、自動で設定してくれます。
シリアルの文字列の処理もとても楽に書くことができました。
f:id:aizu-vr:20190301063909p:plain

  • 今回やりたいこと

自作のガンコントローラーをUnity上で動かし、銃弾を放つ

  • 用いたもの

Unity2018.3.6.f1
Serial Port Unity Pro v2
Arduino Uno
ガンコントローラー (IVRCのときのバーナーに加速度センサをとりつけた。トリガーを引くとスイッチが押される仕組み)
f:id:aizu-vr:20190301062019j:plain
Arduino analogread した値をSerialprintする。ボタンが押された(引き金を引いた)とき”A"を末尾に加えてSerialprintする。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  Coordinate c = getCoordinate();
  showCoordinate(c);
  if(digitalRead(BottonPin) == LOW){//analogRead(BottonPin) == LOW
    Serial.print(",A");
  }
  Serial.println("");

  delay(30);
}
Coordinate getCoordinate(){
  Coordinate c;
  long x = 0, y = 0, z = 0;

  for(int i = 0;i < 100;i ++){
    x = x + analogRead(X_PIN);
    y = y + analogRead(Y_PIN);
    z = z + analogRead(Z_PIN);
  }
  c.cx = x / 100;
  c.cy = y / 100;
  c.cz = z / 100;
  return c;
}
void showCoordinate(Coordinate c) {
  Serial.print(c.cx);
  Serial.print(",");
  Serial.print(c.cy);
  Serial.print(",");
  Serial.print(c.cz);
}

Unity側の処理
Sprit code,Feed code を選択して、シリアルの値をListにぶちこむ。
floatに変換し、銃オブジェクトを回転させる。

public void Readvalues(object data)
    {
        var text = data as List<string>;
        for (int i = 0; i < text.Count; ++i)
        {
            if (text[i] == "A")
            {
                Debug.Log("shoot!");
                ShootGun();
            }
            else
            {
                Test_Value.Add(float.Parse(text[i]));
                Debug.Log(text[i]);
            }
        }
        double degX = Mathf.Atan2(Test_Value[0] - 507, Test_Value[2] - 558) / 3.14159 * 180.0;
        double degY = Mathf.Atan2(Test_Value[1] - 520, Test_Value[2] - 558) / 3.14159 * 180.0;

        gun.transform.rotation = Quaternion.Euler((float)degX, 0, (float)degY);
        Test_Value.Clear();
}

動画の乗せ方がわからなかったので写真ですが、一応できました。
ガンコントローラーとして使えるレベルの精度で操作はできませんでした。もっと勉強し、更新したいと思います。
f:id:aizu-vr:20190301062524j:plain

  • 使って見た感想

機能のほんの一部しか使えていないが、通信はとても楽に実装できた。
プラグイン自体はとても使いやすいと感じたので、これから使っていきたいです。

  • 最後に

参考にさせていただきました。
【Unity/Arduino】UnityとArduinoの加速度センサを連携してみた - ソースに絡まるエスカルゴ
UnityのオブジェクトをArduinoと加速度センサで動してみる - ちょっと未来

会津大学VR部の部員が持ち回りで投稿していくブログです。特にテーマに縛りを設けずに書いていきます!