実現したいこと
シリアル通信で受信した情報(ポテンショメータなどのByte値)をUnityの操作に使いたい。
UnityのStandardAssetsのVehicleをつかったシミュレーションをしたいと考えており、
その入力を自作のArduinoコントローラからシリアルで入力し、
ハンドル操作、アクセル、ブレーキ操作ができないかと考えています。
しかし、現時点では再生モードにて車両は全く動かず、
ハンドル(実際にはタイヤ?)も全く動きません。
そして、Unityそのものが非常に重い状態になります。
シリアル通信を入力とすること自体がUnityの処理によくないのでしょうか?
もしくはシリアルの通信速度の問題(今は9600bps)でしょうか?
前提
入力装置として、複数のポテンショメータと接続したArduinoを制作し、
USBポートを使ってシリアル通信をしています。
また、課題をステップバイステップで解決するために、
事前にVehicleではなく、簡易的なブロックを回転させたり、移動させたりする
トライアルをしましたが、そのときは入力装置の入力がUnity上の3Dのモデルに
動きとして反映されていました。
発生している問題・エラーメッセージ
エラーはありません。
該当のソースコード
こちらはUnityのStandardAssetsのCarUserControlというスクリプトを編集した時のものです。
using System; using UnityEngine; using UnityStandardAssets.CrossPlatformInput; using System.Collections; using System.Collections.Generic; using System.IO.Ports; using System.Threading; namespace UnityStandardAssets.Vehicles.Car { [RequireComponent(typeof (CarController))] public class CarUserControl : MonoBehaviour { private CarController m_Car; // the car controller we want to use SerialPort SerPort = new SerialPort("COM3", 9600); string data; int ang1, ang2, ang3; float ang1f, ang2f, ang3f; private void Awake() { // get the car controller m_Car = GetComponent<CarController>(); if (SerPort.IsOpen) { SerPort.Close(); } else { SerPort.Open(); SerPort.ReadTimeout = 1000; } } private void FixedUpdate() { // pass the input to the car! float h = CrossPlatformInputManager.GetAxis("Horizontal"); float v = CrossPlatformInputManager.GetAxis("Vertical"); data = SerPort.ReadLine(); var datas = data.Split(','); var rb = GetComponent<Rigidbody>(); ang1 = Convert.ToInt32(datas[0], 16); ang2 = Convert.ToInt32(datas[1], 16); ang3 = Convert.ToInt32(datas[2], 16); ang1f = (float)(512 - ang1) / 512; // 1/300[deg] ang2f = (float)(512 - ang2) / 512; // [%] ang3f = (float)(512 - ang3) / 512; // [%] h = (float)(512 - ang1) / 512; v = (float)(512 - ang3) / 512; //Debug.LogFormat("%2.2f [deg], %3.2f [%], %3.2f [%]", ang1f, ang2f, ang3f); Debug.Log(h); Debug.Log(v); #if !MOBILE_INPUT float handbrake = CrossPlatformInputManager.GetAxis("Jump"); m_Car.Move(h, v, v, handbrake); #else m_Car.Move(h, v, v, 0f); #endif } } }
次にArudino側のスクリプトも添付します。
#define HDL A3 #define X A6 #define Y A7 char msgString[128]; void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.println("Start Box"); } void loop() { // put your main code here, to run repeatedly: int Ang1Raw, Ang2Raw, Ang3Raw; float Ang1, Ang2, Ang3; Ang1Raw = analogRead(HDL); Ang2Raw = analogRead(X); Ang3Raw = analogRead(Y); Ang1 = Ang1Raw * 5.0 / 1024; Ang2 = Ang2Raw * 5.0 / 1024; Ang3 = Ang3Raw * 5.0 / 1024; //Serial.print(Ang1); //Serial.print("[V]\t"); //Serial.print(Ang2); //Serial.print("[V]\t"); //Serial.print(Ang3); //Serial.println("[V]"); sprintf(msgString, "%x,%x,%x",Ang1Raw,Ang2Raw,Ang3Raw); Serial.println(msgString); delay(1000); }
試したこと
関連するByte値をConsole画面に表示しようとしましたが、
処理が重くなってLogが見れませんでした。
(正確に言うと見れてはいるが、Unityの画面の動きが遅く、リアルタイムに見ることができませんでした。)
補足情報(FW/ツールのバージョンなど)
Windows10
Unity5.5.4p4
visualStudio2015Community
回答3件
あなたの回答
tips
プレビュー