項目 divider 尚未註冊或是沒有一個 view.php 檔案.

Unity C#入門語法教學

前言

在Unity裡要實作各種讓玩家能進行互動的功能,如讓角色根據玩家的操作進行移動,需要為其建構對應的程式腳本來讓其運作。

而建構程式腳本的方式又可分為使用C#,或是視覺化編程的方式進行(如Bolt)。

在這篇文章裡,我們將會說明你必須知道C#的語法與其功用。

準備開發環境

在開始說明C#之前,我們需要先準備好程式的開發環境。

本文所使用的是2021.3.19f1的Unity編輯器,建立一個使用2D或3D範本的專案都可以。

開啟Unity Hub新增專案。Unity C#入門語法

如果還沒有安裝Unity的話,可以參考Unity安裝流程詳解去進行安裝。

設置Visual Studio編輯器

當專案開啟後,點開編輯器左上方的Edit選單,找到並點擊Preferences選項,以開啟Preference視窗。

在Unity中開啟Preferences視窗。
Preferences視窗

點擊視窗左側的External Tools,好切換到視窗中的External Tools頁面。

切換到Preferences視窗的External Tools頁面。

檢查頁面中的External Script Editor是否為Open by file extension,是的話有兩種可能。一是代表你的程式編輯器有安裝好了,但還沒有設定好Unity要用這個程式編輯器;另一種可能則是表示你還沒有安裝到程式編輯器。

要檢查是否有安裝好程式編輯器了,我們可以點開該選項的選單,看看有沒有Microsoft Visual Studio 2019的選項(這是你可以直接在Unity Hub中安裝的選項),有的話則選擇該選項。

External Script Editor的選單。

如果沒有該選項的話,我們回到Unity Hub,並切換到安裝頁面。點擊所安裝的編輯器右方的齒輪按鈕以開啟選單。

編輯器右方的齒輪按鈕的位置。

選擇新增模組的選項。

選擇選單中的新增模組

在跳出來的頁面中,找到Microsoft Visual Studio 2019的選項進行安裝。

勾選Microsoft Visual Studio Community 2019

按下安裝後,會跳出Visual Studio Installer的安裝程式,按下繼續即可。

跳出的Visual Studio Installer的安裝程式

Visual Studio Installer會在安裝好後開啟,找到使用Unity進行開發並安裝

找到Visual Studio Installer中的使用Unity進行開發並安裝

安裝完成後,關閉並重新開啟專案,再回到Preferences視窗的External Tools頁面,接著打開External Script Editor的選單,就可以看到有Visual Studio Community 2019的選項了。

安裝完成後,打開External Script Editor的選單,就可以看到有Visual Studio Community 2019的選項了。

完成程式編輯器的安裝後,我們要準備一個空物件跟程式腳本。

首先,在Hierachy視窗中點擊滑鼠右鍵開啟選單,選擇Create Empty,創建一個空物件。

在場景中創建一個空物件。

選取該空物件,再在Inspector視窗中,點擊Add Component按鈕,開啟其選單。選擇New Script以附加一個新的程式腳本到空物件上。

為空物件新增元件(New Script)

點擊New Script,可以為該腳本命名。好了後,再按下下方的Create amd Add按鈕。

為要新增的腳本元件命名

空物件附加上腳本元件後的樣子如下圖。

新增腳本元件後的示意圖

我們可以在腳本元件名字上點擊滑鼠右鍵,開啟要對該元件執行甚麼動作的選單。

這裡選擇Edit Script,好透過程式編輯器開啟該腳本。

選擇選單中的Edit Script

程式腳本在程式編輯器中的預設樣子如下。

程式腳本在程式編輯器中的預設樣子

Start跟Update是甚麼

在程式腳本中,你會看到void Start跟void Update,並且它們的後面都接著一對的小括弧跟大括弧。

在說明他們的功能之前,我們先來想想遊戲世界是怎麼運作的。

只有當我們開始執行遊戲時,遊戲才會開始運作吧?

而遊戲開始的那個瞬間,在遊戲中的物件,它身上的腳本會執行Start的大括號裡的程式。

在執行過Start後,也就是遊戲持續運行時,Update的大括號裡的程式也將會開始並持續的執行。

換句話說,這兩個就是我們可以設定在這個腳本裡的程式要在甚麼時候執行的地方。

Start跟Update的特寫。

輸出訊息到Unity的Console視窗

這裡我們要先來學一個Unity所提供的程式功能,讓我們之後能在學習各種C#語法時,能藉由輸出訊息到Unity的Console視窗上,好看出不同與變化。

在Start跟Update裡分別打上Debug.Log();。在Debug.Log的小括號裡,可以輸入要輸出在Console視窗上的內容,這裡分別打上Start跟Update的文字。

好了後,儲存腳本回到Unity。

在Start跟Update裡分別打上Debug.Log();

按下Unity的播放鍵,來進入遊玩模式。

Unity播放鍵在編輯器的正上方的中間位置

切換到Console視窗,可以看到Start的訊息只輸出了一次,而Update的訊息則是一直在輸出著。

在Start跟Update輸出訊息的結果

若是能像上述所說的那樣執行的話,我們就可以再點擊一次播放鍵來取消遊玩模式。

各種變數型別

像是剛剛所輸出的文字型訊息,如果我們想要修改所輸出的訊息的話,還要回去修改Debug.Log的小括號裡的部分,然後儲存後,再重新進入遊玩模式…

這樣一來一往並不方便,對吧?

如果能直接在Unity對要輸出的訊息做修改呢?

要做到這件事,我們需要使用「變數」。

我們在NewBehaviourScript所對應的大括號裡,宣告兩個變數output_Start跟output_Update,並將Debug.Log的小括號裡的內容置換,改成在小括號裡呼叫變數。

宣告兩個String類型的變數

儲存好後,回到Unity。

看到Inspector視窗,可以看到在腳本元件裡多了兩個空間。這兩個空間代表著我們宣告的兩個變數。

新增兩個變數後腳本元件的變化

那都說了這麼久,變數到底實際能做甚麼呢?
我們假設在玩一個念紙條上寫的字的遊戲,念的人不管拿到哪一張紙條都要把內容唸出來,而紙條又分為a、b兩張。

而寫紙條的人,可以任意寫上任何內容,或做更改。

變數呢,就是那張紙條。裡面的內容可以任意地做變更。

而Debug.Log,在這裡的角色就像是遊戲中負責念出紙條的內容的人。我們只要在小括號裡呼叫這個變數,也就是告訴念的人這張紙條裡的內容。

我們這裡設定output_Start的的訊息為A,而output_Update為B。好了後,按下播放鍵。可以看到只輸出了一次A的訊息,跟無數次B的訊息。

Unity輸出了變數中所儲存的訊息

這時我們回想一下我們這一節開頭所說的問題。我們想要可以不用經過繁瑣的步驟,就能更改要輸出的訊息吧。

我們現在呢,保持在遊玩模式中,然後去修改output_Update裡的訊息。這裡改成C,可以看到Console視窗中,開始改輸出”C”的訊息了。

更改變數的訊息後,Unity所輸出的訊息也改變了

之所以沒有改output_Start,是因為Start只會在遊戲剛開始時執行一次,所以就算改了也不會再輸出訊息。

我們已經知道程式語言中有文字類型的訊息了,然而只有文字類型的資料並不足以有效地應付所有的開發需求,所以有其他的資料類型,像是表示整數類型資料的int(如5、6)、表示有小數點的數的float(如3.14),以及表示對(true)或是錯(false)的bool型別。

每一種變數型別,只可以儲存對應類型的資料。這像是規定某種顏色的紙條,只能寫某種類型的訊息。

那這麼多種資料類型,那我們要怎麼各自宣告他們的變數呢?

宣告的方式就像我們在上面所做的一樣:

宣告變數的固定句型

我們來看看各種訊息輸出後會長甚麼樣子。

首先,先宣告好各種類型的變數,並能將他們所記載的訊息輸出到Console視窗上。

宣告各種類型的變數並輸出到Unity上

接著,來看看各種類型的變數在Inspector視窗上長甚麼樣子。

各種類型的變數在Inspector視窗上的樣子

我們可以在各個變數裡,輸入對應的訊息。

為每個變數輸入對應的訊息

接著進入遊玩模式,看看輸出的結果。

輸出各種變數所存的訊息的結果

這裡可以特別注意到bool類型的變數,現在在inspector視窗中沒有勾選的狀況下,是輸出false。而在有勾選的狀況下,則會是輸出true。

bool類型的變數,在Inspector中不同的設定所輸出的結果。

看到這裡比較細心的讀者可能會注意到,我們在宣告變數的時候,都會比上面所說的宣告方式,還要在變數型別前增加一個public。這個public呢,是為了讓變數能顯示在Inspector視窗上所加的,如果把它去掉的話,變數就不會顯示在Inspector視窗上了。

if else

在遊戲中有了各種類型的資料後,我們可能會想對資料做些處理,像是紀錄了好幾個人的分數後,要去做排名。

假設現在有兩個人AB,他們的分數依序是35跟24。

宣告兩個int類型的變數

我們希望能按照分數高低去做排序,那要做排序之前,我們是不是要先能判斷誰的分數高或低。

在C#裡要做這種“是不是怎麼樣”或“如果是這樣”的判斷,我們會使用if/else。

像這裡,我們要判斷誰的分數比較高,好由分數高到低依序將名詞輸出到Console視窗上。

我們先來說說這裡判斷的邏輯:

如果A的分數比B高,則先輸出A,再輸出B到Console視窗上。

如果B的分數比A高,則先輸出B,再輸出A到Console視窗上。

化成判斷的程式碼的話,則會是像這樣:

在Start中進行兩個int變數的判斷

這裡的語法格式是,要判斷的條件放在if後面的小括號裡,而當條件成立時要做的事是放在後面的大括號裡。

判斷語法的句型

而條件裡用來比較數字大小的,是大於(>)、小於(<),這也被稱為關係運算子。

其他的還有大於等於(>=)、小於等於(<=),以及等於(==)。

而等於不只可以用來判斷是否是相同數字,對於其他型別的資料也可以進行判斷,像是比較兩串文字是否相同。

我們回到Unity,進入遊玩模式。可以看到因為A的分數比B高,所以是滿足了第14行的程式判斷,然後執行了第16、17行的程式。

根據變數所存的值不同而有不同的輸出結果。

陣列

有時候可能會想要蒐集好幾十個資料,如果按照前面一個資料用一個變數存,那不是就要宣告很多變數嗎?

宣告多個int類型的變數。

那有沒有比較方便一點的方法呢?

有,我們可以用陣列。

陣列可以用來儲存指定的資料型別的多個資料。

我們在程式中宣告一個陣列,再回到Unity來查看他的結構。

選告一個儲存int類型的資料的陣列

宣告語法:

陣列宣告的句型

可以看到剛剛宣告的陣列,並且在名稱的右手邊可以設定數字。

可以在Inspector設定陣列所能儲存的資料數

設定那個數字,是用來設定陣列中要有多少空間來存資料,每一個空間可以存一筆資料,就像一個變數。

我們設定他有5個空間,並且點擊陣列名稱左邊的三角形,將他展開。

展開以檢視陣列在Inspector中的樣子

然後在陣列裡的每個空間存入不同的資料。

為每個欄位填入不同資料

但存了以後呢?要怎麼取用陣列裡面所存的資料呢?

我們回到程式碼裡,呼叫要用的陣列的名字,跟指定要取得陣列中的哪一個資料。

這裡我們將該陣列的每一個資料都輸出到Console視窗上。

將陣列裡的每個資料輸出到Unity裡。

陣列的第一個資料的編號是從0開始計算的,所以第一個資料的編號是0、第二個是1,依此類推。

取用陣列資料:

如何取得陣列裡的資料

我們回到Unity來查看結果。

輸出陣列裡的資料的結果

可以看到程式就將陣列裡的資料給輸出出來了。

而沒有public的陣列則須要再加上一段程式,才能被正常呼叫。

如下所示,我們新增了兩個沒有public的陣列,其中一段有在後面加上= new int[5],並在Start中進行呼叫。

對沒有加上=new int [5]陣列的測試。

我們回到Unity來查看執行後的結果。

測試兩個沒有public的陣列的結果

可以看到第二個要輸出的訊息出現了錯誤。

沒有public的陣列要根據陣列要存放的資料型別,以及要存放多少個資料,來決定後面那段程式要長怎麼樣。

沒有public的陣列要漲怎樣的句型。

for迴圈

雖然我們現在可以只呼叫陣列就取得所有的資料,不需要用到好幾個變數,但是若我們想要把陣列的所有資料都輸出到Console視窗上呢,按照之前的做法是不是又要一個一個地去Debug.Log呢?

這樣也很不方便吧,所以我們這裡要來介紹可以讓你決定要重複去做一件事情幾次的程式語法for。

我們一樣先宣告一個整數的陣列,並給他儲存不同的值。

宣告一個int類型的陣列
在Unity中設定要儲存多少資料,以及資料的內容

接下來,我們的目標是把陣列裡的所有資料都輸出到Console視窗上,這裡我們用for來做。

使用for迴圈來輸出陣列裡的資料

這裡的意思是,我們為for宣告了一個變數i,並且用i來記錄當前要取得陣列所儲存的哪個資料。

我們將從陣列的第一個資料開始(i = 0),一直取得陣列的資料到陣列所能儲存的最後一個資料(i < scores.Length)。每次取得一個資料後,我們會將它輸出到Unity上( Debug.Log(scores[i]) ),並在輸出完後,去調整i的值(i++)。

for的語法結構是:

for迴圈的句型

回到Unity後,按下遊玩鍵。

使用for迴圈輸出的結果

可以看到陣列裡的資料被依序輸出出來了。

結語

希望這篇Unity C#教學可以讓你對C#所必須要會的語法有多一些認識,好讓你能更順利地進行遊戲開發。

Colin TPL
Colin TPL

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *