2. Working with Types 使用類型
FlowCanvas的目標是能夠使用任何類型,你可能需要從任何程序集,這基本上意味着如果你需要的自定義類型也支持。 為了保持編輯器的清潔,而不是雜亂的數以千計的類型,但存在一個簡單的編輯器窗口,您可以在其中定義您要在項目中使用哪些類型。 默認情況下,為您添加了一些常見類型,但您可以根據需要隨意添加,刪除和修改列表。
要打開首選類型編輯器,請轉到“工具/ ParadoxNotion / FlowCanvas /首選類型編輯器”。
此編輯器中列出的類型將負責許多事情。
- 可用的黑板變量類型供您添加。
- 自動生成的反射節點。
- 所有通用的中心節點和菜單,以(T)結尾。
這是一個非常重要的編輯器窗口!
2.1. Generic Type Nodes 通用類型節點
當您要通過“添加節點”上下文菜單或類似菜單選擇要添加的節點時,有許多帶有(T)后綴的節點。 這些節點是通用節點。 這意味着他們可以與任何你想要的相關類型。 這樣的節點,將顯示為類別,在其下將列出幾種可用的類型。
因此,你不會找到像GetTransform或GetAnimator的節點。 相反,您將遇到像GetComponent(T)這樣的節點,這將足以獲得您所需要的任何組件類型。
現在,關於這些節點的最重要的事情是,將被列為可用的類型直接影響首選類型編輯器和其中列出的類型。 因此,如果默認類型不夠,則非常重要的是為您的項目定制“首選類型”列表。
2.2. Connecting Assignable Types 連接可分配類型
如前所述,“值端口只能連接到相同或可分配類型的其他值端口”。
這基本上意味着,你能夠連接某些值類型端口在一起,即使他們不是完全相同的類型,如果他們可以被轉換或投射到那種類型。 這是自動處理,為您節省了大量的時間。 在實踐中,如果編輯器允許你連接2個端口在一起,這意味着它的可能,你沒有什么更多的擔心。 當進行這樣的轉換時,連接將顯示指示事實的圖標。 在下面的示例中,float已連接到布爾值。 因此,此轉換將導致false,因為值為0(如果值為1+,則為true)。
為方便起見,以下是FlowCanvas支持的轉換及其完成方式。
From
|
To
|
Through
|
---|---|---|
Any Primitive | Any Primitive | .ConvertTo() |
GameObject | Any Component | .GetComponent |
GameObject | Transform | .transform |
Any Component | GameObject | .gameObject |
GameObject | Vector3 | .transform.position |
AnyComponent | Vector3 | .transform.position |
A Child Type | Base Type | upcasting |
A Base Type | Child Type | downcasting |
Anything | String | .ToString() |
3. Node Categories 節點類別
FlowCanvas中的所有可用節點實際上可以分為四種分開的類型,即...
- 事件
- 流量控制器
- 操作
- 功能
3.1. Events 事件
事件節點負責開始和觸發任何流執行。 沒有事件節點沒有什么會真正發生在您的流程圖。 添加事件節點以響應世界或對象事件以及輸入,觸發器,碰撞等變化,並最終將其流輸出連接到其他節點,以指定在事件觸發時將發生什么。
一些事件節點需要一個對象引用,事件將發生在該對象引用上。 默認情況下,目標對象將是“Self”,它對應於FlowScriptController組件附加到的游戲對象。 您可以通過檢查器通過分配新的引用或鏈接一個黑板變量來自由改變目標對象。
所有事件節點都有一個紅色標題名稱,在Flow和Value端口的混合中沒有輸入和任何數量的輸出。 事件節點的值端口通常包含有關剛剛觸發的事件的信息。
3.2. Flow Controllers 流量控制器
流控制器節點負責操縱流執行,例如以多種不同的方式分支流,過濾流,或甚至合並流。 它們是在流程腳本中創建邏輯的方法,並且對應於各種腳本命令,如if-then-else,while,for-each等。
流量控制器具有藍色標題顏色,並且始終具有至少1個流量輸入和1個流量輸出端口。
3.3. Actions 操作
動作節點負責“使事情發生”,如移動對象,設置值,銷毀對象,應用物理力等。動作節點等同於腳本語言中的方法。 99%的時間,Action節點沒有Value輸出,但是有多個不同的Value輸入用於設置操作的參數。
動作節點,總有1個Flow輸入,這簡單地指“執行”動作!
3.4. Functions 功能
函數節點等同於腳本語言中的函數。 與Action節點相比的主要區別是,它們總是返回一個值輸出端口形式的值。 函數節點負責處理數據,獲取數據的數學操作,以及將這些數據饋送到其他節點。
默認情況下,函數節點不需要流執行工作,因此它們沒有流輸入或輸出端口! 您只需將Value輸出連接到您希望的某個其他節點即可。 盡管如此,在一些罕見的情況下,您希望通過顯式地將Flow連接到節點來控制節點何時被調用。 在這種情況下,您可以通過勾選節點檢查器上相應的切換來使節點“可調用”。
完成后,節點將被轉換為可調用函數,如下所示,其中將出現1個流量輸入和1個流量輸出。 因此,僅當您顯式調用帶有Flow信號的節點時,才會設置節點的Value輸出。
3.5. Constructors & Extractors 構造函數和提取器
雖然技術上構造函數和提取器節點是函數節點,但它們是值得一提的。 這兩個都可以在“實用程序”類別下找到。
分解器很容易理解。 簡單地說,他們構造一個新的對象(大多是一個結構體),它的幾個組件。 因此,不是有一個固定的Vector3變量,你可以從它的三個組件x,y和z構造一個。
另一方面,提取器是完全相反的。 它們接受一個對象(同樣主要是一個結構體),並暴露他們的組件供您使用。
4. Variables 變量
變量是任何程序,腳本或可視腳本的一個非常重要的方面。 FlowCanvas具有對所有和任何類型的變量的開箱即用的優越支持,以及一些重要的功能,如屬性綁定或通過UNET的網絡同步!
4.1. Blackboard Variables 黑板變量
Blackboard是一個組件,它在您附加了任何FlowScriptController組件的同一游戲對象上自動添加,是創建,存儲和檢索要在該游戲對象的任何流程腳本中使用的變量的主要位置。 黑板檢查器也顯示在右上角的流程腳本編輯器中。
要創建一個黑板變量,你只需要點擊“添加變量”按鈕,如上所示。 包含所有可用類型的上下文菜單將顯示為您添加變量。 請記住,所有類型都受支持,只要將它們添加到首選類型列表中,如前所述!
一旦你創建了一個黑板變量,你可以使用它在游戲對象的任何流程圖中獲得它的值或根據需要設置它的值。
4.2. Using Variables in FlowScript 在流程控制腳本中使用變量
使用黑板變量
要使用創建的Blackboard變量,獲取或設置它的值,可以通過“添加節點”上下文菜單,在“變量”類別下,通過“獲取黑板變量”或“設置黑板變量”子 類別,選擇要獲取或設置的變量名稱。
獲取值
選擇獲得一個黑板變量,將創建一個變量節點,鏈接到該黑板變量。 “$”標記總是在名稱之前使用,以指示它是一個鏈接的黑板變量名稱。 在本例中為“$ myInteger”。 節點的單值輸出端口將返回該鏈接變量的值。
設置值
另一方面,選擇設置黑板變量將創建一個不同類型的節點,如下所示。 動作節點。 因此,該值只有在使用Flow信號調用節點時才會設置,並且默認情況下將設置為等於連接的值輸入參數。
在上述節點的節點檢查器中,還可以指定在設置變量時要使用的操作。 不是簡單地將變量設置為等於value參數,而是可以選擇添加,減去,乘法或除以value參數。
使用常量變量節點
你不總是需要使用黑板變量。 在某些情況下,你可能只需要一個常量變量在某個地方和別的地方使用。 在這些情況下,最好只是創建一個GraphVariable節點,如下所示,並直接通過節點檢查器設置它的值。
后來,如果你改變主意,並想將此節點鏈接到一個黑板變量,你可以通過點擊單選按鈕,通過檢查器這樣做!
4.3. Property Binding 屬性綁定
將變量綁定到屬性是加快工作流程的好方法。 在實踐中,綁定到屬性的變量意味着變量表示該屬性,並作為它的“橋梁”。 因此,無論何時獲取變量值,您都將獲得綁定的屬性值,而當您設置變量值時,您將改為設置綁定的屬性值。
黑板變量可以綁定到黑板組件所附着的同一游戲對象上的任何組件的任何屬性。 要將變量綁定到屬性,您只需單擊變量選項按鈕,然后選擇要綁定它的屬性!
或者,如果您還沒有已創建的變量,則可以通過“添加變量”按鈕菜單直接創建綁定變量。
4.4. Network Sync 網絡同步
Blackboard變量可以使用新的Unity 5系統,UNET輕松地在網絡上同步。 所有你需要做的是,將SyncBlackboard組件添加到同一個游戲對象,其中有你想要同步變量的黑板。
一旦完成,黑板的所有由UNET系統支持並且未被標記為受保護的變量將在網絡上同步。 根本不需要額外的步驟。 如果要忽略特定變量被同步,您必須將其標記為protected。 這可以簡單地通過變量選項按鈕來完成。 保護變量也以透明形式顯示為提醒。 在以下示例中,“isRunning”和“myFloat”標記為受保護。