虛幻學習筆記10—C++函數與藍圖的通信

一、前言

? ? ? ? 除了上一章C++變量與藍圖通信講的變量能與藍圖通信外,還有函數和枚舉也可以和藍圖通信。函數的關鍵字為”UFUNCTION“、枚舉的關鍵字為”UENUM“。

二、實現

2.1、BlueprintCallable藍圖中調用

??該函數時帶執行的,帶入如下。編譯成功后在藍圖中輸入后可以找到,并點擊使用如圖2.1.1所示

	/// <summary>/// 暴露該函數可在藍圖中調用/// </summary>UFUNCTION(BlueprintCallable, Category = "MyFunction")void BlueprintCallable1();
圖2.1.1

2.2、BlueprintPure藍圖中的純函數

? ? ? ? 代碼如下,其在藍圖中的形式如圖2.2.1所示,它是一個純函數和圖2.1.1不同的是它沒有左右

	/// <summary>/// 可在藍圖中調用的純函數的定義/// </summary>UFUNCTION(BlueprintPure, Category = "MyFunction")bool BlueprintPure2();
圖2.2.1

兩邊的執行引腳。

2.3、BlueprintImplementableEvent

????????在C++中聲明藍圖中實現,在藍圖中可重載,可以有參數和返回值,無返回值的是事件,有返回值的是函數。

1、沒有返回值和參數

? ? ? ? 定義的代碼如下所示,

	UFUNCTION(BlueprintImplementableEvent)void ImplementableEvent1();

然后在藍圖中它會作為事件添加到藍圖中使用,如圖2.3.1所示:

圖2.3.1

該事件可以在C++代碼中調用

void AMyPawn1::BeginPlay()
{Super::BeginPlay();ImplementableEvent1();
}

2、只有返回值

只有返回值的在藍圖中會作為函數,如圖2.3.2所示,同時這個函數可以在藍圖中被重寫

	UFUNCTION(BlueprintImplementableEvent)int32 ImplementableEvent2();
圖2.3.2

但是在藍圖還無法調用它,需要添加”Blueprint Callable“關鍵字,如下代碼,注意兩個關鍵字的順

圖2.3.3
	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)int32 ImplementableEvent2();

序,如果把Blueprint Callable“關鍵字放在后面編譯不通過。增加關鍵字后的藍圖中可以調用,如圖2.3.4所示:

圖2.3.4

3、只有參數

代碼如下所示,添加一個帶參數的,這個效果和圖2.3.1中的類似,不同之處是這里會帶參數,如圖2.3.4所示:

	UFUNCTION(BlueprintImplementableEvent)void ImplementableEvent3(const FString& myStr);
圖2.3.4

4、參數和返回值都有

代碼如下所示,其效果和圖2.3.2所示類似,區別之處在于此處是帶輸入參數的。

	UFUNCTION(BlueprintImplementableEvent)int32 ImplementableEvent4(const FString& myStr);

2.4、BlueprintNativeEvent

? ? ? ??在C++中聲明和實現,藍圖可重載,函數實現的后面要加Implementation,否則會編譯出錯,但是在調用的時候還是用聲明時的名字。無返回值的是事件,有返回值的是函數。代碼如下

	UFUNCTION(BlueprintNativeEvent)void BlueprintNativeEvent1();UFUNCTION(BlueprintNativeEvent)int32 BlueprintNativeEvent2();UFUNCTION(BlueprintNativeEvent)void BlueprintNativeEvent3(const FString& myStr);UFUNCTION(BlueprintNativeEvent)int32 BlueprintNativeEvent4(const FString& myStr);

實現的代碼如下,又返回值的必須返回一個值。

void AMyPawn1::BlueprintNativeEvent1_Implementation()
{GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("這是一個C++代碼寫的BlueprintNativeEvent事件"));
}int32 AMyPawn1::BlueprintNativeEvent2_Implementation()
{return 0;
}void AMyPawn1::BlueprintNativeEvent3_Implementation(const FString& myStr)
{}int32 AMyPawn1::BlueprintNativeEvent4_Implementation(const FString& myStr)
{return 0;
}

2.5、Meta元素說明符

該函數定義如下,而且必須實現,通過meta關鍵字實現其在藍圖中的名稱改為“MyPrintTest”

	//元數據說明符,也即別名,在藍圖中會顯示DisplayName定義的名字UFUNCTION(BlueprintCallable, Category = "MyFunction", meta = (DisplayName = "MyPrintTest"))void PrintMeta();

2.6、枚舉

首先定義一個宏,代碼如下,生成枚舉的反射數據,通過反射將枚舉暴露給藍圖,實現C++和藍圖的通信,BlueprintType的作用是可以在藍圖創建變量的時候也可以作為選項。如圖2.6.1所示

UENUM(BlueprintType)//生成枚舉的反射數據,通過反射將枚舉暴露給藍圖,實現C++和藍圖的通信,BlueprintType的作用是可以在藍圖創建變量的時候也可以作為選項
namespace MyEnumType
{enum MyCustomEnum{Type1,Type2,Type3,};
}
圖2.6.1

在藍圖中創建一個新的變量,變量的類型中可以選中C++代碼中創建的這個枚舉。同時,在藍圖中也可以調用該枚舉,如圖2.6.2所示:

圖2.6.2
通過以下代碼可以實現在各類面板和藍圖中使用該變量
	//枚舉UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyEnum")TEnumAsByte<MyEnumType::MyCustomEnum> MyCustomEnum;

同時也可以在藍圖中調用和編輯該變量,如圖2.6.3所示

圖2.6.3

通常一個定義里只能有一個枚舉,如下代碼中會編譯不通過,在MyEnumType中只能定義一個。

UENUM(BlueprintType)
namespace MyEnumType
{enum MyCustomEnum{Type1,Type2,Type3,};enum MyEnum2{One, Two, Three,};
}

三、總結

3.1、BlueprintImplementableEvent的函數在C++代碼中只需要聲明不需要實現。

3.2、BlueprintNativeEvent的函數在C++代碼中聲明了還必須實現,不實現會編譯報錯。實現中的函數名稱后總有加上”_Implementation“,但是在調用的時候又要去掉”_Implementation“,這樣才能在藍圖中被調用,使用帶后綴”_Implementation“的只會在C++中調用,而藍圖中不會被調用。

3.3、”Blueprint Callable“關鍵字通常是放在前面的,如果放在后面可能會編譯不通過。

3.4、BlueprintType的作用是可以在藍圖創建變量的時候也可以作為選項。

3.5、枚舉的定義中只能定義一個枚舉,多個會編譯不通過。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207045.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

macOS 獲取文件夾大小

macOS 獲取文件夾大小 獲取文件夾大小的擴展如下&#xff1a; extension URL {var fileSize: Int? { // in bytesdo {let val try self.resourceValues(forKeys: [.totalFileAllocatedSizeKey, .fileAllocatedSizeKey])return val.totalFileAllocatedSize ?? val.fileAll…

來自Sui的溫馨建議:保護您的Web3私鑰

當您安裝一個錢包并創建Sui賬戶時&#xff0c;錢包包含一個公鑰和一個私鑰。保護好私鑰的安全非常重要&#xff0c;從而可以保護您的Sui資產&#xff0c;包括錢包中的任何tokens。 公鑰加密技術是幾十年前開發的&#xff0c;是當今互聯網上大多數安全交易的基礎&#xff0c;包…

Navicat Premium 16 for Mac/Windows:高效的數據庫開發工具

Navicat Premium 16是一款功能強大的數據庫開發工具&#xff0c;為開發人員提供了全面的工具和功能&#xff0c;幫助他們更高效地進行數據庫開發和管理。不論是初學者還是專業開發人員&#xff0c;Navicat Premium 16都能滿足他們的需求&#xff0c;并提供直觀、易用的界面。 …

【深度學習】AlexNet網絡實現貓狗分類

【深度學習】AlexNet網絡實現貓狗分類 AlexNet簡介 AlexNet是一種卷積神經網絡&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;模型&#xff0c;它在2012年的ImageNet圖像分類挑戰賽中取得了重大突破&#xff0c;引發了深度學習在計算機視覺領域的熱潮…

為“異常”努力是值得的

異常是OO語言處理錯誤的方式,在C中&#xff0c;鼓勵使用異常。侯捷再書中談起異常&#xff0c;“十年前撰寫“未將異常考慮在內的”函數是為一種美好實踐&#xff0c;而今我們致力于寫出“異常安全碼”。”可見異常安全的重要。 說起異常安全&#xff0c;首先就要是異常的出現…

Leetcode—213.打家劫舍II【中等】

2023每日刷題&#xff08;五十二&#xff09; Leetcode—213.打家劫舍II 算法思路 實現代碼 class Solution { public:// 左閉右開int rob1(vector<int>& nums, int start, int end) {int n nums.size();int f0 0, f1 0, new_f 0;for(int i start; i < end…

pytorch學習入門之 Variable(變量)

Variable(變量) autograd.Variable 是包的核心類. 它包裝了張量, 并且支持幾乎所有的操作. 一旦你完成了你的計算, 你就可以調用 .backward() 方法, 然后所有的梯度計算會自動進行. 你還可以通過 .data 屬性來訪問原始的張量, 而關于該 variable(變量)的梯度會被累計到 .…

初識 OpenCV

初識 OpenCV 簡介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個涵蓋了數百種計算機視覺算法的開源算法庫。 OpenCV 具有模塊化結構&#xff0c;這意味著該軟件包包含多個共享或靜態庫。其中包含以下模塊&#xff1a; Core functionality (core…

機器學習硬件十年:性能變遷與趨勢

本文分析了機器學習硬件性能的最新趨勢&#xff0c;重點關注不同GPU和加速器的計算性能、內存、互連帶寬、性價比和能效等指標。這篇分析旨在提供關于ML硬件能力及其瓶頸的全面視圖。本文作者來自調研機構Epoch&#xff0c;致力于研究AI發展軌跡與治理的關鍵問題和趨勢。 &…

【送書活動四期】被GitHub 要求強制開啟 2FA 雙重身份驗證,我該怎么辦?

記得是因為fork了OpenZeppelin/openzeppelin-contracts的項目&#xff0c;之后就被GitHub 要求強制開啟 2FA 雙重身份驗證了&#xff0c;一拖再拖&#xff0c;再過幾天帳戶操作將受到限制了&#xff0c;只能去搞一下了 目錄 2FA是什么為什么要開啟 2FA 驗證GitHub 欲在整個平臺…

消息隊列 - RabbitMQ

消息隊列 - RabbitMQ 1. 初識 MQ1.1 同步調用1.2 異步調用1.3.技術選型 2. RabbitMQ2.1 安裝2.2 收發信息2.2.1 交換機(Exchange)2.2.2 隊列2.2.3 綁定關系2.2.4 發送消息 2.3 數據隔離 1. 初識 MQ 微服務一旦拆分&#xff0c;必然涉及到服務之間的相互調用&#xff0c;之前講…

MySQL六 | 存儲引擎

目錄 存儲引擎 存儲引擎特點 存儲引擎選擇 Innodb與MyISAM區別 存儲引擎 默認存儲引擎:InnoDB show engines;#展示當前數據庫支持的存儲引擎 存儲引擎特點 特點InnoDBMyISAMMemory存儲限制64TB有有事務安全支持--鎖機制行鎖表鎖表鎖Btree鎖支持支持 支持 Hash索引--支…

編譯 Android gradle-4.6-all.zip 報錯問題記錄

編譯 Android gradle-4.6-all.zip 報錯問題記錄 方法一&#xff1a;替換資源&#xff1a;方法二&#xff1a;修改源方法三&#xff1a;修改版本 編譯時候無法下載 gradle-4.6-all Downloading https://services.gradle.org/distributions/gradle-4.6-all.zip 方法一&#xf…

《一念關山》熱度破萬,愛奇藝古裝賽道出盡風頭

?劉詩詩重回古裝劇、新式武俠公路片、質感細膩的鏡頭美學......看點滿滿的《一念關山》頻頻登上熱搜&#xff0c;俘獲了大批觀眾的心。 開播首日熱度就刷新了愛奇藝2023年站內紀錄&#xff0c;《一念關山》作為2023年愛奇藝在古裝賽道的收官之作&#xff0c;口碑和熱度兼收。…

Linux內核-標準IO和系統IO的區別

概念 標準IO&#xff1a;指的是C語言實現的文件操作的函數 系統IO&#xff08;文件IO&#xff09;&#xff1a;指的是linux或windows或unix&#xff0c;實現文件操作的函數。 為什么要有兩種IO C語言要實現跨平臺&#xff0c;所以C語言在不同操作系統中實現文件操作方式是不一…

一文詳解Java反射

文章目錄 反射是什么&#xff1f;反射的作用所有方法匯總一、加載Class對象二、加載類的構造器對象三、加載類的成員變量四、加載類的成員方法 反射是什么&#xff1f; 反射就是&#xff1a;加載類&#xff0c;并允許以編程的方式解剖類中的某個成分&#xff08;成員變量&#…

實戰:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服務協同部署(包含解決瀏覽器訪問Linux部署服務器本地資源問題)

1. 背景 在該實戰中&#xff0c;我們將探討如何使用Docker Compose協同部署Nginx、Java、Mysql和Redis服務&#xff0c;實現一個視頻上傳與展示的應用。具體需求如下&#xff1a; Java應用負責上傳視頻和圖片資源到Nginx目錄下&#xff0c;作為資源服務器。Nginx服務作為靜態…

Numpy數組常用屬性匯總(第5講)

Numpy數組常用屬性匯總 (第5講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ????????????????????????????????????????????????????????????????????????????????????…

【JavaEE進階】 Spring使用注解存儲對象

文章目錄 &#x1f334;序言&#x1f340;前置?作&#xff1a;配置掃描路徑&#x1f384;添加注解存儲 Bean 對象&#x1f333;類注解&#x1f6a9;為什么要這么多類注解&#x1f6a9;注解之間的聯系 &#x1f38b;?法注解 Bean&#x1f6a9;?法注解需要配合類注解使? ?總…

探索AIGC未來:CPU源碼優化、多GPU編程與中國算力瓶頸與發展

★人工智能&#xff1b;大數據技術;AIGC;Turbo;DALLE 3;多模態大模型&#xff1b;MLLM&#xff1b;LLM&#xff1b;Agent&#xff1b;Llama2&#xff1b;國產GPU芯片&#xff1b;GPU;CPU&#xff1b;高性能計算機&#xff1b;邊緣計算&#xff1b;大模型顯存占用&#xff1b;5G…