Unity

Unity

官方網站:點擊進入
官方粉絲團:點擊進入

《Unity》 UnityEngine.Events 讓程式更靈活、穩定

【UnityEngine】 【Unity】 【UnityEngine.Events 】
作者:連志偉 時間:2015-10-29
詳見全文:Unity:使用 UnityEngine.Events 讓程式更靈活、穩定
作者:連志偉

自從 Unity 4.6 發佈新的 GUI 系統之後,我們可以從所建立的 GUI Control 發現新的事件欄位,例如,建立一個 Button,可以從 Inspector 視窗裡面的 On Click 欄位指定當按鈕被點擊時要去執行那一個 GameObject 上的哪個 Component 的功能,使得按鈕事件可以更視覺化、更彈性的編輯,當然,其他的 GUI Control 也都有類似的欄位可以做這樣的設置,而這個欄位則是由 UnityEngine.Events 底下的 UnityEvent 型別所產生的,我們自己所製作的 Component 同樣也可以提供這樣的欄位,使可以視覺化編輯,以及讓程式更加彈性。

在此影片使用兩個範例來示範作法,透過畫面操作以及語音的說明,相信可以更加了解到 UnityEngine.Events 在產生 Inspector 欄位的使用方法:



首先,簡單來說明一下 Unity 寫作程式的基礎,就是當我們在 Project 視窗建立我們自己的 Script 之後,將這個 Script 附加到 GameObject 之上,就會成為該 GameObject 的 Component,通常,變數欄位(Field)如果是使用 public 修飾字來宣告,而其型別是可序列化的話,在 Inspector 視窗就會產生可以設定其值的欄位,這是因為 Unity 本身預設會對 public 欄位自動序列化的關係。

public 的變數欄位會出現在 Inspector 視窗,可供編輯。

可是,如果 Class 裡所宣告的欄位並沒有要提供給外部存取的話,使用 public 修飾字就有些不恰當,所以,當使用 private 或 protected 等其他修飾字來宣告時,如果,希望該欄位變數也可以在 Inspector 視窗出現可編輯的欄位,可以在它的上一行插入 SerializeField 的 Attribute(特性),那麼 Unity 就知道這個欄位是要序列化使可以在 Inspector 視窗編輯。

有 SerializeField 的 private 變數欄位也會出現在 Inspector 視窗。

如果,要製作像是 UGUI 的 Button 那樣的事件欄位,最基本的就是要在程式檔最上方加個 using UnityEngine.Events,然後只要是使用 UnityEvent 為型別宣告的欄位,都會有個像是Button 那樣的事件欄位。

UnityEvent 型別的變數欄位,在 Inspector 視窗會出現事件欄位。

 這個 UnityEvent 欄位在編輯器上的編輯相當彈性,當目標 Component 裡面含有使用 public 宣告的屬性(Property)或方法(Method),並且傳入值的型別為 bool、int、float、string 其中一種的話,就能直接在這裡選擇並提供傳入的值,而且可以設置多個不同型別的目標,並在之後程式執行時直接呼叫執行,另外,如果 Method 並沒有宣告傳入參數的話,在此也可以選擇設置,如果是宣告兩個以上的參數,在這邊的選單就不會出現了。

雖然 UnityEvent 欄位相當方便和彈性,不過,它所傳入的值是在編輯器上面設置的,而且只能設置一個值,如果,我們的 Component 中的程式想要直接提供參數值給目標的話,光靠UnityEvent 就沒辦法做到,幸好,UnityEngine.Events 除了 UnityEvent 之外,還另外提供了四個泛型類給我們擴充使用。

我們在影片中的兩個範例可以看到,其中的 PassEvents Script 專門用來撰寫擴充 UnityEvent 泛型類的新事件型別,相關資料可以參考官方文件的 UnityEngine.Events 相關資料,例如UnityEvent。總共有UnityEventUnityEventUnityEventUnityEvent這四個可供擴充,其實,他們所具備的功能都是一樣的,只是,能接受的參數數量不同而已,也就是說,我們可以透過繼承這幾個泛型類來宣告我們自己需求的參數型別的 UnityEvent,而且可容納的參數數量可以有一到四個。例如:

[System.Serializable]
public class PassString : UnityEvent{}

[System.Serializable]
public class PassColor : UnityEvent{}

因為,所宣告的 class 希望用於宣告欄位變數時,可以顯示於 Inspector 視窗,除了使用 SerializeField 標示在欄位上面之外,該型別也必須是可序列化的才行,所以,還要在 class 上方也加上 System.Serializable。

到這裡,我們就能夠使用自己定義的 UnityEvent 來宣告事件欄位,並使它可以顯示於 Inspector 視窗。

再來原作者舉了兩個範例,分別為:Simple ComputerSphere Control
還請各位至原作Blog欣賞圖文並茂的精彩教學。


詳見全文:Unity:使用 UnityEngine.Events 讓程式更靈活、穩定

作者:連志偉

※相關資訊:
Unity:使用 UGUI 的 ScrollRect 製作虛擬搖桿
影片頻道
粉絲專頁
範例下載 http://1drv.ms/1PBcoAU




x