六、藍圖訪問C++函數/事件(UFUNCTION)
一.藍圖中的函數/事件
1.函數
①帶有輸入輸出引腳的普通函數



②Pure函數(無輸入輸出引腳)


2.事件

二.C++創(chuàng)建 藍圖可訪問的函數/事件
C++將函數公開給藍圖訪問的方式與公開變量的原理是一樣的,公開變量使用的是UPROPERTY宏,公開函數也需要一個宏,名為UFUNCTION宏.該宏同樣結合大量的說明符來使函數在藍圖中具有不同的功能,特性等?
為了方便測試還是沿用的Cpp_Actor的C++類
①BlueprintCallable(藍圖可調用)?
BlueprintCallable 藍圖可調用,C++函數可以在藍圖中被調用
這是以個有輸入輸出引腳的函數(一個返回值的函數)

多個返回值的函數

②BlueprintPure(藍圖純函數) ,純函數必須有返回值?。。?/span>
這是一個有多個返回值的純函數(沒輸入輸出引腳的)



首先理解藍圖中Beginplayer函數:



解析:
由上圖可知,藍圖中的Beginplay事件其實就是C++中的ReceiveBeginPlay函數.該函數的UFUNCTION宏中有一個名為BlueprintImplementableEvent的說明符,該說明符字面意思為:"藍圖可實現事件":
即C++中聲明與調用函數(不需要在cpp中定義函數),藍圖中定義函數.下面進行測試

③BlueprintImplementableEvent(藍圖可實現事件)
C++中聲明且調用函數(不定義函數),藍圖中定義函數(Functions中進行override),紅色無流入引腳的形式存在

a.函數無形參
.h文件
.cpp文件

b.函數有形參



c.上述ab函數都是無返回值的情況,下面這個是有返回值的情況
.h文件
.cpp文件

有無返回值的區(qū)別:無返回值以事件形式存在,有返回值以函數形式存在
③BlueprintNativeEvent(藍圖原生事件)?
a.C++中聲明函數,C++和藍圖中都可以定義函數(C++必須實現),如果藍圖不定義,會執(zhí)行C++中的定義,如果藍圖和C++都定義,藍圖則會覆蓋C++定義,只執(zhí)行藍圖定義.
(2)C++函數聲明,需要額外聲明一個名為:函數名+_Implementation的返回值和參數列表都一致的函數.
(3)BlueprintNativeEvent需要配合BlueprintCallable一起使用,否則藍圖中不可調用
(4)與BlueprintImplementableEvent 一樣,有返回值的在藍圖以函數形式存在,無返回值的在藍圖中以事件形式存在.?
a.無返回值
.h文件
.cpp文件
(1)藍圖中不定義函數

(2)藍圖中定義函數




備注:解決這個bug是對自己寫的代碼足夠自信,聲明函數沒有返回值,為啥就有返回值了呢?所以確實bug,解決bug

(3)既能實現C++定義的函數,又能實現藍圖定義的函數


b.有返回值
.h文件
.cpp文件
(1)藍圖中不定義函數

(2)藍圖中定義函數

(3)既能實現C++定義的函數,又能實現藍圖定義的函數
