UE4-藍圖與C++類 互相調用函數


  • 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

Create_BP

  • 在彈出的窗口中最下方,點擊 All Class, 在搜索框中輸入 MyActor_First ,然后選中我們自己創建的 MyActor_First 類,並且點擊 Select 按鈕,創建成功后,重命名為 BP_First

Create_BP2

2 創建C++函數藍圖調用

  • 創建C++函數,並且公開給藍圖
// 頭文件中聲明函數
UFUNCTION(BlueprintCallable, Category = "BPFunc_Lib")
    void CppPrint();
/*
	和公開屬性類似,使用宏 UFUNCTION 即可。UFUNCTION() 負責將C++函數公開給反射系統。**BlueprintCallable ** 選項將其公開給藍圖虛擬機。每一個公開給藍圖的函數都需要一個與之關聯的類別(Category),這樣右鍵點擊快捷菜單的功能才能正確生效。
	雙擊我們的 MyActor_First  藍圖類,打開藍圖編輯器。在空白處單擊右鍵,在彈出的列表中即可找到我們公開給藍圖的C++函數。如下圖:BPCallable_CFunc
*/

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_BPPrintFunc

  • 補充Event BPPrint功能,點擊編譯。如下圖:

Event_BPPrintFunc2

  • 在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM