#Unity #Arduino real time Send data to Unity via Serial Port

Wayne Lee
3 min readApr 12, 2018

為了讓Unity可以根據外接裝置所輸入的值產生影像變化,可能可以透過不同的接口達成,像Serial Port、TCP/IP…等。

那這裡我是實作Send data to Unity via Serial port
材料:
Arduino*1
pressure sensor*1 (可有可無,可以在板子上寫固定的值固定delay)

結果呈現:

https://youtu.be/qOmIqXzdjR4

程式碼:

using UnityEngine;using System.Collections;using System.IO.Ports;using System;using System.Threading;public class write : MonoBehaviour {SerialPort stream= new SerialPort("COM5", 9600);string value;Thread myThread;float m;// Use this for initializationvoid Start () {stream.Open(); //開啟serial port接口,才能收資料myThread = new Thread(new ThreadStart(GetArduino)); //物件宣告及呼叫GetArduinomyThread.Start(); //這邊用thread,類似開啟另外工作站處理收集資料}//如果把資料收集跟影像改變寫在update會產生不同步問題,導致lag情況,所以這邊我用thread處理void Update(){float.TryParse (value, out m);m = m / 5 + 1;this.transform.localScale=Vector3.Lerp (this.transform.localScale,new Vector3(m,m,m), Time.deltaTime); //必須把Script放置在某遊戲物件上}private void GetArduino(){while(myThread.IsAlive && stream.IsOpen){value = stream.ReadLine();print (value);}}//關閉thread&serial port,否則會死當void OnDisable(){stream.Close();myThread.Abort ();}void OnApplicationQuit(){stream.Close();myThread.Abort ();}}

如上述所說,如果把收資料跟影像改變寫在Update裡,會有lag問題,所以thread像是在背景後運作,負責開啟另一條工作線處理收資料,影像部分就一樣寫在Update裡頭

程式概念很簡單
1. 開啟Serial Port,開啟Thread(另一個工作線)
2. Thread在背景後收資料
3. Update根據收到資料產生影像變化
4. 關閉Serial Port,關閉Thread

大概4這樣

--

--