- UE4-藍圖與C++類 互相調用函數
- Time: 2020年10月15日10:13:15
- Author: Yblackd
@
1. 准備工作
1.1 基於C++創建的Actor類 創建藍圖類
根據 MyActor_First 類創建新的 藍圖類->BP_First。
- 在 內容瀏覽器 視圖中,點擊 Add New 按鈕 或者單擊 右鍵 ,然后選擇 Blueprint Class。如下圖Create_BP
- 在彈出的窗口中最下方,點擊 All Class, 在搜索框中輸入 MyActor_First ,然后選中我們自己創建的 MyActor_First 類,並且點擊 Select 按鈕,創建成功后,重命名為 BP_First
2 創建C++函數藍圖調用
- 創建C++函數,並且公開給藍圖
// 頭文件中聲明函數
UFUNCTION(BlueprintCallable, Category = "BPFunc_Lib")
void CppPrint();
/*
和公開屬性類似,使用宏 UFUNCTION 即可。UFUNCTION() 負責將C++函數公開給反射系統。**BlueprintCallable ** 選項將其公開給藍圖虛擬機。每一個公開給藍圖的函數都需要一個與之關聯的類別(Category),這樣右鍵點擊快捷菜單的功能才能正確生效。
雙擊我們的 MyActor_First 藍圖類,打開藍圖編輯器。在空白處單擊右鍵,在彈出的列表中即可找到我們公開給藍圖的C++函數。如下圖:BPCallable_CFunc
*/
- 在cpp文件中實現 CppPrint() 函數代碼如下,保存並且編譯。
// cpp文件中定義函數
void MyActor_First::CppPrint()
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("Test BP Callable C++ Func!")));
}
- 將 BP_First 拖拽到關卡編輯器中,點擊 Compile編譯和PlayPlay運行, 注意游戲窗口的左上角,有紅色的 Test BP Callable C++ Func! 字樣。
3. 創建藍圖函數C++調用
- 在頭文件中聲明函數,使用說明符 BlueprintImplementableEvent(藍圖可執行事件) 即可,該函數不需要在C++類中實現。
- 對比BlueprintPure修飾符:BlueprintImplementableEvent在藍圖中被當做事件調用,BlueprintPure被當做函數調用。
UFUNCTION(BlueprintImplementableEvent, Category = "BP_Funclib")
void BPPrint();
- 在藍圖編輯器中打開 BP_First ,在空白處點擊右鍵,搜索 BPPrint,選擇 Event BPPrint,如下圖:
- 補充Event BPPrint功能,點擊編譯。如下圖:
-
在C++調用BPPrint函數
在C++中CppPrint函數中調用BPPrint函數,運行結果: 先輸出紅色Test BP Callable C++ Func!, 在輸出藍色Hello World
void AMyActor_First::CppPrint() { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("Test BP Callable C++ Func!"))); BPPrint(); }
-
這種函數的調用方法與任何其他的C++函數沒有區別。虛幻引擎會在其內部自動生成C++函數的基本實現,該實現了解如何調用藍圖VM。這通常稱為形實替換。如果對應的藍圖沒有實現該函數,則函數行為就像C++空函數體一樣,不執行任何操作。如果想要提供C++函數的默認實現,同時仍允許藍圖覆蓋此函數,則需要另一個說明符 BlueprintNativeEvent。該說明符仍會自動生成C++函數的基本實現,但是同時還會生成一個新的函數聲明,類似於<函數名>_Implementation()。必須實現該函數,否則項目無法建立聯接。聲明與實現如下:
UFUNCTION(BlueprintNativeEvent, Category = "BPFunc_Lib")
void BPPrint1();
void AMyFirstActor::BPPrint1_Implementation()
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("C++ Default Print")));
}
4. 參考
參考鏈接:https://blog.csdn.net/u011476173/article/details/97927230