Unity Arduino 教學

Arduino 是一種應用廣泛的開發板,可用控制電子設備、連接各種感應器,而且價格不貴容易購買。

將 Arduino 開發板與 Unity 遊戲引擎結合可以製作多種不同的應用,提供鍵盤、滑鼠、觸控螢幕無法達成的互動功能。實際上在遊戲界已推出的裝置,都可以使用 Arduino 製作出來的。您可以到電子商場或購物網站選擇需要的購買 Arduino 開發板與相關零件,Arduino Uno 是比較多初學者選擇的型號,本教學使用 Arduino Leonardo 與 Pro Micro 開發板,而且能夠模擬鍵盤或滑鼠輸入來控制 Unity 遊戲,例如製作格鬥遊戲用大型搖桿。

參閱官方網頁

 

模擬鍵盤

部份型號的 Arduino 開發板可支援 Keyboard 輸入功能,主要是使用 ATmega32U4 或 SAMD 的開發板,例如 Leonardo、Esplora、Zero、Due 與 MKR 家族。本教學也會使用到 SparkFun Pro Micro 5V 16MHz 開發板,

開發板 Arcuino Leonardo Arcuino Pro Micro
5V/16MHz
Arduino Pro Mini 328
5V/16MHz
ATMega32U4 BS Micro Pro Micro Leonardo
處理器 ATmega32U4 ATmega32U4 ATmega328P-AU ATMega32U4
    micro-USB   USB
I/O 腳位 20      
類比腳位 12   8  
PWM 7 5

 

 
模擬鍵鼠 支援 支援    
      使用 FTDI 電纜  

 

若選擇的開發板不支援 Keyboard 上傳時會出現錯誤: 找不到'Keyboard',草稿碼有加入'#include <Keyboard.h>'這一行嗎?

選擇正確開發板即可解決問題,本範例使用 Arduino Leonardo 或 SparkFun Pro Micro 開發板,價格便宜而且容易購買。

 

匯入資源,將玩家角色的預製物件拖曳到場景,測試遊戲確認可以正常操作。

上傳到 Arduino 後連接電腦測試遊戲,使用時發現同時按下多個按鈕,將會因為衝突而無法正確輸入,稍後說明解決方法。

 

超音波感應器

當訪客進入超音波感測器的感應範圍時,將會傳送鍵盤的輸入訊號,達到觸發遊戲的互動操作。

範例使用 2 組超音波感測器連接到 Arduino 開發板,將可觸發不同的輸入,熟悉後可再依需求增加。

使用 HC-SR04 超音波測距模組 ( Ultrasonic Sensor ),價格約 70~80 元。

程式碼下載 [ Ultrasound_Keyboard | Ultrasound_Keyboard ]

 

 

Kreation.Arduino - On/Off Controller 是一套支援 Unity 遊戲引擎的免費外掛程式 [ 連結 ]

Arduino 官方網站 [ 連結 ]

使用 Unity 動畫編輯器即可製作 LED 燈光效果,控制伺服馬達,不需要撰寫程式。

使用 Unity 動畫編輯器製作 LED 燈光動畫,或是控制伺服馬達,無需撰寫程式也可以製作科技藝術的作品。

 

按下 JUST DOWNLOAD 下載程式。

 

選擇使用的開發板。

若您的電腦已偵測到 Arduino 開發板,即可從選擇對應序列埠。

部份型號的開發板需要 USB 轉 TTL 序列傳輸線( 例如 PL2303HXPL2303TA 傳輸線 )

紅色 +5V

黑色 GND

白色 RXD

綠色 TXD

 

ATMega32U4 BS Micro pro micro leonardo 開發板

 

Kreation.Arduino - On/Off Controller 使用 Firmata 協定,這是讓 Arduino 與 Unity 連線最簡單的一種方法。

執行 [ 範例 > Firmata > StandardFirmata ] 然後上傳,不需要自行撰寫程式。

 

Kreation.Arduino - On/Off Controller 是一套支援 Unity 遊戲引擎的免費外掛程式 [ 連結 ]

下載免費的 Kreation.Arduino - On/Off Controller 外掛程式。

 

 

本教學使用特殊的 5V LED 元件,請注意一般 LED 的電壓是 3V 左右,如果沒有串接電阻將會讓 LED 損壞,網路上有許多 Arduino 入門教學,請部份還請自行參閱 。

 

呼吸燈

警示燈 (紅色、藍色 LED)。

Arduino 開發板的輸出電壓是 5V,若需要控制 LED 亮度,可以使用 PWM ,

官網 https://www.arduino.cc/en/tutorial/PWM

 

按下 PLAY 測試遊戲,拖曳 Inspector 屬性編輯器的滑桿,即可控制 LED 亮度,使用 Animation 的關鍵影格,即可製作呼吸燈的效果。

 

警示燈 (紅色、藍色 LED 交替閃爍)。

使用 Arduino 開發板的 2 組輸出製作警示燈的效果。

 

伺服馬達(★機)

 

This is a documented On/Off Controller component with support for controlling Arduino UNO board output from a Unity game or application.

This asset supports an Arduino / Genuino UNO boards connected via USB serial and makes it possible to control the output signals on 5 digital/PWM pins - 3, 5, 6, 10 and 11 on the UNO.

This video explains how to use this asset with the Unity Animation window and Animator window to make a LED sequence light show that can be controlled from a Unity in-game UI. No code needed!

How to install Firmata on your Arduino UNO

How to animate LED light show with Unity Animation clips and control this with an Animation Controller triggered by UI in a Unity Application

 

用 Arduino 來玩 GTA5 遊戲吧!

好久沒運動了,找個理由動一動吧!

我覺得單純用跑步機運動比較無聊,那就用 Arduino 來玩 GTA5 吧!

 

特定型號的 Arduino 開發板可模擬鍵盤或滑鼠的輸入,製作遊戲控制器。

這次使用的 SparkFun Pro Micro 5V 16MHz 開發板,搭載 ATmega32U4 處理器,體積很小且可直接插在麵包板上。電子材料行也可以買到直插麵包板的模組化零件,對於不想焊接電子零件的人來說,可以節省一些工作的時間。

 

搭配水銀開關或傾斜開關。

走路或跑步時,轉換成前進的輸入訊號,

許多遊戲使用 WSAD 控制玩家前後左右移動,

 

製作遊戲控制器

將喝完的飲料瓶洗乾淨,待完全乾燥後放入麵包板,測試容器的尺寸是否適合製作遊戲控制器。Kelvin 老師找到的飲料罐,放入麵包板剛好可以完美固定。

使用電鑽打洞,用於安裝控制的按鈕,瓶蓋上也需要鑽洞,使用 USB 線連接 Arduino 開發板與玩遊戲的電腦。

需要注意的是 SparkFun Pro Micro 開發板的 USB 座使用 SMT 表面黏著技術製作,稍微碰觸就可能脫落,需要保護避免損壞。

 

#include <Keyboard.h>

void setup() {
Serial.begin(9600);
pinMode(button_pin,INPUT);
}

void loop() {

button = digitalRead(button_pin);//數位讀取

 

每次走路只能向前走一下,這是因為水銀開關只有擺動一次時按一下 W 鍵,這樣並不容易控制遊戲中的玩家角色。

為了提供前進的功能稍微修改程式,第一次開關接觸時開始按住 W 鍵,每隔一段時間判斷水銀開關是否再次接觸,如果符合條件,將會持續按住 W 鍵讓玩家角色前進,反之若玩家停止走動,水銀開關不再接觸,則放開 W 鍵停止前。

 

 

#include <Keyboard.h>
long int timer=0;
bool lock_one=true;

int set_time = 1000; //設定延遲時間
int button, button_pin = A0; //設定按鈕腳位

void setup() {
Serial.begin(9600);
pinMode(button_pin,INPUT);
}

void loop() {

button = digitalRead(button_pin);//數位讀取

if(button){ //按鈕按下後發送訊號
if(lock_one){
Keyboard.press('W');
lock_one=false;
}
timer = millis(); //更新計時
}

if(millis()-timer >= set_time){ //延遲超過時間關閉訊號
if(lock_one == false){
Keyboard.release('W');
lock_one=true;
}
}
delay(1);
}