Unity透過GAS連接Google雲端試算表

DadaSam
Jan 10, 2020

--

本篇文章分享我將Google試算表作為簡易資料庫,並利用GAS與Unity連線的方法。

GAS(Google App Script)是一套類似微軟VBA(Visual Basic for Applications)的程式語言,VBA能夠控制Word、Excel等微軟自家軟體,GAS則是能控制google試算表、文件、Gmail等google套件。

也就是說GAS是一個像google文件、gmail等功能的一項google服務,這個服務能夠透過網址就直接運行程式碼。另外,他是一項serverless服務,也就是說google會提供他的伺服器,並在我呼叫這項服務的時候才運行程式碼。

GAS的額度是有限制的可以到下面連結看一下,自己拿來玩是非常夠用的,試算表是Spreadsheets。

https://developers.google.com/apps-script/guides/services/quotas?hl=zh-tw

一、前期測試

首先,創建一個google試算表來作為讀取與存儲的資料庫。

把試算表的ID記錄下來,等下要用來抓取試算表。

工具>>指令碼編輯器開啟編輯器,一進編輯器就會有一個預設的function,先用這個function來測試有沒有辦法連接到google試算表。

先上程式碼:

function myFunction() { var app = SpreadsheetApp.openById(“貼上你的試算表ID”); var sheet=app.getSheetByName(“你的工作表名稱”); sheet.getRange(2, 2).setValue(“你好!”);}

var app = SpreadsheetApp.openById(“貼上你的試算表ID”);這段是要透過試算表ID來抓取google試算表,在括弧裡填入剛剛從網址上紀錄下來的ID。

var sheet=app.getSheetByName(“你的工作表名稱”);這裡是要從名稱抓取google試算表裡的工作表,工作表就是在下方向是活頁標籤的欄位。

sheet.getRange(2, 2).setValue(“你好!”);這裡是獲取工作表裡(2,2)位置的表格,並賦予表格值,如果想獲取表格裡的值把setValue改成getValue就好了。

測試程式完成後,點擊上方像撥放按鈕的按鍵執行程式,會彈出核對權限的視窗,點選核對權限,並允許程式存取google帳戶,因為是我們自己寫的程式不會有什麼問題。

接下來就能到試算表確認測試的成果了!如果有出現剛剛在setValue填入的字串恭喜你,第一步成功了~

二、撰寫GAS讀取資料表

現在能操作試算表了,那就來試試看把試算表當成簡易資料庫吧!我先在試算表手動填入一些等下要用來讀取資料。

回到編輯器撰寫用來讀取的程式,先上程式碼:

http要傳輸資料可以透過Get跟Post,這裡我選擇使用Post。因為接收外部資料的端口只有一個Post,所以我在doPost裡分別做了Read跟Write的條件,當我想要從外部讀取時就使用Read,想要寫入時用Write。

doPost:是GAS的關鍵字,像是Unity的Start或是Update,GAS在使用post請求時會進入doPost

e:接收從外部傳遞進來的參數

return ContentService.createTextOutput(sheet.getRange(parameter.row, parameter.col).getValue()); 這段是要藉由ContentService回傳我從資料表獲取到的參數。rowcol則是要在外部(這裡是Unity C#)定義相同名稱的參數並傳遞進來。getValue就像前面所說是用來獲取該表格的內容。

簡單說明一下Get跟Post:

Get跟Post都是Http協定提供的method,Get會將傳輸的資料放在URL中傳輸,也就是說可以在網址直接看到傳送的資料內容,Post則是會將資料與URL分開傳輸,資料會放在 message-body 進行傳送,只要不開啟封包是看不到傳送的資料內容的,可以傳送的資料量也較大量。總結來說,Get的安全性比較低,可以傳送的資料量也較少,但費用較低,而Post安全性稍高一些,能傳送的資料量較多,費用較高。

回歸正題,如果要讓我的程式功能由外部程式執行,需要將程式發布到網路上,點選左上角的發布>>部屬為網路應用程式…,會彈出設定視窗,因為是第一版所以版本不用特別設定,最下面的權限記得改成Anyone,even anonymous這樣Unity才能夠存取,然後按Deploy。

部屬成功之後會彈出部屬網站的網址,先把這個網址複製下來,之後到Unity需要使用這的網址來操作網頁上的程式功能。

三、Unity讀取資料表

接下來要開始到Unity讀取剛剛做的試算表資料庫了,在Unity開啟一個C#專案,先上程式碼:

WWWForm form = new WWWForm();用來生成網頁表單放到post裡傳輸給網頁

form.AddField(“method”, “Write”);這段會新增一個名稱為”method”且內容為”Write”的參數在form裡面。

UnityWebRequest提供了一個模塊化的系統來提供http請求和處理http響應。

using (UnityWebRequest www = UnityWebRequest.Post(“剛剛複製的部屬網頁URL”, form))這裡會向剛剛部屬的網頁傳送Post指令並將前面宣告的form網頁表單傳送給部屬網頁。使用using是因為UnityWebRequest是繼承IDisposable介面的類別,需要使用using來確保使用完會被回收。

Debug.Log(www.downloadHandler.text);使用downloadHandler會顯示從網頁上抓取到的數值,也就是填在資料表裡的值。

downloadHandler補充:

有downloadHandler當然也會有uploadHandler,UnityWebRequest 類別設計方式分成三塊:

●UnityWebRequest:負責處理 HTTP 協定的傳輸處理

●UploadHandler:負責將資源匯整 (Marshal) 成二進位資料傳給遠端伺服器

●DownloadHandler:處理下載的二進位資料,以及最後將資料處理成應用層可用的資源。

(取自思元的開發筆記)

補充using陳述句:

在談using之前要先介紹C#有兩種類型的資源:託管資源與非託管資源。託管資源就是要使用new實例化的物件,C#會自動管理並釋放資源;非託管資源則是不受C#管理的物件,如檔案、資料庫連接等,需要手動釋放資源,而使用 using 主要目的就是為了讓物件建立的同時能確保該物件所佔用的資源一定會被完整釋放。

使用using有一個條件,就是該物件必須有實做 IDisposable 介面,才能確保在 using 的結尾數時自動執行 Dispose() 方法,而Dispose()就是用來釋放資源的方法。

回到Unity將程式拖曳到scene隨意一個物件之後按下play,在Debug看到資料表上的值就代表你成功了!

如果想要寫入資料到google資料表,只要將程式欄位Read改成Write就能寫入了,上程式:

WWWForm form = new WWWForm();form.AddField(“method”, “Write”);form.AddField(“row”, 2);form.AddField(“col”, 3);form.AddField(“content”, “TestHello”);

最後,如果要更新GAS程式碼的話,只要回到編輯器,點左上角的發布>>部屬為網路應用程式…,因為已經發布過了這次彈出的視窗不太一樣,要發布新版本必須要到Project version選擇新增再發布才會更新成最新的版本喔!

到這邊這次的GAS介紹也差不多了,前面提供了GAS最基本的傳輸方法,利用此方法可以藉由setMimeType(ContentService.MimeType.JSON)將資料轉換成Json傳送,這樣就能做出更多不同的應用。另外,因為從資料表傳送到Unity的Json是沒有經過排版的比較難閱讀,LitJson這個Plugin有提供PrettyPrint的方法來排版Json檔案可以參考看看。

Reference:

Google App Script到底是什麼

GET 與 POST 有什麼差別

Unity的WWW类的用法整理get post

C# 資源釋放及dispose

UnityWebRequest详解

--

--

DadaSam
DadaSam

Written by DadaSam

Unity工程師一枚。曾經在科技產業利用Unity掙錢,開發一些小遊戲,最近成為了大學講師。主要使用C#偶爾使用python,有時跑去玩VR/AR,最近正在學Html,CSS,Javascript。

Responses (3)