虛幻4編譯相關術語和類圖
虛幻引擎中的藍圖編譯跟常規的程序編譯多少是有一些不同的地方,但是基本原理是相通的。我們以普通的類藍圖為例,一個類中包含多個圖,每個圖中又可以包含一些子圖。一個圖會包含很多的節點(UEdGraphNode),每個節點可以包含若干引腳(UEdGraphPin)用來連接兩個節點。節點又分為執行節點和純節點(Pure node,上面沒有執行引腳)。還有一個模式類(UEdGraphSchema)用於驗證語法是否正確等。類圖如下所示:
圖(UEdGraph)
虛幻4中許多其它的也是使用圖來實現的,所以它也有許多的派生類,比如UAIGraph、UAnimationGraph、UAnimationStateMachineGraph、UMaterialGraph等等。類圖如下所示:
節點(UEdGraphNode)
一個有向無環圖是由無數節點組成的,這個節點就是UEdGraphNode,因為上面提到的圖中有支持各種功能的圖,所以也就有各種各樣的節點,下面我們只摘取一些節點類型,由於我們重點是講解藍圖編譯,所以我們把主要精力放在UK2Node上面,這個節點是所有藍圖節點的基類。類圖所示:
引腳(UEdGraphPin)
每個節點上可以有多個節點,輸入、輸出節點以及參數引腳等等,這些引腳用於記錄跟哪些引腳相連、類型、默認值等。
模式(UEdGraphSchema)
用於語法檢查(看兩個引腳是否可以相連、嘗試連接引腳)等功能,如上面所有因為有多種圖所以就需要多種模式。藍圖使用的是UEdGraphSchema_K2,動畫以及UMG會有自己的Schema。類圖如下所示:
FKismetCompilerContext
真正執行編譯工作的類,每編譯一次就會生成一個新的實例,用來存儲編譯類的引用以及藍圖等。整個編譯過程又分為好多步,是在Compile()函數里面做的。
FKismetFunctionContext
持有編譯一個函數的所有信息,包括指向相關圖(UEdGraph)的引用、屬性以及生成的函數等。
FBlueprintCompiledStatement
編譯過程中的單位工作。編譯把節點翻譯成一系列編譯的語句,然后編譯器后端會把它編譯成字節碼。例如變量賦值、goto、調用(call)等。
FBPTerminal
圖中的一個終結點(字面量、常量、或者變量引用)。每一個數據引腳都跟其中的一個相關聯。你可以自己在NodeHandlingFunctor里面來生成自己的項,用來存儲變量、中間結果等。
FNodeHandlingFunctor
用來處理一類節點編譯的幫助類,包含用於注冊引腳連接的函數(RegisterNets()),以及生成編譯語句(FBlueprintCompiledStatement)。通過UK2Node::CreateNodeHandler()函數來創建。如下類圖只列舉了幾個HandlerFunctor。
FBlueprintCompileReinstancer
在編譯基本完成的時候,由於類可能已經改變了大小或者有新的屬性被添加或刪除了,那么編譯器需要重新實例化我們剛剛編譯類生成的對象實例,生成一個新的,然后使用CopyPropertiesForUnrelatedObjects()函數來把舊的實例中的數據拷貝到新的實例中去。
FKismetCompilerOptions
編譯選項,用於指定編譯時的設置,包括編譯類型(只編譯Skeleton, 全部編譯、只生成字節碼、只生成cpp)等。
Skeleton Class
Skeleton類如其名字定義是一個骨架類,在添加成員變量或者成員函數時都會重新重新(它里面沒有代碼和自動生成的隱藏變量)