Unity 使用 RFID 控制物件開關(視覺化腳本)

2023.10.10 / Unity 引擎
這篇文章中我們將以 Arduino 開發板與 RFID 感測器來控制 Unity 圖片物件的開關。

本篇教學的器材皆由雲林科技大學數位媒體設計系 IMDLAB 實驗室提供。

建立視覺化腳本

建立「讀取 RFID 識別碼」邏輯

要從 Arduino 中讀取 RFID 資訊需要使用到序列埠(Serial Port),所以我們需要事先安裝好 Ardity 套件。

在場景中建立一個空物件,先加入 Serial Controller 組件,並修改 Serial Controller 的 Port Name 屬性為你在 Arduino IDE 中連接的 COM 接口名稱(例如:COM12)。

2023101118 Hnfj0rxwma

再加入一個 Script Machine 組件,並建立一個視覺化腳本與拖入 Script Machine 中,可參考 [Unity 教學] 建立視覺化腳本,最終空物件的內容如下圖:

2023101119 Ncjk2s1pym

點擊 Edit Graph 開啟腳本編輯視窗,分別建立「On Update」與 Serial Controller 的「Read Serial Message」節點。後者是 Ardity 套件的內容,如果你找不到 Serial Controller 的話請先完成 [Unity 教學] 安裝 Ardity

取得序列埠的字串資料後,我們要先判斷字串有沒有資料,再將字串列印出來(在 Console 顯示字串)。

請新增 String 的「Is Null Or Empty」、「If」、Debug 的「Log」,並以下圖的方式連接。

由於待會我們要讓三個 RFID 標籤在被感應後能分別顯示三張不同的圖片,所以現在需要將 RFID 標籤的識別碼記錄下來。請先執行專案,再分別拿三個 RFID 標籤進行感應,取得並記錄顯示在 Console 中的識別碼。如果找不到 Console,請參考 [Unity 教學] Console 面板

https://vimeo.com/873009966?share=copy

建立 image 變數

我們在這裡將要做出感應到三個不同的 RFID 標籤時將顯示不同圖片的效果,所以在需要先建立一個列表來儲存所有在場景上的圖片。

開啟腳本編輯視窗,並切換左下角的 Blackboard 到 Object,輸入「images」再按下 + 按鈕建立 images 變數。

點擊 images 變數的 Type,搜尋並設定為「List of Game Object」。

點擊 images 變數的 Value 右下角的 + 按鈕,建立三個元素,並點擊 ⊙ 分別為三個元素設定一張先前匯入的圖片物件。

建立「開始時關閉所有物件」邏輯

接下來於右側畫面中點擊右鍵,搜尋「onstart」建立 On Start 節點。

用相同方法再建立一個「For Each Loop」與「Game Object Set Active」節點,並依下圖來進行連接。

按住 images 變數的空白處,拖曳到右邊畫面中來建立節點,再將它的輸出連接到剛才建立的 For Each Loop 的第二輸入。

建立「感應 RFID 標籤顯示對應物件」邏輯

進入重點,我們要通過 Switch 邏輯來讓感應到的 RFID 能用它的識別碼來顯示對應的圖片物件功能。

請先建立一個「Switch」節點,並將 Read Serial Message 的字串輸出連接到 Switch 的輸入。

點擊選取 Switch 節點,於左上角的 Graph Inspector 的 Options 中新增剛才感測 RFID 標籤時取得的三筆識別碼。

新增四個「Set Flow Variable」來建立區域變數,並設定變數名稱為「index」,用變數的方式將觸發的物件於列表中的索引給記錄下來。再新增三個 Integer 和一個 Null,Integer 分別設定整數為「0」、「1」、「2」,連接方式如下圖。

接下來先建立一個「For Each Loop」節點,再新增一個我們在 建立「開始時關閉所有物件」邏輯 時用過的 images 物件,並與四個 Set Flow Variable 節點一起連接到 For Each Loop 中。

先新增一個「Get Flow Variable」來取得區域變數,名稱設定為剛才用於儲存物件在列表中的索引的「index」,再透過「Equal」來比對 For Each Loop 迴圈跑到的索引是否與 index 儲存的相同。如果相同的話,最後會通過 Game Object 的「Set Active」來將物件打開;如果不相同則會關閉。

執行結果

執行專案,效果如影片:

https://vimeo.com/873033048?share=copy

延伸練習:改成播放影片

現在我們已經學會如何透過視覺化腳本與 Arduino RFID 來控制 Unity 圖片或物件的開關,在最後我們可以來嘗試將顯示圖片改為播放影片。

由於 Unity 的影片與圖片是完全不同的東西,影片需要很明確的對它下「播放」或「停止」的指令,所以需要微調一下我們的腳本邏輯。

建立 Video Player

首先要先在場景中建立三個 Video Player 並完成相關設定,這在我們先前的 [Unity 教學] 使用鍵盤播放與停止影片 文章中已有示範過。

2023101123 Staogwz2wb

修改 images 變數

再來開啟腳本編輯器修改我們前面已建立的的 images 列表變數,調整它的 Type 為「List of Video Player」。最後新增三個元素,一一對應場景中的三個 Video Player 物件。

2023101122 Rquyqjnisr

修改「開始時關閉所有物件」邏輯

我們原先的邏輯是「在啟動時,隱藏所有圖片」。而現在的邏輯要改成「在啟動時,停止所有影片」。

僅需修改後端的 Game Object 的 Set Active,把它變成 Video Player 的 Stop 即可。

修改前:

2023101124 Ojihjeqepy

修改後:

2023101125 Wbmukluian

修改「感應 RFID 標籤顯示對應物件」邏輯

我們原本的邏輯是「感應 RFID 後,執行一個迴圈,如果迴圈跑到的索引與 RFID 感應時定義的 index 變數相同,則顯示圖片,否則隱藏」。現在的要改成「感應 RFID 後,執行一個迴圈,如果迴圈跑到的索引與 RFID 感應時定義的 index 變數相同,則播放影片,否則停止」。

將原本的 Game Object Set Active 刪除,加入一個 If 並在 True 的時候播放影片,False 時停止。

修改前:

2023101126 Hj6zex4vmg

修改後:

2023101127 2szfztxsnj

最後執行專案,感應 RFID 時顯示的影像將會變成影片播放。(記得先把前面加入的圖片刪除或隱藏)

相關文章

Ted Liou

雲科碩士在讀中,專注於 Unity C#、TouchDesigner 技術,常把技術筆記分享到部落格,偶爾還直接挪用文章來當教材的研究生。