Unreal Blueprint Interface藍圖接口詳解
一、接口、普通類、抽象類
對比往往是快速理解一個概念最好的方法,本人之前先學的C#,后有學了Unity,用unity做了四年左右的建筑方面數(shù)字孿生的項目;所以在學Unreal的時候?qū)WC++的時候,我總會和Unity以及C#做對比,這樣學起來效率會更高。
讓我們先了解一下C++或者C#等編程語言中的接口的定義:
在C++中接口的定義是:接口描述了類的行為和功能,而不需要完成類的特定實現(xiàn)。
C++ 接口是使用抽象類來實現(xiàn)的,抽象類與數(shù)據(jù)抽象互不混淆,數(shù)據(jù)抽象是一個把實現(xiàn)細節(jié)與相關(guān)的數(shù)據(jù)分離開的概念。如果類中至少有一個函數(shù)被聲明為純虛函數(shù),則這個類就是抽象類。
設(shè)計抽象類(通常稱為 ABC)的目的,是為了給其他類提供一個可以繼承的適當?shù)幕?。抽象類不能被用于實例化對象,它只能作為接口使用。如果試圖實例化一個抽象類的對象,會導致編譯錯誤。
因此,如果一個 ABC 的子類需要被實例化,則必須實現(xiàn)每個虛函數(shù),這也意味著 C++ 支持使用 ABC 聲明接口。如果沒有在派生類中重寫純虛函數(shù),就嘗試實例化該類的對象,會導致編譯錯誤。
可用于實例化對象的類被稱為具體類。
(以上是取自菜鳥教程)https://www.runoob.com/cplusplus/cpp-interfaces.html
這里對比一下C#還是有些不同的,C++中你可以理解為接口就是抽象類,因為C++中并沒有interface關(guān)鍵字,所以C++的接口是通過抽象類來實現(xiàn)的,所以C++中的接口應(yīng)該理解為抽象類:
1.不能實例化;2.繼承該接口的類必須實現(xiàn)該接口的所有虛函數(shù);3.可以包含屬性。
在Java和C#中有所不同,它們有interface關(guān)鍵字;所以抽象類和接口是有區(qū)別的:抽象類中可以定義屬性、方法的實現(xiàn),而接口中不能定義屬性,方法也不能包含代碼實現(xiàn);共同點就是子類繼承它們時,必須實現(xiàn)它們中的所有抽象方法或者接口中聲明的方法,它們只能被繼承來實現(xiàn)具體功能。
抽象類和接口與普通類相比,普通類的繼承也可以由子類重寫父類的方法,但是這種重寫不是必須的,這好處就是更靈活,壞處就是有可能忘記重寫,造成類的誤用。
二、Unreal藍圖中的Blueprint Interface
如果你看明白編程語言中的接口的定義和用途,那么這就是藍圖中Blueprint Interface的定義和作用,因為藍圖中的就是通過編程語言來實現(xiàn)的。
1)先定義一個Blueprint Interface藍圖類


從藍圖接口的可視化面板中可以看出,可以添加方法,這些就是代碼中的虛方法;而且藍圖接口中這些虛方法是無法寫具體的實現(xiàn)的,圖中可以看出是灰色的,這和代碼中的接口是一致的。
2)實現(xiàn)藍圖接口
先把接口添加到普通藍圖中,這個添加類似于繼承,我測試過即使不在EventGraph中使用OnInteract編譯也不會報錯,所以我認為添加接口到藍圖中時,應(yīng)該就重寫了改虛方法,只不過是沒有具體的實現(xiàn)內(nèi)容,具體內(nèi)容還是要在EventGraph中寫,所以才能通過編譯。


3)調(diào)用藍圖接口中的方法

上面是右鍵鼠標點擊事件觸發(fā),當點擊到物體時,執(zhí)行該物體繼承自接口并重寫了的OnInteract方法。
猜想:這個藍圖接口的方法在所有藍圖中可以直接訪問,其他自定義的事件也是可以的。EventGraph中編寫邏輯時,例如調(diào)用某個事件或者某個方法,肯定是在調(diào)用之前先找到了這個類型實例的引用,上圖中可以看出,Hit Actor返回的就是相應(yīng)的引用,如果擊中的物體沒有該OnInteract方法,自然也就不會執(zhí)行。
三、補充
藍圖接口與C++的接口還有一個不同點,在C++中接口都可以重寫,無論是有無參數(shù)或者返回值;但是在藍圖接口中就不同了,藍圖接口中如果沒有傳入?yún)?shù)即Inputs,也沒有返回值即Outputs,那么該接口可以是一個事件,當然也可以是一個函數(shù),其內(nèi)部無法添加功能;也無法直接拖入到EventGraph,只能右鍵搜索。如下圖所示的OnInteract接口。

當接口有輸入?yún)?shù)Inputs時,那么接口同上,該接口可以是一個事件,當然也可以是一個函數(shù),其內(nèi)部無法添加功能;也無法直接拖入到EventGraph,只能右鍵搜索;雙擊會進入相應(yīng)的接口視圖,如下圖所示。

當接口有輸出參數(shù)的時候,情況就和C++的接口比較類似了,可以直接拖入到EventGraph,也可以雙擊編輯添加新的功能,但是此時就無法作為事件使用了。如下圖所示。


總結(jié)來說就是有輸出參數(shù)時,藍圖接口就是一個函數(shù),可以添加新的功能;如果沒有輸出參數(shù),那么藍圖接口就是一個執(zhí)行事件或者一個函數(shù),但都無法編輯。
這是我目前的理解,如果有錯請大佬糾正,感謝。